Reasoning Details

 < Module looseEval:security.
 < Prove_Constraint looseEval:host:proj_expr_unique.

Proof completed.
 < Prove_Constraint looseEval:host:proj_expr_is.

Proof completed.
 < Prove_Constraint looseEval: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
 < 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 looseEval: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 looseEval: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''
 < search.

Proof completed.
 < Prove_Constraint looseEval: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 looseEval: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 looseEval: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 looseEval: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 looseEval:host:proj_program_unique.

Proof completed.
 < Prove_Constraint looseEval:host:proj_program_is.

Proof completed.
 < Prove_Constraint looseEval:host:proj_typ_unique.

Proof completed.
 < Prove_Constraint looseEval:host:proj_typ_is.

Proof completed.
 < Prove_Constraint looseEval:host:proj_value_unique.

Proof completed.
 < Prove_Constraint looseEval:host:proj_value_is.

Proof completed.
 < Add_Proj_Rel looseEval:host:is_expr,
   looseEval:host:is_args,
   looseEval:host:is_recFieldExprs.

Proof completed.
 < Prove_Ext_Ind looseEval:host:is_expr,
   looseEval:host:is_args,
   looseEval:host:is_recFieldExprs.

Warning:  No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size
Proof completed.
 < Add_Proj_Rel looseEval:host:is_stmt.

Proof completed.
 < Prove_Ext_Ind looseEval:host:is_stmt.

Warning:  No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size
Subgoal 10:

Variables: Expr S1 Typ Slev
IH : 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)
 < search.

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.
 < Prove looseEval:host:is_args_nilArgs_or_consArgs.

Proof completed.
 < Prove looseEval:host:is_recFieldExprs_nilRecFieldExprs_or_consRecFieldExprs.

Proof completed.
 < Add_Proj_Rel looseEval:host:is_value,
   looseEval:host:is_recFieldVals.

Proof completed.
 < Prove_Ext_Ind looseEval:host:is_value,
   looseEval:host:is_recFieldVals.

Warning:  No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size
Proof completed.
 < Prove looseEval:host:is_value_intVal_or_not.

Proof completed.
 < Prove looseEval:host:is_value_trueVal_or_not.

Proof completed.
 < Prove looseEval:host:is_value_falseVal_or_not.

Proof completed.
 < Prove looseEval:host:is_value_stringVal_or_not.

Proof completed.
 < Prove looseEval:host:is_value_recVal_or_not.

Proof completed.
 < Prove looseEval:host:is_recFieldVals_nil_or_cons.

Proof completed.
 < Prove looseEval:host:is_value_eq_or_not,
         looseEval:host:is_recFieldVals_eq_or_not.

Proof completed.
 < Prove looseEval:host:vars_unique.

Proof completed.
 < Prove looseEval:host:vars_is.

Proof completed.
 < Prove looseEval:host:vars_exist,
         looseEval:host:varsArgs_exist,
         looseEval:host:varsRecFields_exist.

Proof completed.
 < Prove_Constraint looseEval:host:proj_vars.

Proof completed.
 < Prove looseEval:host:typeOf_isTy.

Proof completed.
 < Prove looseEval:host:stmtOK_isCtx.

Subgoal 12:

Variables: FT RestTC Scope Ty X E L
IH : 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'
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 12:

Variables: FT RestTC Scope Ty X E L
IH : 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'
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)
 < apply typeOf_isTy to _ _ _ Ty2.

Subgoal 12:

Variables: FT RestTC Scope Ty X E L
IH : 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'
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
H5 : is_typ Ty
============================
 is_list (is_list (is_pair is_string is_typ)) (((X, Ty)::Scope)::RestTC)
 < case IsET.

Subgoal 12:

Variables: FT RestTC Scope Ty X E L
IH : 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'
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_typ Ty
H6 : is_list (is_pair is_string is_typ) Scope
H7 : 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 looseEval: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 IsS.

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
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
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
============================
 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
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
H5 : length RestTC N'
H6 : 1 + N' = N
============================
 length (((X, Ty)::Scope)::RestTC) N
 < search.

Proof completed.
 < Prove looseEval: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 looseEval: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 looseEval:host:typeOf_unique.

Proof completed.
 < Prove looseEval:host:stmtOK_unique.

Subgoal 12:

Variables: FT ET_B ET_B' RestTC Scope Ty X E L
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'
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'
 < case IsS.

Subgoal 12:

Variables: FT ET_B ET_B' RestTC Scope Ty X E L
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'
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
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
============================
 lookup_all_scopes (((X, Ty)::Scope)::RestTC) ET_B'
 < TyB: case TyB.

Subgoal 12:

Variables: FT RestTC Scope Ty X E L RestTC1 Scope1
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'
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
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
TyB : no_lookup Scope1 X
TyB1 : typeOf FT (Scope1::RestTC1) E Ty
============================
 lookup_all_scopes (((X, Ty)::Scope)::RestTC) (((X, Ty)::Scope1)::RestTC1)
 < apply typeOf_unique to _ _ _ _ TyA2 TyB1 _.

Subgoal 12:

Variables: FT RestTC Scope Ty X E L RestTC1 Scope1
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'
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
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
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 12:

Variables: FT RestTC Scope Ty X E L RestTC1 Scope1
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'
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
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
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 12.1:

Variables: FT RestTC Scope Ty X E L RestTC1 Scope1
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'
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
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
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 12.1:

Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 X1 V
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'
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
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
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 12.1.1:

Variables: FT RestTC Scope E L RestTC1 Scope1 X1 V
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'
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
H1 : is_slev L
H2 : is_typ V
H3 : is_string X1
H4 : is_expr E
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 12.1.2:

Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 X1 V
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'
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
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
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 12.1.2:

Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 X1 V
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'
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
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
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
H5 : lookup Scope1 X1 V
============================
 lookup ((X, Ty)::Scope1) X1 V
 < search.

Subgoal 12.2:

Variables: FT RestTC Scope Ty X E L RestTC1 Scope1
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'
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
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
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 12.2:

Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 X1
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'
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
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
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 12.2:

Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 X1
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'
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
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
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 12.2:

Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 X1
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'
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
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
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
H5 : no_lookup Scope1 X1
============================
 no_lookup ((X, Ty)::Scope1) X1
 < search.

Subgoal 12.3:

Variables: FT RestTC Scope Ty X E L RestTC1 Scope1
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'
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
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
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 looseEval: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 looseEval: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
 < Is: 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
Is : is_string N
Is1 : is_typ R
Is2 : is_slev RetLev
Is3 : is_string RetVar
Is4 : is_value RVVal
Is5 : is_list is_param Params
Is6 : is_stmt Body
============================
 (is_string N /\ is_typ R) /\ is_list is_typ P
 < IsPs: 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
Is : is_string N
Is1 : is_typ R
Is2 : is_slev RetLev
Is3 : is_string RetVar
Is4 : is_value RVVal
Is5 : is_list is_param Params
Is6 : is_stmt Body
IsPs : 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
Is : is_string N
Is1 : is_typ R
Is2 : is_slev RetLev
Is3 : is_string RetVar
Is4 : is_value RVVal
Is5 : is_list is_param Params
Is6 : is_stmt Body
IsPs : is_list (is_pair is_string is_typ) NameTys
H1 : is_list is_typ P
============================
 (is_string N /\ is_typ R) /\ is_list is_typ P
 < search.

Proof completed.
 < Prove looseEval: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 looseEval: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 looseEval:host:evalExpr_isValue,
         looseEval:host:evalStmt_isCtx,
         looseEval:host:evalArgs_isValue,
         looseEval:host:evalRecFields_isValue.

Subgoal 2.15:

Variables: FE O EE1 Scope V X E Ty L
IH_V_E : forall FE EE E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
           is_list is_value V
IH_V_RF : forall FE EE RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
            is_recFieldVals V
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::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V O *
============================
 is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE1)
 < case IsS.

Subgoal 2.15:

Variables: FE O EE1 Scope V X E Ty L
IH_V_E : forall FE EE E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
           is_list is_value V
IH_V_RF : forall FE EE RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
            is_recFieldVals V
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V 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)::EE1)
 < apply IH_V_E to _ _ _ Ev1.

Subgoal 2.15:

Variables: FE O EE1 Scope V X E Ty L
IH_V_E : forall FE EE E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
           is_list is_value V
IH_V_RF : forall FE EE RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
            is_recFieldVals V
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V 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)::EE1)
 < case IsEE.

Subgoal 2.15:

Variables: FE O EE1 Scope V X E Ty L
IH_V_E : forall FE EE E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
           is_list is_value V
IH_V_RF : forall FE EE RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
            is_recFieldVals V
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V 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)) EE1
============================
 is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE1)
 < search.

Proof completed.
 < Prove looseEval:host:evalExpr_isOutput,
         looseEval:host:evalStmt_isOutput,
         looseEval:host:evalArgs_isOutput,
         looseEval:host:evalRecFields_isOutput.

Subgoal 2.15:

Variables: FE O EE1 Scope V X E Ty L
IH_E : forall FE EE E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
         is_list is_value O
IH_RF : forall FE EE RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
          is_list is_value O
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::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V O *
============================
 is_list is_value O
 < case IsS.

Subgoal 2.15:

Variables: FE O EE1 Scope V X E Ty L
IH_E : forall FE EE E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
         is_list is_value O
IH_RF : forall FE EE RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V 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 O EE1 Scope V X E Ty L
IH_E : forall FE EE E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
         is_list is_value O
IH_RF : forall FE EE RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V 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 looseEval: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 looseEval: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 looseEval:host:evalProgram_isOutput.

Proof completed.
 < Prove looseEval:host:evalStmt_names_same.

Subgoal 15:

Variables: FE Scope EE O V X E Ty L
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''
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)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
============================
 exists Scope' EE'', ((X, V)::Scope)::EE = Scope'::EE'' /\ names_same EE EE''
 < case IsS.

Subgoal 15:

Variables: FE Scope EE O V X E Ty L
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''
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
============================
 exists Scope' EE'', ((X, V)::Scope)::EE = Scope'::EE'' /\ names_same EE EE''
 < case IsEE.

Subgoal 15:

Variables: FE Scope EE O V X E Ty L
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''
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Ev : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE
============================
 exists Scope' EE'', ((X, V)::Scope)::EE = Scope'::EE'' /\ names_same EE EE''
 < exists (X, V)::Scope,
   EE.

Subgoal 15:

Variables: FE Scope EE O V X E Ty L
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''
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Ev : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE
============================
 ((X, V)::Scope)::EE = ((X, V)::Scope)::EE /\ names_same EE EE
 < split.

Subgoal 15.1:

Variables: FE Scope EE O V X E Ty L
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''
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Ev : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE
============================
 ((X, V)::Scope)::EE = ((X, V)::Scope)::EE
 < search.

Subgoal 15.2:

Variables: FE Scope EE O V X E Ty L
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''
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Ev : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE
============================
 names_same EE EE
 < backchain names_same_reflexive.

Proof completed.
 < Add_Ext_Size looseEval:host:evalExpr,
   looseEval:host:evalArgs,
   looseEval:host:evalRecFields,
   looseEval:host:evalStmt.

Proof completed.
 < Add_Proj_Rel looseEval:host:evalExpr,
   looseEval:host:evalArgs,
   looseEval:host:evalRecFields,
   looseEval:host:evalStmt.

Proof completed.
 < Prove looseEval:host:evalExpr_rel,
         looseEval:host:evalStmt_newNameScopes_output,
         looseEval:host:evalStmt_newNameScopes,
         looseEval:host:evalArgs_rel,
         looseEval:host:evalRecFields_rel.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty L
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
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)::Scope)::EE_A) 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 O_A *
============================
 O_A = O_B
 < NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty L
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
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)::Scope)::EE_A) 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 O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 O_A = O_B
 < Is: case IsS.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty L
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) 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 O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
============================
 O_A = O_B
 < Vars: apply vars_exist to Is3.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty L V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) 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 O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
============================
 O_A = O_B
 < EvB: case EvB.

Subgoal 2.15:

Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty L V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
============================
 O_A = O_B
 < apply IH_E to _ _ _ _ EvA1 EvB Vars _.

Subgoal 2.15.1:

Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty L V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
============================
 forall X V,
   mem X V1 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
 < intros M L.

Subgoal 2.15.1:

Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty L V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
============================
 lookupScopes X1 (Scope::EE_A) V3
 < apply vars_is to _ Vars.

Subgoal 2.15.1:

Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty L V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
============================
 lookupScopes X1 (Scope::EE_A) V3
 < apply mem_is_string to _ M.

Subgoal 2.15.1:

Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty L V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X1
============================
 lookupScopes X1 (Scope::EE_A) V3
 < apply newNameScopes_lookupScopes to _ _ NNS' L.

Subgoal 2.15.1:

Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty L V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X1
H3 : lookupScopes X1 (Scope::EE_A) V3
============================
 lookupScopes X1 (Scope::EE_A) V3
 < search.

Subgoal 2.15:

Variables: FE EE_A EE_B O_B N Len Scope X E Ty L V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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, V2)::Scope)::EE_A) O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V2 O_B *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
============================
 O_B = O_B
 < search.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty L
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
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)::Scope)::EE_A) 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 O_A *
============================
 newNameScopes N Len (((X, V)::Scope)::EE_A) EE_B'
 < NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).

Subgoal 3.15:

Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty L
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
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)::Scope)::EE_A) 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 O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 newNameScopes N Len (((X, V)::Scope)::EE_A) EE_B'
 < Is: case IsS.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty L
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) 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 O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
============================
 newNameScopes N Len (((X, V)::Scope)::EE_A) EE_B'
 < Vars: apply vars_exist to Is3.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty L V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) 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 O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
============================
 newNameScopes N Len (((X, V)::Scope)::EE_A) EE_B'
 < EvB: case EvB.

Subgoal 3.15:

Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty L V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
============================
 newNameScopes N Len (((X, V)::Scope)::EE_A) (((X, V2)::Scope)::EE_B)
 < apply IH_E to _ _ _ _ EvA1 EvB Vars _.

Subgoal 3.15.1:

Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty L V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
============================
 forall X V,
   mem X V1 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
 < intros M L.

Subgoal 3.15.1:

Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty L V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
============================
 lookupScopes X1 (Scope::EE_A) V3
 < apply vars_is to _ Vars.

Subgoal 3.15.1:

Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty L V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
============================
 lookupScopes X1 (Scope::EE_A) V3
 < apply mem_is_string to _ M.

Subgoal 3.15.1:

Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty L V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X1
============================
 lookupScopes X1 (Scope::EE_A) V3
 < apply newNameScopes_lookupScopes to _ _ NNS' L.

Subgoal 3.15.1:

Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty L V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X1
H3 : lookupScopes X1 (Scope::EE_A) V3
============================
 lookupScopes X1 (Scope::EE_A) V3
 < search.

Subgoal 3.15:

Variables: FE EE_A EE_B O_B N Len Scope X E Ty L V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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, V2)::Scope)::EE_A) O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V2 O_B *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
============================
 newNameScopes N Len (((X, V2)::Scope)::EE_A) (((X, V2)::Scope)::EE_B)
 < search.

Proof completed.
 < Prove looseEval:host:evalExpr_rel_exists_ES,
         looseEval:host:evalStmt_newNameScopes_exists_ES,
         looseEval:host:evalArgs_rel_exists_ES,
         looseEval:host:evalRecFields_rel_exists_ES.

Subgoal 2.15:

Variables: FE EE_A EE_B O N Len Scope ES N2 V X E Ty L
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
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)::Scope)::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V 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 V X E Ty L
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
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)::Scope)::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V 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
 < Is: case IsS.

Subgoal 2.15:

Variables: FE EE_A EE_B O N Len Scope ES N2 V X E Ty L
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V O N2 *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
 < Vars: apply vars_exist to Is3.

Subgoal 2.15:

Variables: FE EE_A EE_B O N Len Scope ES N2 V X E Ty L V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (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)::Scope)::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V O N2 *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
 < EvB: case EvB.

Subgoal 2.15:

Variables: FE EE_A EE_B O N Len Scope ES N2 V X E Ty L V1 N1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V O N2 *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : 1 + N1 = ES
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) E V O N1 *
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
 < apply IH_E to _ _ _ _ EvB2 Vars _ with
     EE_A = Scope::EE_A.

Subgoal 2.15.1:

Variables: FE EE_A EE_B O N Len Scope ES N2 V X E Ty L V1 N1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V O N2 *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : 1 + N1 = ES
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) E V O N1 *
============================
 forall X V2,
   mem X V1 -> lookupScopes X (Scope::EE_B) V2 -> lookupScopes X (Scope::EE_A) V2
 < intros M L.

Subgoal 2.15.1:

Variables: FE EE_A EE_B O N Len Scope ES N2 V X E Ty L V1 N1 X1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V O N2 *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : 1 + N1 = ES
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) E V O N1 *
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V2
============================
 lookupScopes X1 (Scope::EE_A) V2
 < apply vars_is to _ Vars.

Subgoal 2.15.1:

Variables: FE EE_A EE_B O N Len Scope ES N2 V X E Ty L V1 N1 X1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V O N2 *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : 1 + N1 = ES
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) E V O N1 *
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V2
H1 : is_list is_string V1
============================
 lookupScopes X1 (Scope::EE_A) V2
 < apply mem_is_string to _ M.

Subgoal 2.15.1:

Variables: FE EE_A EE_B O N Len Scope ES N2 V X E Ty L V1 N1 X1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V O N2 *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : 1 + N1 = ES
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) E V O N1 *
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V2
H1 : is_list is_string V1
H2 : is_string X1
============================
 lookupScopes X1 (Scope::EE_A) V2
 < apply newNameScopes_lookupScopes to _ _ NNS' L.

Subgoal 2.15.1:

Variables: FE EE_A EE_B O N Len Scope ES N2 V X E Ty L V1 N1 X1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V O N2 *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : 1 + N1 = ES
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) E V O N1 *
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V2
H1 : is_list is_string V1
H2 : is_string X1
H3 : lookupScopes X1 (Scope::EE_A) V2
============================
 lookupScopes X1 (Scope::EE_A) V2
 < search.

Subgoal 2.15:

Variables: FE EE_A EE_B O N Len Scope ES N2 V X E Ty L V1 N1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V O N2 *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_slev L
Is1 : is_typ Ty
Is2 : is_string X
Is3 : is_expr E
Vars : vars E V1
EvB : 1 + N1 = ES
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) E V O N1 *
H1 : <evalExpr {ES}> FE (Scope::EE_A) E V O N2
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
 < search.

Proof completed.
 < Prove looseEval:host:evalExpr_scopes_same,
         looseEval:host:evalStmt_scopes_same,
         looseEval:host:evalStmt_scopes_same_ctx,
         looseEval:host:evalArgs_scopes_same,
         looseEval:host:evalRecFields_scopes_same.

Subgoal 2.15:

Variables: FE OA EE_B EE_B' OB EE Scope V X E Ty L
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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)
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same (Scope::EE) EE_B
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) OA @
EvB : evalStmt FE EE_B (secdecl L Ty X E) EE_B' OB
EvA1 : evalExpr FE (Scope::EE) E V OA *
============================
 OA = OB
 < case IsS.

Subgoal 2.15:

Variables: FE OA EE_B EE_B' OB EE Scope V X E Ty L
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same (Scope::EE) EE_B
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) OA @
EvB : evalStmt FE EE_B (secdecl L Ty X E) EE_B' OB
EvA1 : evalExpr FE (Scope::EE) E V OA *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
============================
 OA = OB
 < EvB: case EvB.

Subgoal 2.15:

Variables: FE OA OB EE Scope V X E Ty L EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
SS : scopes_same (Scope::EE) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) OA @
EvA1 : evalExpr FE (Scope::EE) E V OA *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ SS EvA1 EvB.

Subgoal 2.15:

Variables: FE OB EE Scope X E Ty L EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
SS : scopes_same (Scope::EE) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
============================
 OB = OB
 < search.

Subgoal 3.15:

Variables: FE OA EE_B EE_B' OB EE Scope V X E Ty L
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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)
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same (Scope::EE) EE_B
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) OA @
EvB : evalStmt FE EE_B (secdecl L Ty X E) EE_B' OB
EvA1 : evalExpr FE (Scope::EE) E V OA *
============================
 scopes_same (((X, V)::Scope)::EE) EE_B'
 < case IsS.

Subgoal 3.15:

Variables: FE OA EE_B EE_B' OB EE Scope V X E Ty L
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same (Scope::EE) EE_B
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) OA @
EvB : evalStmt FE EE_B (secdecl L Ty X E) EE_B' OB
EvA1 : evalExpr FE (Scope::EE) E V OA *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
============================
 scopes_same (((X, V)::Scope)::EE) EE_B'
 < EvB: case EvB.

Subgoal 3.15:

Variables: FE OA OB EE Scope V X E Ty L EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
SS : scopes_same (Scope::EE) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) OA @
EvA1 : evalExpr FE (Scope::EE) E V OA *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
============================
 scopes_same (((X, V)::Scope)::EE) (((X, V1)::Scope1)::EE1)
 < apply IH_E to _ _ _ _ SS EvA1 EvB.

Subgoal 3.15:

Variables: FE OB EE Scope X E Ty L EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
SS : scopes_same (Scope::EE) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
============================
 scopes_same (((X, V1)::Scope)::EE) (((X, V1)::Scope1)::EE1)
 < R: case SS.

Subgoal 3.15:

Variables: FE OB EE Scope X E Ty L EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
R : forall X V, lookup Scope X V -> lookup Scope1 X V
R1 : forall X V, lookup Scope1 X V -> lookup Scope X V
R2 : scopes_same EE EE1
============================
 scopes_same (((X, V1)::Scope)::EE) (((X, V1)::Scope1)::EE1)
 < unfold .

Subgoal 3.15.1:

Variables: FE OB EE Scope X E Ty L EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
R : forall X V, lookup Scope X V -> lookup Scope1 X V
R1 : forall X V, lookup Scope1 X V -> lookup Scope X V
R2 : scopes_same EE EE1
============================
 forall X1 V, lookup ((X, V1)::Scope) X1 V -> lookup ((X, V1)::Scope1) X1 V
 < intros L.

Subgoal 3.15.1:

Variables: FE OB EE Scope X E Ty L EE1 Scope1 V1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
R : forall X V, lookup Scope X V -> lookup Scope1 X V
R1 : forall X V, lookup Scope1 X V -> lookup Scope X V
R2 : scopes_same EE EE1
L : lookup ((X, V1)::Scope) X1 V2
============================
 lookup ((X, V1)::Scope1) X1 V2
 < L: case L.

Subgoal 3.15.1.1:

Variables: FE OB EE Scope E Ty L EE1 Scope1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X1 E) (((X1, V2)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V2 OB *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X1
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V2 OB
R : forall X V, lookup Scope X V -> lookup Scope1 X V
R1 : forall X V, lookup Scope1 X V -> lookup Scope X V
R2 : scopes_same EE EE1
============================
 lookup ((X1, V2)::Scope1) X1 V2
 < search.

Subgoal 3.15.1.2:

Variables: FE OB EE Scope X E Ty L EE1 Scope1 V1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
R : forall X V, lookup Scope X V -> lookup Scope1 X V
R1 : forall X V, lookup Scope1 X V -> lookup Scope X V
R2 : scopes_same EE EE1
L : X = X1 -> false
L1 : lookup Scope X1 V2
============================
 lookup ((X, V1)::Scope1) X1 V2
 < apply R to L1.

Subgoal 3.15.1.2:

Variables: FE OB EE Scope X E Ty L EE1 Scope1 V1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
R : forall X V, lookup Scope X V -> lookup Scope1 X V
R1 : forall X V, lookup Scope1 X V -> lookup Scope X V
R2 : scopes_same EE EE1
L : X = X1 -> false
L1 : lookup Scope X1 V2
H5 : lookup Scope1 X1 V2
============================
 lookup ((X, V1)::Scope1) X1 V2
 < search.

Subgoal 3.15.2:

Variables: FE OB EE Scope X E Ty L EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
R : forall X V, lookup Scope X V -> lookup Scope1 X V
R1 : forall X V, lookup Scope1 X V -> lookup Scope X V
R2 : scopes_same EE EE1
============================
 forall X1 V, lookup ((X, V1)::Scope1) X1 V -> lookup ((X, V1)::Scope) X1 V
 < intros L.

Subgoal 3.15.2:

Variables: FE OB EE Scope X E Ty L EE1 Scope1 V1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
R : forall X V, lookup Scope X V -> lookup Scope1 X V
R1 : forall X V, lookup Scope1 X V -> lookup Scope X V
R2 : scopes_same EE EE1
L : lookup ((X, V1)::Scope1) X1 V2
============================
 lookup ((X, V1)::Scope) X1 V2
 < L: case L.

Subgoal 3.15.2.1:

Variables: FE OB EE Scope E Ty L EE1 Scope1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X1 E) (((X1, V2)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V2 OB *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X1
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V2 OB
R : forall X V, lookup Scope X V -> lookup Scope1 X V
R1 : forall X V, lookup Scope1 X V -> lookup Scope X V
R2 : scopes_same EE EE1
============================
 lookup ((X1, V2)::Scope) X1 V2
 < search.

Subgoal 3.15.2.2:

Variables: FE OB EE Scope X E Ty L EE1 Scope1 V1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
R : forall X V, lookup Scope X V -> lookup Scope1 X V
R1 : forall X V, lookup Scope1 X V -> lookup Scope X V
R2 : scopes_same EE EE1
L : X = X1 -> false
L1 : lookup Scope1 X1 V2
============================
 lookup ((X, V1)::Scope) X1 V2
 < apply R1 to L1.

Subgoal 3.15.2.2:

Variables: FE OB EE Scope X E Ty L EE1 Scope1 V1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
R : forall X V, lookup Scope X V -> lookup Scope1 X V
R1 : forall X V, lookup Scope1 X V -> lookup Scope X V
R2 : scopes_same EE EE1
L : X = X1 -> false
L1 : lookup Scope1 X1 V2
H5 : lookup Scope X1 V2
============================
 lookup ((X, V1)::Scope) X1 V2
 < search.

Subgoal 3.15.3:

Variables: FE OB EE Scope X E Ty L EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
R : forall X V, lookup Scope X V -> lookup Scope1 X V
R1 : forall X V, lookup Scope1 X V -> lookup Scope X V
R2 : scopes_same EE EE1
============================
 scopes_same EE EE1
 < search.

Proof completed.
 < Prove looseEval:host:evalExpr_scopes_same_exists,
         looseEval:host:evalStmt_scopes_same_exists,
         looseEval:host:evalArgs_scopes_same_exists,
         looseEval:host:evalRecFields_scopes_same_exists.

Subgoal 2.15:

Variables: FE O EE_B EE Scope V X E Ty L
IH_E : forall E FE EE_A V O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V O * -> evalExpr FE EE_B E V O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V O * -> evalRecFields FE EE_B RF V O
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)
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same (Scope::EE) EE_B
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) O @
EvA1 : evalExpr FE (Scope::EE) E V O *
============================
 exists EE_B', evalStmt FE EE_B (secdecl L Ty X E) EE_B' O
 < case IsS.

Subgoal 2.15:

Variables: FE O EE_B EE Scope V X E Ty L
IH_E : forall E FE EE_A V O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V O * -> evalExpr FE EE_B E V O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same (Scope::EE) EE_B
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) O @
EvA1 : evalExpr FE (Scope::EE) E V 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
 < apply IH_E to _ _ _ _ SS EvA1.

Subgoal 2.15:

Variables: FE O EE_B EE Scope V X E Ty L
IH_E : forall E FE EE_A V O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V O * -> evalExpr FE EE_B E V O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same (Scope::EE) EE_B
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) O @
EvA1 : evalExpr FE (Scope::EE) E V O *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
H5 : evalExpr FE EE_B E V O
============================
 exists EE_B', evalStmt FE EE_B (secdecl L Ty X E) EE_B' O
 < case SS.

Subgoal 2.15:

Variables: FE O EE Scope V X E Ty L BRest B
IH_E : forall E FE EE_A V O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V O * -> evalExpr FE EE_B E V O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (B::BRest)
EvA : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) O @
EvA1 : evalExpr FE (Scope::EE) E V O *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
H5 : evalExpr FE (B::BRest) E V O
H6 : forall X V, lookup Scope X V -> lookup B X V
H7 : forall X V, lookup B X V -> lookup Scope X V
H8 : scopes_same EE BRest
============================
 exists EE_B', evalStmt FE (B::BRest) (secdecl L Ty X E) EE_B' O
 < search.

Proof completed.
 < Prove_Constraint looseEval:host:proj_evalExpr_exists.

Proof completed.
 < Prove_Constraint looseEval:host:proj_evalStmt_exists.

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
 < case Ev.

Variables: Names FE O E X Ty L EE1 Scope V
Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E
Names : names (Scope::EE1) 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)) (Scope::EE1)
H1 : evalExpr FE (Scope::EE1) E V O
============================
 exists EE'', evalStmt FE (Scope::EE1) (declare Ty X E) EE'' O
 < search.

Proof completed.
 < Prove_Constraint looseEval:host:proj_evalStmt_rel.

Variables: Names FE EE EE' O EE_P O_P 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
Ev_P : evalStmt FE EE (declare Ty X E) EE_P O_P
============================
 scopes_same EE' EE_P
 < Ev: case Ev.

Variables: Names FE O EE_P O_P E X Ty L EE1 Scope V
Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E
Names : names (Scope::EE1) 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)) (Scope::EE1)
Ev_P : evalStmt FE (Scope::EE1) (declare Ty X E) EE_P O_P
Ev : evalExpr FE (Scope::EE1) E V O
============================
 scopes_same (((X, V)::Scope)::EE1) EE_P
 < Ev_P: case Ev_P.

Variables: Names FE O O_P E X Ty L EE1 Scope V V1
Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E
Names : names (Scope::EE1) 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)) (Scope::EE1)
Ev : evalExpr FE (Scope::EE1) E V O
Ev_P : evalExpr FE (Scope::EE1) E V1 O_P
============================
 scopes_same (((X, V)::Scope)::EE1) (((X, V1)::Scope)::EE1)
 < case IsS.

Variables: Names FE O O_P E X Ty L EE1 Scope V V1
Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E
Names : names (Scope::EE1) 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)) (Scope::EE1)
Ev : evalExpr FE (Scope::EE1) E V O
Ev_P : evalExpr FE (Scope::EE1) E V1 O_P
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
============================
 scopes_same (((X, V)::Scope)::EE1) (((X, V1)::Scope)::EE1)
 < apply evalExpr_unique to _ _ _ Ev_P Ev.

Variables: Names FE O E X Ty L EE1 Scope V
Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E
Names : names (Scope::EE1) 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)) (Scope::EE1)
Ev : evalExpr FE (Scope::EE1) E V O
Ev_P : evalExpr FE (Scope::EE1) E V O
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
============================
 scopes_same (((X, V)::Scope)::EE1) (((X, V)::Scope)::EE1)
 < apply evalExpr_isValue to _ _ _ Ev.

Variables: Names FE O E X Ty L EE1 Scope V
Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E
Names : names (Scope::EE1) 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)) (Scope::EE1)
Ev : evalExpr FE (Scope::EE1) E V O
Ev_P : evalExpr FE (Scope::EE1) E V 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)::EE1) (((X, V)::Scope)::EE1)
 < case IsEE.

Variables: Names FE O E X Ty L EE1 Scope V
Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E
Names : names (Scope::EE1) 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
Ev : evalExpr FE (Scope::EE1) E V O
Ev_P : evalExpr FE (Scope::EE1) E V 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)) EE1
============================
 scopes_same (((X, V)::Scope)::EE1) (((X, V)::Scope)::EE1)
 < backchain scopes_same_reflexive.

Proof completed.
 < Prove_Ext_Ind looseEval:host:evalExpr,
   looseEval:host:evalArgs,
   looseEval:host:evalRecFields,
   looseEval:host:evalStmt.

Subgoal 4.15:

Variables: N FE O N2 EE1 Scope V X E Ty L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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)) (Scope::EE1)
IsS : is_stmt (secdecl L Ty X E)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE (Scope::EE1) E V O N2 **
============================
 <evalStmt {P}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O
 < case IsS.

Subgoal 4.15:

Variables: N FE O N2 EE1 Scope V X E Ty L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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)) (Scope::EE1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE (Scope::EE1) E V O N2 **
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
============================
 <evalStmt {P}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O
 < apply ext_size_is_int_evalExpr to R2.

Subgoal 4.15:

Variables: N FE O N2 EE1 Scope V X E Ty L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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)) (Scope::EE1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE (Scope::EE1) E V 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 (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O
 < L: apply lt_plus_one to R1 _.

Subgoal 4.15:

Variables: N FE O N2 EE1 Scope V X E Ty L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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)) (Scope::EE1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE (Scope::EE1) E V O N2 **
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
H5 : is_integer N2
L : N2 < N
============================
 <evalStmt {P}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O
 < apply ext_size_pos_evalExpr to R2.

Subgoal 4.15:

Variables: N FE O N2 EE1 Scope V X E Ty L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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)) (Scope::EE1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE (Scope::EE1) E V O N2 **
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
H5 : is_integer N2
L : N2 < N
H6 : 0 <= N2
============================
 <evalStmt {P}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O
 < Acc: case Acc.

Subgoal 4.15:

Variables: N FE O N2 EE1 Scope V X E Ty L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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)) (Scope::EE1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE (Scope::EE1) E V O N2 **
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
H5 : is_integer N2
L : N2 < N
H6 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalStmt {P}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O
 < A: apply Acc to _ L.

Subgoal 4.15:

Variables: N FE O N2 EE1 Scope V X E Ty L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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)) (Scope::EE1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE (Scope::EE1) E V O N2 **
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
H5 : is_integer N2
L : N2 < N
H6 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
============================
 <evalStmt {P}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O
 < apply IH to R2 A _ _ _.

Subgoal 4.15:

Variables: N FE O N2 EE1 Scope V X E Ty L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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)) (Scope::EE1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE (Scope::EE1) E V O N2 **
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
H5 : is_integer N2
L : N2 < N
H6 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
H7 : <evalExpr {P}> FE (Scope::EE1) E V O
============================
 <evalStmt {P}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O
 < apply names_exists to IsEE.

Subgoal 4.15:

Variables: N FE O N2 EE1 Scope V X E Ty L N1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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)) (Scope::EE1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE (Scope::EE1) E V O N2 **
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
H5 : is_integer N2
L : N2 < N
H6 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
H7 : <evalExpr {P}> FE (Scope::EE1) E V O
H8 : names (Scope::EE1) N1
============================
 <evalStmt {P}> FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O
 < search.

Proof completed.
 < Prove looseEval: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 looseEval: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 looseEval: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 looseEval: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
 < 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
IsF : is_fun (secfun NB RetTy RetLev RB VB Params BB)
GFEIA : getFunEvalInfo (secfun NB RetTy RetLev RB VB Params BB) NB RB VB PA BB @
GFEIA1 : paramNames Params PA
GFEIB : paramNames Params PB
============================
 (((NB = NB /\ RB = RB) /\ VB = VB) /\ PA = PB) /\ BB = BB
 < case IsF.

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
GFEIB : 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
============================
 (((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
GFEIB : 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
============================
 (((NB = NB /\ RB = RB) /\ VB = VB) /\ PB = PB) /\ BB = BB
 < search.

Proof completed.
 < Prove_Constraint looseEval: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 looseEval: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 looseEval:host:evalProgram_unique.

Proof completed.
 < Prove_Constraint looseEval:host:proj_evalProgram.

Proof completed.
 < Prove_Constraint looseEval:host:proj_evalProgram_back.

Proof completed.
 < Prove looseEval:host:evalExpr_typePres,
         looseEval:host:evalStmt_typePres,
         looseEval:host:evalArgs_typePres,
         looseEval:host:evalRecFields_typePres.

Subgoal 2.15:

Variables: FT ET ET' FE O EE1 Scope V X E Ty L
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
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)) (Scope::EE1)
Ty : stmtOK FT ET (secdecl L Ty X E) ET'
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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 (Scope::EE1)
Ev1 : evalExpr FE (Scope::EE1) E V O *
============================
 related_all_scopes ET' (((X, V)::Scope)::EE1)
 < case IsS.

Subgoal 2.15:

Variables: FT ET ET' FE O EE1 Scope V X E Ty L
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
Ty : stmtOK FT ET (secdecl L Ty X E) ET'
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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 (Scope::EE1)
Ev1 : evalExpr FE (Scope::EE1) E V O *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
============================
 related_all_scopes ET' (((X, V)::Scope)::EE1)
 < Ty: case Ty.

Subgoal 2.15:

Variables: FT FE O EE1 Scope V X E Ty L RestTC Scope1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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) (Scope::EE1)
Ev1 : evalExpr FE (Scope::EE1) E V 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)::EE1)
 < apply IH_E to _ _ _ _ _ Ty1 Ev1 _ _.

Subgoal 2.15:

Variables: FT FE O EE1 Scope V X E Ty L RestTC Scope1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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) (Scope::EE1)
Ev1 : evalExpr FE (Scope::EE1) E V 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)::EE1)
 < R: case Ctxs.

Subgoal 2.15:

Variables: FT FE O EE1 Scope V X E Ty L RestTC Scope1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
============================
 related_all_scopes (((X, Ty)::Scope1)::RestTC) (((X, V)::Scope)::EE1)
 < unfold .

Subgoal 2.15.1:

Variables: FT FE O EE1 Scope V X E Ty L RestTC Scope1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
============================
 forall X1 T,
   lookup ((X, Ty)::Scope1) X1 T -> exists V1,
     lookup ((X, V)::Scope) X1 V1 /\ valueType V1 T
 < intros L.

Subgoal 2.15.1:

Variables: FT FE O EE1 Scope V X E Ty L RestTC Scope1 X1 T
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
L : lookup ((X, Ty)::Scope1) X1 T
============================
 exists V1, lookup ((X, V)::Scope) X1 V1 /\ valueType V1 T
 < L: case L.

Subgoal 2.15.1.1:

Variables: FT FE O EE1 Scope V E L RestTC Scope1 X1 T
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L T X1 E) (((X1, V)::Scope)::EE1) 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'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
============================
 exists V1, lookup ((X1, V)::Scope) X1 V1 /\ valueType V1 T
 < search.

Subgoal 2.15.1.2:

Variables: FT FE O EE1 Scope V X E Ty L RestTC Scope1 X1 T
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
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 2.15.1.2:

Variables: FT FE O EE1 Scope V X E Ty L RestTC Scope1 X1 T V1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
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
 < search.

Subgoal 2.15.2:

Variables: FT FE O EE1 Scope V X E Ty L RestTC Scope1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
============================
 forall X1, no_lookup ((X, Ty)::Scope1) X1 -> no_lookup ((X, V)::Scope) X1
 < intros NL.

Subgoal 2.15.2:

Variables: FT FE O EE1 Scope V X E Ty L RestTC Scope1 X1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
NL : no_lookup ((X, Ty)::Scope1) X1
============================
 no_lookup ((X, V)::Scope) X1
 < NL: case NL.

Subgoal 2.15.2:

Variables: FT FE O EE1 Scope V X E Ty L RestTC Scope1 X1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
NL : X = X1 -> false
NL1 : no_lookup Scope1 X1
============================
 no_lookup ((X, V)::Scope) X1
 < apply R1 to NL1.

Subgoal 2.15.2:

Variables: FT FE O EE1 Scope V X E Ty L RestTC Scope1 X1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
NL : X = X1 -> false
NL1 : no_lookup Scope1 X1
H6 : no_lookup Scope X1
============================
 no_lookup ((X, V)::Scope) X1
 < search.

Subgoal 2.15.3:

Variables: FT FE O EE1 Scope V X E Ty L RestTC Scope1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
         evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
         valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
          valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) 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'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
============================
 related_all_scopes RestTC EE1
 < search.

Proof completed.
 < Prove looseEval: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 looseEval: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 looseEval:host:evalExpr_output_forms,
         looseEval:host:evalStmt_output_forms,
         looseEval:host:evalArgs_output_forms,
         looseEval:host:evalRecFields_output_forms.

Subgoal 2.15:

Variables: FE O EE1 Scope V X E Ty L
IH_E : forall E FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields O * ->
          output_forms O
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::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V O *
============================
 output_forms O
 < case IsS.

Subgoal 2.15:

Variables: FE O EE1 Scope V X E Ty L
IH_E : forall E FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V 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 O EE1 Scope V X E Ty L
IH_E : forall E FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V 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 looseEval:host:evalProgram_output_forms.

Proof completed.
 < Prove looseEval: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 looseEval: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 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.18:

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.18:

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.19:

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.19:

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.19:

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.20:

Variables: SF SG PC 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) public @
Lev1 : level SF SG PC Msg public *
============================
 is_slev public
 < case IsE.

Subgoal 1.20:

Variables: SF SG PC 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) public @
Lev1 : level SF SG PC Msg public *
H1 : is_expr Msg
H2 : is_typ Ty
============================
 is_slev public
 < apply IH_E to _ _ _ Lev1.

Subgoal 1.20:

Variables: SF SG PC 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) public @
Lev1 : level SF SG PC Msg public *
H1 : is_expr Msg
H2 : is_typ Ty
H3 : is_slev public
============================
 is_slev public
 < search.

Subgoal 1.21:

Variables: SF SG PC L 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 : |{expr}- <unknown I expr> ~~> E_P
Lev2 : level SF SG PC E_P L *
============================
 is_slev L
 < apply proj_expr_is to Lev1 _.

Subgoal 1.21:

Variables: SF SG PC L 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 : |{expr}- <unknown I expr> ~~> E_P
Lev2 : level SF SG PC E_P L *
H1 : is_expr E_P
============================
 is_slev L
 < apply IH_E to _ _ _ Lev2.

Subgoal 1.21:

Variables: SF SG PC L 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 : |{expr}- <unknown I expr> ~~> E_P
Lev2 : level SF SG PC E_P L *
H1 : is_expr E_P
H2 : 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 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.18:

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.18:

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.18:

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.19:

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.19:

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.19:

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.19:

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.20:

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
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) public @
LevB : level SF SG PC (errorExpr Msg Ty) LB
LevA1 : level SF SG PC Msg public *
============================
 public = LB
 < case IsE.

Subgoal 1.20:

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) public @
LevB : level SF SG PC (errorExpr Msg Ty) LB
LevA1 : level SF SG PC Msg public *
H1 : is_expr Msg
H2 : is_typ Ty
============================
 public = LB
 < LevB: case LevB.

Subgoal 1.20:

Variables: SF SG PC 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) public @
LevA1 : level SF SG PC Msg public *
H1 : is_expr Msg
H2 : is_typ Ty
LevB : level SF SG PC Msg public
============================
 public = public
 < apply IH_E to _ _ _ _ LevA1 LevB.

Subgoal 1.20:

Variables: SF SG PC 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) public @
LevA1 : level SF SG PC Msg public *
H1 : is_expr Msg
H2 : is_typ Ty
LevB : level SF SG PC Msg public
============================
 public = public
 < search.

Subgoal 1.21:

Variables: SF SG PC LA LB 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 : |{expr}- <unknown I expr> ~~> E_P
LevA2 : level SF SG PC E_P LA *
============================
 LA = LB
 < apply proj_expr_is to LevA1 _.

Subgoal 1.21:

Variables: SF SG PC LA LB 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 : |{expr}- <unknown I expr> ~~> E_P
LevA2 : level SF SG PC E_P LA *
H1 : is_expr E_P
============================
 LA = LB
 < LevB: case LevB.

Subgoal 1.21:

Variables: SF SG PC LA LB E_P 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 : |{expr}- <unknown I expr> ~~> E_P
LevA2 : level SF SG PC E_P LA *
H1 : is_expr E_P
LevB : |{expr}- <unknown I expr> ~~> E_P1
LevB1 : level SF SG PC E_P1 LB
============================
 LA = LB
 < apply proj_expr_unique to LevA1 LevB _.

Subgoal 1.21:

Variables: SF SG PC LA LB 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 : |{expr}- <unknown I expr> ~~> E_P1
LevA2 : level SF SG PC E_P1 LA *
H1 : is_expr E_P1
LevB : |{expr}- <unknown I expr> ~~> E_P1
LevB1 : level SF SG PC E_P1 LB
============================
 LA = LB
 < apply IH_E to _ _ _ _ LevA2 LevB1.

Subgoal 1.21:

Variables: SF SG PC LB 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 : |{expr}- <unknown I expr> ~~> E_P1
LevA2 : level SF SG PC E_P1 LB *
H1 : is_expr E_P1
LevB : |{expr}- <unknown I expr> ~~> E_P1
LevB1 : 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.
 < Define secFuns : (list (pair (string) (pair slev (list slev)))) -> prop by
   secFuns SF :=
     forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs.


 < Extensible_Theorem
      public_vars : forall E SF SG PC V X,
         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 ->
         SecFuns : secFuns SF ->
         Lev : level SF SG PC E public ->
         Vars : vars E V ->
         Mem : mem X V ->
         lookupScopes X SG public
      on Lev as IH_Ealso
   
      public_varsArgs : forall A SF SG PC Ls V X,
         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 ->
         SecFuns : secFuns SF ->
         Lev : levelArgs SF SG PC A Ls ->
         AP : allPublic Ls ->
         Vars : varsArgs A V ->
         Mem : mem X V ->
         lookupScopes X SG public
      on Lev as IH_A,
      public_varsRecFields : forall RF SF SG PC V X,
         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 ->
         SecFuns : secFuns SF ->
         Lev : levelRecFields SF SG PC RF public ->
         Vars : varsRecFields RF V ->
         Mem : mem X V ->
         lookupScopes X SG public
      on Lev as IH_RF.

Subgoal 1.1:

Variables: SF SG PC V X I
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (num I) public @
Vars : vars (num I) V
Mem : mem X V
============================
 lookupScopes X SG public
 < case Vars.

Subgoal 1.1:

Variables: SF SG PC X I
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (num I) public @
Mem : mem X []
============================
 lookupScopes X SG public
 < case Mem.

Subgoal 1.2:

Variables: SF SG PC V X L1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (plus E1 E2) public @
Vars : vars (plus E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
============================
 lookupScopes X SG public
 < case IsE.

Subgoal 1.2:

Variables: SF SG PC V X L1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (plus E1 E2) public @
Vars : vars (plus E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 1.2:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (plus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev1.

Subgoal 1.2:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (plus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev2.

Subgoal 1.2:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (plus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
H4 : is_slev L2
============================
 lookupScopes X SG public
 < apply join_public to _ _ Lev3.

Subgoal 1.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (plus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
============================
 lookupScopes X SG public
 < Or: apply mem_append to Mem Vars2.

Subgoal 1.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (plus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
Or : mem X V2 \/ mem X V3
============================
 lookupScopes X SG public
 < M: case Or.

Subgoal 1.2.1:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (plus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V2
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev1 Vars M.

Subgoal 1.2.1:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (plus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V2
H5 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.2.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (plus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V3
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev2 Vars1 M.

Subgoal 1.2.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (plus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V3
H5 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.3:

Variables: SF SG PC V X L1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (minus E1 E2) public @
Vars : vars (minus E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
============================
 lookupScopes X SG public
 < case IsE.

Subgoal 1.3:

Variables: SF SG PC V X L1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (minus E1 E2) public @
Vars : vars (minus E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 1.3:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (minus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev1.

Subgoal 1.3:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (minus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev2.

Subgoal 1.3:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (minus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
H4 : is_slev L2
============================
 lookupScopes X SG public
 < apply join_public to _ _ Lev3.

Subgoal 1.3:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (minus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
============================
 lookupScopes X SG public
 < Or: apply mem_append to Mem Vars2.

Subgoal 1.3:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (minus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
Or : mem X V2 \/ mem X V3
============================
 lookupScopes X SG public
 < M: case Or.

Subgoal 1.3.1:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (minus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V2
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev1 Vars M.

Subgoal 1.3.1:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (minus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V2
H5 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.3.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (minus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V3
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev2 Vars1 M.

Subgoal 1.3.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (minus E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V3
H5 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.4:

Variables: SF SG PC V X L1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (mult E1 E2) public @
Vars : vars (mult E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
============================
 lookupScopes X SG public
 < case IsE.

Subgoal 1.4:

Variables: SF SG PC V X L1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (mult E1 E2) public @
Vars : vars (mult E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 1.4:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (mult E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev1.

Subgoal 1.4:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (mult E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev2.

Subgoal 1.4:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (mult E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
H4 : is_slev L2
============================
 lookupScopes X SG public
 < apply join_public to _ _ Lev3.

Subgoal 1.4:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (mult E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
============================
 lookupScopes X SG public
 < Or: apply mem_append to Mem Vars2.

Subgoal 1.4:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (mult E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
Or : mem X V2 \/ mem X V3
============================
 lookupScopes X SG public
 < M: case Or.

Subgoal 1.4.1:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (mult E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V2
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev1 Vars M.

Subgoal 1.4.1:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (mult E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V2
H5 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.4.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (mult E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V3
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev2 Vars1 M.

Subgoal 1.4.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (mult E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V3
H5 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.5:

Variables: SF SG PC V X L1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (div E1 E2) public @
Vars : vars (div E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
============================
 lookupScopes X SG public
 < case IsE.

Subgoal 1.5:

Variables: SF SG PC V X L1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (div E1 E2) public @
Vars : vars (div E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 1.5:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (div E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev1.

Subgoal 1.5:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (div E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev2.

Subgoal 1.5:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (div E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
H4 : is_slev L2
============================
 lookupScopes X SG public
 < apply join_public to _ _ Lev3.

Subgoal 1.5:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (div E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
============================
 lookupScopes X SG public
 < Or: apply mem_append to Mem Vars2.

Subgoal 1.5:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (div E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
Or : mem X V2 \/ mem X V3
============================
 lookupScopes X SG public
 < M: case Or.

Subgoal 1.5.1:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (div E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V2
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev1 Vars M.

Subgoal 1.5.1:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (div E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V2
H5 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.5.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (div E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V3
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev2 Vars1 M.

Subgoal 1.5.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (div E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V3
H5 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.6:

Variables: SF SG PC V X
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC true public @
Vars : vars true V
Mem : mem X V
============================
 lookupScopes X SG public
 < case Vars.

Subgoal 1.6:

Variables: SF SG PC X
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC true public @
Mem : mem X []
============================
 lookupScopes X SG public
 < case Mem.

Subgoal 1.7:

Variables: SF SG PC V X
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC false public @
Vars : vars false V
Mem : mem X V
============================
 lookupScopes X SG public
 < case Vars.

Subgoal 1.7:

Variables: SF SG PC X
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC false public @
Mem : mem X []
============================
 lookupScopes X SG public
 < case Mem.

Subgoal 1.8:

Variables: SF SG PC V X L1 Sl1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (and E1 E2) public @
Vars : vars (and E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : join L1 PC Sl1
Lev3 : level SF SG Sl1 E2 L2 *
Lev4 : join L1 L2 public
============================
 lookupScopes X SG public
 < case IsE.

Subgoal 1.8:

Variables: SF SG PC V X L1 Sl1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (and E1 E2) public @
Vars : vars (and E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : join L1 PC Sl1
Lev3 : level SF SG Sl1 E2 L2 *
Lev4 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 1.8:

Variables: SF SG PC V X L1 Sl1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (and E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : join L1 PC Sl1
Lev3 : level SF SG Sl1 E2 L2 *
Lev4 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev1.

Subgoal 1.8:

Variables: SF SG PC V X L1 Sl1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (and E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : join L1 PC Sl1
Lev3 : level SF SG Sl1 E2 L2 *
Lev4 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
============================
 lookupScopes X SG public
 < apply join_is to _ _ Lev2.

Subgoal 1.8:

Variables: SF SG PC V X L1 Sl1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (and E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : join L1 PC Sl1
Lev3 : level SF SG Sl1 E2 L2 *
Lev4 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
H4 : is_slev Sl1
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev3.

Subgoal 1.8:

Variables: SF SG PC V X L1 Sl1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (and E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : join L1 PC Sl1
Lev3 : level SF SG Sl1 E2 L2 *
Lev4 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
H4 : is_slev Sl1
H5 : is_slev L2
============================
 lookupScopes X SG public
 < apply join_public to _ _ Lev4.

Subgoal 1.8:

Variables: SF SG PC V X Sl1 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (and E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : join public PC Sl1
Lev3 : level SF SG Sl1 E2 public *
Lev4 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev Sl1
H5 : is_slev public
============================
 lookupScopes X SG public
 < Or: apply mem_append to Mem Vars2.

Subgoal 1.8:

Variables: SF SG PC V X Sl1 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (and E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : join public PC Sl1
Lev3 : level SF SG Sl1 E2 public *
Lev4 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev Sl1
H5 : is_slev public
Or : mem X V2 \/ mem X V3
============================
 lookupScopes X SG public
 < M: case Or.

Subgoal 1.8.1:

Variables: SF SG PC V X Sl1 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (and E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : join public PC Sl1
Lev3 : level SF SG Sl1 E2 public *
Lev4 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev Sl1
H5 : is_slev public
M : mem X V2
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev1 Vars M.

Subgoal 1.8.1:

Variables: SF SG PC V X Sl1 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (and E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : join public PC Sl1
Lev3 : level SF SG Sl1 E2 public *
Lev4 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev Sl1
H5 : is_slev public
M : mem X V2
H6 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.8.2:

Variables: SF SG PC V X Sl1 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (and E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : join public PC Sl1
Lev3 : level SF SG Sl1 E2 public *
Lev4 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev Sl1
H5 : is_slev public
M : mem X V3
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev3 Vars1 M.

Subgoal 1.8.2:

Variables: SF SG PC V X Sl1 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (and E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : join public PC Sl1
Lev3 : level SF SG Sl1 E2 public *
Lev4 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev Sl1
H5 : is_slev public
M : mem X V3
H6 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.9:

Variables: SF SG PC V X L1 Sl1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (or E1 E2) public @
Vars : vars (or E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : join L1 PC Sl1
Lev3 : level SF SG Sl1 E2 L2 *
Lev4 : join L1 L2 public
============================
 lookupScopes X SG public
 < case IsE.

Subgoal 1.9:

Variables: SF SG PC V X L1 Sl1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (or E1 E2) public @
Vars : vars (or E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : join L1 PC Sl1
Lev3 : level SF SG Sl1 E2 L2 *
Lev4 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 1.9:

Variables: SF SG PC V X L1 Sl1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (or E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : join L1 PC Sl1
Lev3 : level SF SG Sl1 E2 L2 *
Lev4 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev1.

Subgoal 1.9:

Variables: SF SG PC V X L1 Sl1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (or E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : join L1 PC Sl1
Lev3 : level SF SG Sl1 E2 L2 *
Lev4 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
============================
 lookupScopes X SG public
 < apply join_is to _ _ Lev2.

Subgoal 1.9:

Variables: SF SG PC V X L1 Sl1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (or E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : join L1 PC Sl1
Lev3 : level SF SG Sl1 E2 L2 *
Lev4 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
H4 : is_slev Sl1
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev3.

Subgoal 1.9:

Variables: SF SG PC V X L1 Sl1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (or E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : join L1 PC Sl1
Lev3 : level SF SG Sl1 E2 L2 *
Lev4 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
H4 : is_slev Sl1
H5 : is_slev L2
============================
 lookupScopes X SG public
 < apply join_public to _ _ Lev4.

Subgoal 1.9:

Variables: SF SG PC V X Sl1 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (or E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : join public PC Sl1
Lev3 : level SF SG Sl1 E2 public *
Lev4 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev Sl1
H5 : is_slev public
============================
 lookupScopes X SG public
 < Or: apply mem_append to Mem Vars2.

Subgoal 1.9:

Variables: SF SG PC V X Sl1 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (or E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : join public PC Sl1
Lev3 : level SF SG Sl1 E2 public *
Lev4 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev Sl1
H5 : is_slev public
Or : mem X V2 \/ mem X V3
============================
 lookupScopes X SG public
 < M: case Or.

Subgoal 1.9.1:

Variables: SF SG PC V X Sl1 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (or E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : join public PC Sl1
Lev3 : level SF SG Sl1 E2 public *
Lev4 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev Sl1
H5 : is_slev public
M : mem X V2
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev1 Vars M.

Subgoal 1.9.1:

Variables: SF SG PC V X Sl1 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (or E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : join public PC Sl1
Lev3 : level SF SG Sl1 E2 public *
Lev4 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev Sl1
H5 : is_slev public
M : mem X V2
H6 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.9.2:

Variables: SF SG PC V X Sl1 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (or E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : join public PC Sl1
Lev3 : level SF SG Sl1 E2 public *
Lev4 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev Sl1
H5 : is_slev public
M : mem X V3
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev3 Vars1 M.

Subgoal 1.9.2:

Variables: SF SG PC V X Sl1 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (or E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : join public PC Sl1
Lev3 : level SF SG Sl1 E2 public *
Lev4 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev Sl1
H5 : is_slev public
M : mem X V3
H6 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.10:

Variables: SF SG PC V X E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (not E1) public @
Vars : vars (not E1) V
Mem : mem X V
Lev1 : level SF SG PC E1 public *
============================
 lookupScopes X SG public
 < case IsE.

Subgoal 1.10:

Variables: SF SG PC V X E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (not E1) public @
Vars : vars (not E1) V
Mem : mem X V
Lev1 : level SF SG PC E1 public *
H1 : is_expr E1
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 1.10:

Variables: SF SG PC V X E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (not E1) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
H1 : is_expr E1
Vars : vars E1 V
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev1 Vars Mem.

Subgoal 1.10:

Variables: SF SG PC V X E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (not E1) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
H1 : is_expr E1
Vars : vars E1 V
H2 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.11:

Variables: SF SG PC V X L1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (greater E1 E2) public @
Vars : vars (greater E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
============================
 lookupScopes X SG public
 < case IsE.

Subgoal 1.11:

Variables: SF SG PC V X L1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (greater E1 E2) public @
Vars : vars (greater E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 1.11:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (greater E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev1.

Subgoal 1.11:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (greater E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev2.

Subgoal 1.11:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (greater E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
H4 : is_slev L2
============================
 lookupScopes X SG public
 < apply join_public to _ _ Lev3.

Subgoal 1.11:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (greater E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
============================
 lookupScopes X SG public
 < Or: apply mem_append to Mem Vars2.

Subgoal 1.11:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (greater E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
Or : mem X V2 \/ mem X V3
============================
 lookupScopes X SG public
 < M: case Or.

Subgoal 1.11.1:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (greater E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V2
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev1 Vars M.

Subgoal 1.11.1:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (greater E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V2
H5 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.11.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (greater E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V3
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev2 Vars1 M.

Subgoal 1.11.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (greater E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V3
H5 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.12:

Variables: SF SG PC V X L1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (eq E1 E2) public @
Vars : vars (eq E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
============================
 lookupScopes X SG public
 < case IsE.

Subgoal 1.12:

Variables: SF SG PC V X L1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (eq E1 E2) public @
Vars : vars (eq E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 1.12:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (eq E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev1.

Subgoal 1.12:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (eq E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev2.

Subgoal 1.12:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (eq E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
H4 : is_slev L2
============================
 lookupScopes X SG public
 < apply join_public to _ _ Lev3.

Subgoal 1.12:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (eq E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
============================
 lookupScopes X SG public
 < Or: apply mem_append to Mem Vars2.

Subgoal 1.12:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (eq E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
Or : mem X V2 \/ mem X V3
============================
 lookupScopes X SG public
 < M: case Or.

Subgoal 1.12.1:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (eq E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V2
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev1 Vars M.

Subgoal 1.12.1:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (eq E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V2
H5 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.12.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (eq E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V3
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev2 Vars1 M.

Subgoal 1.12.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (eq E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V3
H5 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.13:

Variables: SF SG PC V X S
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (stringLit S) public @
Vars : vars (stringLit S) V
Mem : mem X V
============================
 lookupScopes X SG public
 < case Vars.

Subgoal 1.13:

Variables: SF SG PC X S
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (stringLit S) public @
Mem : mem X []
============================
 lookupScopes X SG public
 < case Mem.

Subgoal 1.14:

Variables: SF SG PC V X L1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (appString E1 E2) public @
Vars : vars (appString E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
============================
 lookupScopes X SG public
 < case IsE.

Subgoal 1.14:

Variables: SF SG PC V X L1 L2 E2 E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (appString E1 E2) public @
Vars : vars (appString E1 E2) V
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 1.14:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (appString E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev1.

Subgoal 1.14:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (appString E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev2.

Subgoal 1.14:

Variables: SF SG PC V X L1 L2 E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (appString E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 L1 *
Lev2 : level SF SG PC E2 L2 *
Lev3 : join L1 L2 public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev L1
H4 : is_slev L2
============================
 lookupScopes X SG public
 < apply join_public to _ _ Lev3.

Subgoal 1.14:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (appString E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
============================
 lookupScopes X SG public
 < Or: apply mem_append to Mem Vars2.

Subgoal 1.14:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (appString E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
Or : mem X V2 \/ mem X V3
============================
 lookupScopes X SG public
 < M: case Or.

Subgoal 1.14.1:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (appString E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V2
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev1 Vars M.

Subgoal 1.14.1:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (appString E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V2
H5 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.14.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (appString E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V3
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev2 Vars1 M.

Subgoal 1.14.2:

Variables: SF SG PC V X E2 E1 V2 V3
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (appString E1 E2) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
Lev2 : level SF SG PC E2 public *
Lev3 : join public public public
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = V
H3 : is_slev public
H4 : is_slev public
M : mem X V3
H5 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.15:

Variables: SF SG PC V X X1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsE : is_expr (name X1)
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (name X1) public @
Vars : vars (name X1) V
Mem : mem X V
Lev1 : lookupScopes X1 SG public
============================
 lookupScopes X SG public
 < case Vars.

Subgoal 1.15:

Variables: SF SG PC X X1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsE : is_expr (name X1)
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (name X1) public @
Mem : mem X [X1]
Lev1 : lookupScopes X1 SG public
============================
 lookupScopes X SG public
 < Mem: case Mem.

Subgoal 1.15.1:

Variables: SF SG PC X1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsE : is_expr (name X1)
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (name X1) public @
Lev1 : lookupScopes X1 SG public
============================
 lookupScopes X1 SG public
 < search.

Subgoal 1.15.2:

Variables: SF SG PC X X1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsE : is_expr (name X1)
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (name X1) public @
Lev1 : lookupScopes X1 SG public
Mem : mem X []
============================
 lookupScopes X SG public
 < case Mem.

Subgoal 1.16:

Variables: SF SG V X ArgLevs Args Fun
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG public (call Fun Args) public @
Vars : vars (call Fun Args) V
Mem : mem X V
Lev1 : lookup SF Fun (public, ArgLevs)
Lev2 : levelArgs SF SG public Args ArgLevs *
============================
 lookupScopes X SG public
 < case IsE.

Subgoal 1.16:

Variables: SF SG V X ArgLevs Args Fun
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
Lev : level SF SG public (call Fun Args) public @
Vars : vars (call Fun Args) V
Mem : mem X V
Lev1 : lookup SF Fun (public, ArgLevs)
Lev2 : levelArgs SF SG public Args ArgLevs *
H1 : is_string Fun
H2 : is_args Args
============================
 lookupScopes X SG public
 < RF: case SecFuns (keep).

Subgoal 1.16:

Variables: SF SG V X ArgLevs Args Fun
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
Lev : level SF SG public (call Fun Args) public @
Vars : vars (call Fun Args) V
Mem : mem X V
Lev1 : lookup SF Fun (public, ArgLevs)
Lev2 : levelArgs SF SG public Args ArgLevs *
H1 : is_string Fun
H2 : is_args Args
RF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
============================
 lookupScopes X SG public
 < AP: apply RF to Lev1.

Subgoal 1.16:

Variables: SF SG V X ArgLevs Args Fun
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
Lev : level SF SG public (call Fun Args) public @
Vars : vars (call Fun Args) V
Mem : mem X V
Lev1 : lookup SF Fun (public, ArgLevs)
Lev2 : levelArgs SF SG public Args ArgLevs *
H1 : is_string Fun
H2 : is_args Args
RF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
AP : allPublic ArgLevs
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 1.16:

Variables: SF SG V X ArgLevs Args Fun
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
Lev : level SF SG public (call Fun Args) public @
Mem : mem X V
Lev1 : lookup SF Fun (public, ArgLevs)
Lev2 : levelArgs SF SG public Args ArgLevs *
H1 : is_string Fun
H2 : is_args Args
RF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
AP : allPublic ArgLevs
Vars : varsArgs Args V
============================
 lookupScopes X SG public
 < apply IH_A to _ _ _ _ SecFuns Lev2 AP Vars Mem.

Subgoal 1.16:

Variables: SF SG V X ArgLevs Args Fun
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
Lev : level SF SG public (call Fun Args) public @
Mem : mem X V
Lev1 : lookup SF Fun (public, ArgLevs)
Lev2 : levelArgs SF SG public Args ArgLevs *
H1 : is_string Fun
H2 : is_args Args
RF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
AP : allPublic ArgLevs
Vars : varsArgs Args V
H3 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.17:

Variables: SF SG PC V X Fields
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (recBuild Fields) public @
Vars : vars (recBuild Fields) V
Mem : mem X V
Lev1 : levelRecFields SF SG PC Fields public *
============================
 lookupScopes X SG public
 < case IsE.

Subgoal 1.17:

Variables: SF SG PC V X Fields
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (recBuild Fields) public @
Vars : vars (recBuild Fields) V
Mem : mem X V
Lev1 : levelRecFields SF SG PC Fields public *
H1 : is_recFieldExprs Fields
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 1.17:

Variables: SF SG PC V X Fields
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (recBuild Fields) public @
Mem : mem X V
Lev1 : levelRecFields SF SG PC Fields public *
H1 : is_recFieldExprs Fields
Vars : varsRecFields Fields V
============================
 lookupScopes X SG public
 < apply IH_RF to _ _ _ _ _ Lev1 Vars Mem.

Subgoal 1.17:

Variables: SF SG PC V X Fields
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (recBuild Fields) public @
Mem : mem X V
Lev1 : levelRecFields SF SG PC Fields public *
H1 : is_recFieldExprs Fields
Vars : varsRecFields Fields V
H2 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.18:

Variables: SF SG PC V X Field E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (recFieldAccess E1 Field) public @
Vars : vars (recFieldAccess E1 Field) V
Mem : mem X V
Lev1 : level SF SG PC E1 public *
============================
 lookupScopes X SG public
 < case IsE.

Subgoal 1.18:

Variables: SF SG PC V X Field E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (recFieldAccess E1 Field) public @
Vars : vars (recFieldAccess E1 Field) V
Mem : mem X V
Lev1 : level SF SG PC E1 public *
H1 : is_expr E1
H2 : is_string Field
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 1.18:

Variables: SF SG PC V X Field E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (recFieldAccess E1 Field) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
H1 : is_expr E1
H2 : is_string Field
Vars : vars E1 V
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev1 Vars Mem.

Subgoal 1.18:

Variables: SF SG PC V X Field E1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (recFieldAccess E1 Field) public @
Mem : mem X V
Lev1 : level SF SG PC E1 public *
H1 : is_expr E1
H2 : is_string Field
Vars : vars E1 V
H3 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.19:

Variables: SF SG PC V X Ty Msg
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC (errorExpr Msg Ty) public @
Vars : vars (errorExpr Msg Ty) V
Mem : mem X V
Lev1 : level SF SG PC Msg public *
============================
 lookupScopes X SG public
 < case IsE.

Subgoal 1.19:

Variables: SF SG PC V X Ty Msg
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (errorExpr Msg Ty) public @
Vars : vars (errorExpr Msg Ty) V
Mem : mem X V
Lev1 : level SF SG PC Msg public *
H1 : is_expr Msg
H2 : is_typ Ty
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 1.19:

Variables: SF SG PC V X Ty Msg
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (errorExpr Msg Ty) public @
Mem : mem X V
Lev1 : level SF SG PC Msg public *
H1 : is_expr Msg
H2 : is_typ Ty
Vars : vars Msg V
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev1 Vars Mem.

Subgoal 1.19:

Variables: SF SG PC V X Ty Msg
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : level SF SG PC (errorExpr Msg Ty) public @
Mem : mem X V
Lev1 : level SF SG PC Msg public *
H1 : is_expr Msg
H2 : is_typ Ty
Vars : vars Msg V
H3 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 1.20:

Variables: SF SG PC V X E_P
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC <unknown I expr> public @
Vars : vars <unknown I expr> V
Mem : mem X V
Lev1 : |{expr}- <unknown I expr> ~~> E_P
Lev2 : level SF SG PC E_P public *
============================
 lookupScopes X SG public
 < IsE_P: apply proj_expr_is to Lev1 _.

Subgoal 1.20:

Variables: SF SG PC V X E_P
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC <unknown I expr> public @
Vars : vars <unknown I expr> V
Mem : mem X V
Lev1 : |{expr}- <unknown I expr> ~~> E_P
Lev2 : level SF SG PC E_P public *
IsE_P : is_expr E_P
============================
 lookupScopes X SG public
 < Vars_P: apply vars_exist to IsE_P.

Subgoal 1.20:

Variables: SF SG PC V X E_P V1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC <unknown I expr> public @
Vars : vars <unknown I expr> V
Mem : mem X V
Lev1 : |{expr}- <unknown I expr> ~~> E_P
Lev2 : level SF SG PC E_P public *
IsE_P : is_expr E_P
Vars_P : vars E_P V1
============================
 lookupScopes X SG public
 < Mem_P: apply proj_vars to Lev1 _ Vars Vars_P Mem.

Subgoal 1.20:

Variables: SF SG PC V X E_P V1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC <unknown I expr> public @
Vars : vars <unknown I expr> V
Mem : mem X V
Lev1 : |{expr}- <unknown I expr> ~~> E_P
Lev2 : level SF SG PC E_P public *
IsE_P : is_expr E_P
Vars_P : vars E_P V1
Mem_P : mem X V1
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev2 Vars_P Mem_P.

Subgoal 1.20:

Variables: SF SG PC V X E_P V1
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : level SF SG PC <unknown I expr> public @
Vars : vars <unknown I expr> V
Mem : mem X V
Lev1 : |{expr}- <unknown I expr> ~~> E_P
Lev2 : level SF SG PC E_P public *
IsE_P : is_expr E_P
Vars_P : vars E_P V1
Mem_P : mem X V1
H1 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 2:

Variables: A SF SG PC Ls V X
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : levelArgs SF SG PC A Ls @
AP : allPublic Ls
Vars : varsArgs A V
Mem : mem X V
============================
 lookupScopes X SG public
 < Lev: case Lev (keep).

Subgoal 2.1:

Variables: SF SG PC V X
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : levelArgs SF SG PC nilArgs [] @
AP : allPublic []
Vars : varsArgs nilArgs V
Mem : mem X V
============================
 lookupScopes X SG public
 < case Vars.

Subgoal 2.1:

Variables: SF SG PC X
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : levelArgs SF SG PC nilArgs [] @
AP : allPublic []
Mem : mem X []
============================
 lookupScopes X SG public
 < case Mem.

Subgoal 2.2:

Variables: SF SG PC V X Rest L A1 E
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : levelArgs SF SG PC (consArgs E A1) (L::Rest) @
AP : allPublic (L::Rest)
Vars : varsArgs (consArgs E A1) V
Mem : mem X V
Lev1 : level SF SG PC E L *
Lev2 : levelArgs SF SG PC A1 Rest *
============================
 lookupScopes X SG public
 < case IsA.

Subgoal 2.2:

Variables: SF SG PC V X Rest L A1 E
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelArgs SF SG PC (consArgs E A1) (L::Rest) @
AP : allPublic (L::Rest)
Vars : varsArgs (consArgs E A1) V
Mem : mem X V
Lev1 : level SF SG PC E L *
Lev2 : levelArgs SF SG PC A1 Rest *
H1 : is_expr E
H2 : is_args A1
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 2.2:

Variables: SF SG PC V X Rest L A1 E VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelArgs SF SG PC (consArgs E A1) (L::Rest) @
AP : allPublic (L::Rest)
Mem : mem X V
Lev1 : level SF SG PC E L *
Lev2 : levelArgs SF SG PC A1 Rest *
H1 : is_expr E
H2 : is_args A1
Vars : vars E VE
Vars1 : varsArgs A1 VRest
Vars2 : VE ++ VRest = V
============================
 lookupScopes X SG public
 < AP: case AP.

Subgoal 2.2:

Variables: SF SG PC V X Rest A1 E VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelArgs SF SG PC (consArgs E A1) (public::Rest) @
Mem : mem X V
Lev1 : level SF SG PC E public *
Lev2 : levelArgs SF SG PC A1 Rest *
H1 : is_expr E
H2 : is_args A1
Vars : vars E VE
Vars1 : varsArgs A1 VRest
Vars2 : VE ++ VRest = V
AP : allPublic Rest
============================
 lookupScopes X SG public
 < Or: apply mem_append to Mem Vars2.

Subgoal 2.2:

Variables: SF SG PC V X Rest A1 E VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelArgs SF SG PC (consArgs E A1) (public::Rest) @
Mem : mem X V
Lev1 : level SF SG PC E public *
Lev2 : levelArgs SF SG PC A1 Rest *
H1 : is_expr E
H2 : is_args A1
Vars : vars E VE
Vars1 : varsArgs A1 VRest
Vars2 : VE ++ VRest = V
AP : allPublic Rest
Or : mem X VE \/ mem X VRest
============================
 lookupScopes X SG public
 < M: case Or.

Subgoal 2.2.1:

Variables: SF SG PC V X Rest A1 E VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelArgs SF SG PC (consArgs E A1) (public::Rest) @
Mem : mem X V
Lev1 : level SF SG PC E public *
Lev2 : levelArgs SF SG PC A1 Rest *
H1 : is_expr E
H2 : is_args A1
Vars : vars E VE
Vars1 : varsArgs A1 VRest
Vars2 : VE ++ VRest = V
AP : allPublic Rest
M : mem X VE
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev1 Vars M.

Subgoal 2.2.1:

Variables: SF SG PC V X Rest A1 E VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelArgs SF SG PC (consArgs E A1) (public::Rest) @
Mem : mem X V
Lev1 : level SF SG PC E public *
Lev2 : levelArgs SF SG PC A1 Rest *
H1 : is_expr E
H2 : is_args A1
Vars : vars E VE
Vars1 : varsArgs A1 VRest
Vars2 : VE ++ VRest = V
AP : allPublic Rest
M : mem X VE
H3 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 2.2.2:

Variables: SF SG PC V X Rest A1 E VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelArgs SF SG PC (consArgs E A1) (public::Rest) @
Mem : mem X V
Lev1 : level SF SG PC E public *
Lev2 : levelArgs SF SG PC A1 Rest *
H1 : is_expr E
H2 : is_args A1
Vars : vars E VE
Vars1 : varsArgs A1 VRest
Vars2 : VE ++ VRest = V
AP : allPublic Rest
M : mem X VRest
============================
 lookupScopes X SG public
 < apply IH_A to _ _ _ _ _ Lev2 AP Vars1 M.

Subgoal 2.2.2:

Variables: SF SG PC V X Rest A1 E VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelArgs SF SG PC (consArgs E A1) (public::Rest) @
Mem : mem X V
Lev1 : level SF SG PC E public *
Lev2 : levelArgs SF SG PC A1 Rest *
H1 : is_expr E
H2 : is_args A1
Vars : vars E VE
Vars1 : varsArgs A1 VRest
Vars2 : VE ++ VRest = V
AP : allPublic Rest
M : mem X VRest
H3 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 3:

Variables: RF SF SG PC V X
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : levelRecFields SF SG PC RF public @
Vars : varsRecFields RF V
Mem : mem X V
============================
 lookupScopes X SG public
 < Lev: case Lev (keep).

Subgoal 3.1:

Variables: SF SG PC V X
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : levelRecFields SF SG PC nilRecFieldExprs public @
Vars : varsRecFields nilRecFieldExprs V
Mem : mem X V
============================
 lookupScopes X SG public
 < case Vars.

Subgoal 3.1:

Variables: SF SG PC X
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : levelRecFields SF SG PC nilRecFieldExprs public @
Mem : mem X []
============================
 lookupScopes X SG public
 < case Mem.

Subgoal 3.2:

Variables: SF SG PC V X LE LRF RF1 E F
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
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
SecFuns : secFuns SF
Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) public @
Vars : varsRecFields (consRecFieldExprs F E RF1) V
Mem : mem X V
Lev1 : level SF SG PC E LE *
Lev2 : levelRecFields SF SG PC RF1 LRF *
Lev3 : join LE LRF public
============================
 lookupScopes X SG public
 < case IsRF.

Subgoal 3.2:

Variables: SF SG PC V X LE LRF RF1 E F
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) public @
Vars : varsRecFields (consRecFieldExprs F E RF1) V
Mem : mem X V
Lev1 : level SF SG PC E LE *
Lev2 : levelRecFields SF SG PC RF1 LRF *
Lev3 : join LE LRF public
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs RF1
============================
 lookupScopes X SG public
 < Vars: case Vars.

Subgoal 3.2:

Variables: SF SG PC V X LE LRF RF1 E F VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) public @
Mem : mem X V
Lev1 : level SF SG PC E LE *
Lev2 : levelRecFields SF SG PC RF1 LRF *
Lev3 : join LE LRF public
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs RF1
Vars : vars E VE
Vars1 : varsRecFields RF1 VRest
Vars2 : VE ++ VRest = V
============================
 lookupScopes X SG public
 < apply level_is to _ _ _ Lev1.

Subgoal 3.2:

Variables: SF SG PC V X LE LRF RF1 E F VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) public @
Mem : mem X V
Lev1 : level SF SG PC E LE *
Lev2 : levelRecFields SF SG PC RF1 LRF *
Lev3 : join LE LRF public
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs RF1
Vars : vars E VE
Vars1 : varsRecFields RF1 VRest
Vars2 : VE ++ VRest = V
H4 : is_slev LE
============================
 lookupScopes X SG public
 < apply levelRecFields_is to _ _ _ Lev2.

Subgoal 3.2:

Variables: SF SG PC V X LE LRF RF1 E F VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) public @
Mem : mem X V
Lev1 : level SF SG PC E LE *
Lev2 : levelRecFields SF SG PC RF1 LRF *
Lev3 : join LE LRF public
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs RF1
Vars : vars E VE
Vars1 : varsRecFields RF1 VRest
Vars2 : VE ++ VRest = V
H4 : is_slev LE
H5 : is_slev LRF
============================
 lookupScopes X SG public
 < apply join_public to _ _ Lev3.

Subgoal 3.2:

Variables: SF SG PC V X RF1 E F VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) public @
Mem : mem X V
Lev1 : level SF SG PC E public *
Lev2 : levelRecFields SF SG PC RF1 public *
Lev3 : join public public public
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs RF1
Vars : vars E VE
Vars1 : varsRecFields RF1 VRest
Vars2 : VE ++ VRest = V
H4 : is_slev public
H5 : is_slev public
============================
 lookupScopes X SG public
 < Or: apply mem_append to Mem Vars2.

Subgoal 3.2:

Variables: SF SG PC V X RF1 E F VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) public @
Mem : mem X V
Lev1 : level SF SG PC E public *
Lev2 : levelRecFields SF SG PC RF1 public *
Lev3 : join public public public
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs RF1
Vars : vars E VE
Vars1 : varsRecFields RF1 VRest
Vars2 : VE ++ VRest = V
H4 : is_slev public
H5 : is_slev public
Or : mem X VE \/ mem X VRest
============================
 lookupScopes X SG public
 < M: case Or.

Subgoal 3.2.1:

Variables: SF SG PC V X RF1 E F VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) public @
Mem : mem X V
Lev1 : level SF SG PC E public *
Lev2 : levelRecFields SF SG PC RF1 public *
Lev3 : join public public public
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs RF1
Vars : vars E VE
Vars1 : varsRecFields RF1 VRest
Vars2 : VE ++ VRest = V
H4 : is_slev public
H5 : is_slev public
M : mem X VE
============================
 lookupScopes X SG public
 < apply IH_E to _ _ _ _ _ Lev1 Vars M.

Subgoal 3.2.1:

Variables: SF SG PC V X RF1 E F VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) public @
Mem : mem X V
Lev1 : level SF SG PC E public *
Lev2 : levelRecFields SF SG PC RF1 public *
Lev3 : join public public public
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs RF1
Vars : vars E VE
Vars1 : varsRecFields RF1 VRest
Vars2 : VE ++ VRest = V
H4 : is_slev public
H5 : is_slev public
M : mem X VE
H6 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < search.

Subgoal 3.2.2:

Variables: SF SG PC V X RF1 E F VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) public @
Mem : mem X V
Lev1 : level SF SG PC E public *
Lev2 : levelRecFields SF SG PC RF1 public *
Lev3 : join public public public
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs RF1
Vars : vars E VE
Vars1 : varsRecFields RF1 VRest
Vars2 : VE ++ VRest = V
H4 : is_slev public
H5 : is_slev public
M : mem X VRest
============================
 lookupScopes X SG public
 < apply IH_RF to _ _ _ _ _ Lev2 Vars1 M.

Subgoal 3.2.2:

Variables: SF SG PC V X RF1 E F VE VRest
IH_E : forall E SF SG PC V X,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         level SF SG PC E public * -> vars E V -> mem X V -> lookupScopes X SG public
IH_A : forall A SF SG PC Ls V X,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
         levelArgs SF SG PC A Ls * -> allPublic Ls -> varsArgs A V -> mem X V ->
         lookupScopes X SG public
IH_RF : forall RF SF SG PC V X,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secFuns SF ->
          levelRecFields SF SG PC RF public * -> varsRecFields RF V -> mem X V ->
          lookupScopes X SG public
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
SecFuns : secFuns SF
Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) public @
Mem : mem X V
Lev1 : level SF SG PC E public *
Lev2 : levelRecFields SF SG PC RF1 public *
Lev3 : join public public public
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs RF1
Vars : vars E VE
Vars1 : varsRecFields RF1 VRest
Vars2 : VE ++ VRest = V
H4 : is_slev public
H5 : is_slev public
M : mem X VRest
H6 : lookupScopes X SG public
============================
 lookupScopes X SG public
 < 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
      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.

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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 2.1:

Variables: SF SG PC SG' FE Scope EE
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 2.1:

Variables: SF PC SG' FE Scope EE
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 2.2:

Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 2.2:

Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 2.2:

Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 SG3
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 IH to _ _ _ _ _ _ Ev1 Sec.

Subgoal 2.2:

Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 SG3
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 2.2:

Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 SG3
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 2.2:

Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 SG3
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 2.2:

Variables: SF PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 SG3 BRest B
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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 2.2:

Variables: SF PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 BRest B Scope'
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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 2.2:

Variables: SF PC SG' FE Scope EE EE' O O2 O3 S2 S1 BRest B Scope' ARest A
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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 IH to _ _ _ _ _ _ Ev2 Sec1.

Subgoal 2.2:

Variables: SF PC SG' FE Scope EE EE' O O2 O3 S2 S1 BRest B Scope' ARest A
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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 2.3:

Variables: SF SG PC SG' FE Scope EE O V X E Ty
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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)::Scope)::EE) O @
Sec : secure SF SG PC (declare Ty X E) SG'
Ev1 : evalExpr FE (Scope::EE) E V O *
============================
 names_same (((X, V)::Scope)::EE) SG'
 < case IsS.

Subgoal 2.3:

Variables: SF SG PC SG' FE Scope EE O V X E Ty
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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)::Scope)::EE) O @
Sec : secure SF SG PC (declare Ty X E) SG'
Ev1 : evalExpr FE (Scope::EE) E V O *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
============================
 names_same (((X, V)::Scope)::EE) SG'
 < Sec: case Sec.

Subgoal 2.3:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
NS : names_same (Scope::EE) (Scope1::SG1)
Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
============================
 names_same (((X, V)::Scope)::EE) (((X, public)::Scope1)::SG1)
 < R: case NS.

Subgoal 2.3:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 names_same (((X, V)::Scope)::EE) (((X, public)::Scope1)::SG1)
 < unfold .

Subgoal 2.3.1:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 forall X1 IA,
   mem (X1, IA) ((X, V)::Scope) -> exists IB, mem (X1, IB) ((X, public)::Scope1)
 < intros M.

Subgoal 2.3.1:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1 X1 IA
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IA) ((X, V)::Scope)
============================
 exists IB, mem (X1, IB) ((X, public)::Scope1)
 < M: case M.

Subgoal 2.3.1.1:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 exists IB, mem (X, IB) ((X, public)::Scope1)
 < search.

Subgoal 2.3.1.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1 X1 IA
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IA) Scope
============================
 exists IB, mem (X1, IB) ((X, public)::Scope1)
 < apply R to M.

Subgoal 2.3.1.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1 X1 IA IB
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IA) Scope
H4 : mem (X1, IB) Scope1
============================
 exists IB, mem (X1, IB) ((X, public)::Scope1)
 < search.

Subgoal 2.3.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 forall X1 IB,
   mem (X1, IB) ((X, public)::Scope1) -> exists IA, mem (X1, IA) ((X, V)::Scope)
 < intros M.

Subgoal 2.3.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1 X1 IB
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IB) ((X, public)::Scope1)
============================
 exists IA, mem (X1, IA) ((X, V)::Scope)
 < M: case M.

Subgoal 2.3.2.1:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 exists IA, mem (X, IA) ((X, V)::Scope)
 < search.

Subgoal 2.3.2.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1 X1 IB
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IB) Scope1
============================
 exists IA, mem (X1, IA) ((X, V)::Scope)
 < apply R1 to M.

Subgoal 2.3.2.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1 X1 IB IA
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IB) Scope1
H4 : mem (X1, IA) Scope
============================
 exists IA, mem (X1, IA) ((X, V)::Scope)
 < search.

Subgoal 2.3.3:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 names_same EE SG1
 < search.

Subgoal 2.4:

Variables: SF SG PC SG' FE Scope EE EE' O V E X
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 O *
Ev2 : replaceScopes X V (Scope::EE) EE'
============================
 names_same EE' SG'
 < case IsS.

Subgoal 2.4:

Variables: SF SG PC SG' FE Scope EE EE' O V E X
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : replaceScopes X V (Scope::EE) EE'
H1 : is_string X
H2 : is_expr E
============================
 names_same EE' SG'
 < Sec: case Sec.

Subgoal 2.4.1:

Variables: SF PC SG' FE Scope EE EE' O V E X L
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : replaceScopes X V (Scope::EE) 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 replaceScopes_names_same to _ Ev2.

Subgoal 2.4.1:

Variables: SF PC SG' FE Scope EE EE' O V E X L
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : replaceScopes X V (Scope::EE) EE'
H1 : is_string X
H2 : is_expr E
Sec : level SF SG' PC E L
Sec1 : lookupScopes X SG' private
NS' : names_same (Scope::EE) EE'
============================
 names_same EE' SG'
 < NS2: apply names_same_symmetric to NS'.

Subgoal 2.4.1:

Variables: SF PC SG' FE Scope EE EE' O V E X L
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : replaceScopes X V (Scope::EE) EE'
H1 : is_string X
H2 : is_expr E
Sec : level SF SG' PC E L
Sec1 : lookupScopes X SG' private
NS' : names_same (Scope::EE) EE'
NS2 : names_same EE' (Scope::EE)
============================
 names_same EE' SG'
 < apply names_same_transitive to NS2 NS.

Subgoal 2.4.1:

Variables: SF PC SG' FE Scope EE EE' O V E X L
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : replaceScopes X V (Scope::EE) EE'
H1 : is_string X
H2 : is_expr E
Sec : level SF SG' PC E L
Sec1 : lookupScopes X SG' private
NS' : names_same (Scope::EE) EE'
NS2 : names_same EE' (Scope::EE)
H3 : names_same EE' SG'
============================
 names_same EE' SG'
 < search.

Subgoal 2.4.2:

Variables: SF SG' FE Scope EE EE' O V E X
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : replaceScopes X V (Scope::EE) 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 replaceScopes_names_same to _ Ev2.

Subgoal 2.4.2:

Variables: SF SG' FE Scope EE EE' O V E X
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : replaceScopes X V (Scope::EE) EE'
H1 : is_string X
H2 : is_expr E
Sec : level SF SG' public E public
Sec1 : lookupScopes X SG' public
NS' : names_same (Scope::EE) EE'
============================
 names_same EE' SG'
 < NS2: apply names_same_symmetric to NS'.

Subgoal 2.4.2:

Variables: SF SG' FE Scope EE EE' O V E X
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : replaceScopes X V (Scope::EE) EE'
H1 : is_string X
H2 : is_expr E
Sec : level SF SG' public E public
Sec1 : lookupScopes X SG' public
NS' : names_same (Scope::EE) EE'
NS2 : names_same EE' (Scope::EE)
============================
 names_same EE' SG'
 < apply names_same_transitive to NS2 NS.

Subgoal 2.4.2:

Variables: SF SG' FE Scope EE EE' O V E X
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : replaceScopes X V (Scope::EE) EE'
H1 : is_string X
H2 : is_expr E
Sec : level SF SG' public E public
Sec1 : lookupScopes X SG' public
NS' : names_same (Scope::EE) EE'
NS2 : names_same EE' (Scope::EE)
H3 : names_same EE' SG'
============================
 names_same EE' SG'
 < search.

Subgoal 2.5:

Variables: SF SG PC SG' FE Scope EE EE' O V FieldVals NewVals E Fields Rec
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) EE'
============================
 names_same EE' SG'
 < case IsS.

Subgoal 2.5:

Variables: SF SG PC SG' FE Scope EE EE' O V FieldVals NewVals E Fields Rec
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) EE'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
============================
 names_same EE' SG'
 < Sec: case Sec.

Subgoal 2.5.1:

Variables: SF PC SG' FE Scope EE EE' O V FieldVals NewVals E Fields Rec L
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) 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 replaceScopes_names_same to _ Ev4.

Subgoal 2.5.1:

Variables: SF PC SG' FE Scope EE EE' O V FieldVals NewVals E Fields Rec L
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) 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 (Scope::EE) EE'
============================
 names_same EE' SG'
 < NS2: apply names_same_symmetric to NS'.

Subgoal 2.5.1:

Variables: SF PC SG' FE Scope EE EE' O V FieldVals NewVals E Fields Rec L
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) 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 (Scope::EE) EE'
NS2 : names_same EE' (Scope::EE)
============================
 names_same EE' SG'
 < apply names_same_transitive to NS2 NS.

Subgoal 2.5.1:

Variables: SF PC SG' FE Scope EE EE' O V FieldVals NewVals E Fields Rec L
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) 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 (Scope::EE) EE'
NS2 : names_same EE' (Scope::EE)
H4 : names_same EE' SG'
============================
 names_same EE' SG'
 < search.

Subgoal 2.5.2:

Variables: SF SG' FE Scope EE EE' O V FieldVals NewVals E Fields Rec
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) 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 replaceScopes_names_same to _ Ev4.

Subgoal 2.5.2:

Variables: SF SG' FE Scope EE EE' O V FieldVals NewVals E Fields Rec
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) 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 (Scope::EE) EE'
============================
 names_same EE' SG'
 < NS2: apply names_same_symmetric to NS'.

Subgoal 2.5.2:

Variables: SF SG' FE Scope EE EE' O V FieldVals NewVals E Fields Rec
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) 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 (Scope::EE) EE'
NS2 : names_same EE' (Scope::EE)
============================
 names_same EE' SG'
 < apply names_same_transitive to NS2 NS.

Subgoal 2.5.2:

Variables: SF SG' FE Scope EE EE' O V FieldVals NewVals E Fields Rec
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) 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 (Scope::EE) EE'
NS2 : names_same EE' (Scope::EE)
H4 : names_same EE' SG'
============================
 names_same EE' SG'
 < search.

Subgoal 2.6:

Variables: SF SG PC SG' FE Scope EE EE' O O2 Scope1 O3 El Th Cond
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Th (Scope1::EE') O3 *
Ev3 : O2 ++ O3 = O
============================
 names_same EE' SG'
 < case IsS.

Subgoal 2.6:

Variables: SF SG PC SG' FE Scope EE EE' O O2 Scope1 O3 El Th Cond
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 2.6:

Variables: SF PC SG' FE Scope EE EE' O O2 Scope1 O3 El Th Cond L Sl1 SGT SGF
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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'
 < apply names_same_add_scope to NS.

Subgoal 2.6:

Variables: SF PC SG' FE Scope EE EE' O O2 Scope1 O3 El Th Cond L Sl1 SGT SGF
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 names_same EE' SG'
 < NS': apply IH to _ _ _ _ _ _ Ev2 Sec2.

Subgoal 2.6:

Variables: SF PC SG' FE Scope EE EE' O O2 Scope1 O3 El Th Cond L Sl1 SGT SGF
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : names_same ([]::(Scope::EE)) ([]::SG')
NS' : names_same (Scope1::EE') SGT
============================
 names_same EE' SG'
 < case NS'.

Subgoal 2.6:

Variables: SF PC SG' FE Scope EE EE' O O2 Scope1 O3 El Th Cond L Sl1 SGF BRest B
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : names_same ([]::(Scope::EE)) ([]::SG')
H5 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) B
H6 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope1
H7 : names_same EE' BRest
============================
 names_same EE' SG'
 < apply secure_older_scopes to _ _ _ Sec2.

Subgoal 2.6:

Variables: SF PC SG' FE Scope EE EE' O O2 Scope1 O3 El Th Cond L Sl1 SGF Scope'
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : names_same ([]::(Scope::EE)) ([]::SG')
H5 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope'
H6 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1
H7 : names_same EE' SG'
H8 : forall X L, lookup [] X L -> lookup Scope' X L
============================
 names_same EE' SG'
 < search.

Subgoal 2.7:

Variables: SF SG PC SG' FE Scope EE EE' O O2 Scope1 O3 El Th Cond
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) El (Scope1::EE') O3 *
Ev3 : O2 ++ O3 = O
============================
 names_same EE' SG'
 < case IsS.

Subgoal 2.7:

Variables: SF SG PC SG' FE Scope EE EE' O O2 Scope1 O3 El Th Cond
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 2.7:

Variables: SF PC SG' FE Scope EE EE' O O2 Scope1 O3 El Th Cond L Sl1 SGT SGF
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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'
 < apply names_same_add_scope to NS.

Subgoal 2.7:

Variables: SF PC SG' FE Scope EE EE' O O2 Scope1 O3 El Th Cond L Sl1 SGT SGF
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 names_same EE' SG'
 < NS': apply IH to _ _ _ _ _ _ Ev2 Sec3.

Subgoal 2.7:

Variables: SF PC SG' FE Scope EE EE' O O2 Scope1 O3 El Th Cond L Sl1 SGT SGF
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : names_same ([]::(Scope::EE)) ([]::SG')
NS' : names_same (Scope1::EE') SGF
============================
 names_same EE' SG'
 < case NS'.

Subgoal 2.7:

Variables: SF PC SG' FE Scope EE EE' O O2 Scope1 O3 El Th Cond L Sl1 SGT BRest B
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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)
H4 : names_same ([]::(Scope::EE)) ([]::SG')
H5 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) B
H6 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope1
H7 : names_same EE' BRest
============================
 names_same EE' SG'
 < apply secure_older_scopes to _ _ _ Sec3.

Subgoal 2.7:

Variables: SF PC SG' FE Scope EE EE' O O2 Scope1 O3 El Th Cond L Sl1 SGT Scope'
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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')
H4 : names_same ([]::(Scope::EE)) ([]::SG')
H5 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope'
H6 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1
H7 : names_same EE' SG'
H8 : forall X L, lookup [] X L -> lookup Scope' X L
============================
 names_same EE' SG'
 < search.

Subgoal 2.8:

Variables: SF SG PC SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (while Cond Body) EE' O4 *
Ev4 : O2 ++ O3 = O12
Ev5 : O12 ++ O4 = O
============================
 names_same EE' SG'
 < case IsS.

Subgoal 2.8:

Variables: SF SG PC SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 2.8.1:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond L Scope2 SG2
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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'
 < NS1: apply names_same_add_scope to NS.

Subgoal 2.8.1:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond L Scope2 SG2
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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)
NS1 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 names_same EE' SG'
 < NS': apply IH to _ _ _ _ _ _ Ev2 Sec2.

Subgoal 2.8.1:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond L Scope2 SG2
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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)
NS1 : names_same ([]::(Scope::EE)) ([]::SG')
NS' : names_same (Scope1::EE3) (Scope2::SG2)
============================
 names_same EE' SG'
 < apply secure_older_scopes to _ _ _ Sec2.

Subgoal 2.8.1:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond L Scope'
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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')
NS1 : names_same ([]::(Scope::EE)) ([]::SG')
NS' : names_same (Scope1::EE3) (Scope'::SG')
H3 : forall X L, lookup [] X L -> lookup Scope' X L
============================
 names_same EE' SG'
 < NS+: case NS'.

Subgoal 2.8.1:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond L Scope'
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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')
NS1 : names_same ([]::(Scope::EE)) ([]::SG')
H3 : 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 EE3 SG'
============================
 names_same EE' SG'
 < IsEE4+: apply evalStmt_isCtx to _ _ _ Ev2.

Subgoal 2.8.1:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond L Scope'
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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')
NS1 : names_same ([]::(Scope::EE)) ([]::SG')
H3 : 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 EE3 SG'
IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE3)
============================
 names_same EE' SG'
 < case IsEE4+.

Subgoal 2.8.1:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond L Scope'
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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')
NS1 : names_same ([]::(Scope::EE)) ([]::SG')
H3 : 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 EE3 SG'
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 names_same EE' SG'
 < case NS.

Subgoal 2.8.1:

Variables: SF FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond L Scope' BRest B
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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))
NS1 : names_same ([]::(Scope::EE)) ([]::(B::BRest))
H3 : 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 EE3 (B::BRest)
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
H8 : names_same EE BRest
============================
 names_same EE' (B::BRest)
 < case NS+2.

Subgoal 2.8.1:

Variables: SF FE Scope EE EE' O O2 Scope1 O3 O4 O12 Body Cond L Scope' BRest B ARest A
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::(A::ARest)) O3 *
Ev3 : evalStmt FE (A::ARest) (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))
NS1 : names_same ([]::(Scope::EE)) ([]::(B::BRest))
H3 : 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
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) (A::ARest)
H6 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
H8 : names_same EE BRest
H9 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H10 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H11 : names_same ARest BRest
============================
 names_same EE' (B::BRest)
 < apply IH to _ _ _ _ _ _ Ev3 Sec.

Subgoal 2.8.1:

Variables: SF FE Scope EE EE' O O2 Scope1 O3 O4 O12 Body Cond L Scope' BRest B ARest A
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::(A::ARest)) O3 *
Ev3 : evalStmt FE (A::ARest) (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))
NS1 : names_same ([]::(Scope::EE)) ([]::(B::BRest))
H3 : 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
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) (A::ARest)
H6 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
H8 : names_same EE BRest
H9 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H10 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H11 : names_same ARest BRest
H12 : names_same EE' (B::BRest)
============================
 names_same EE' (B::BRest)
 < search.

Subgoal 2.8.2:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond Scope2 SG2
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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'
 < NS1: apply names_same_add_scope to NS.

Subgoal 2.8.2:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond Scope2 SG2
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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)
NS1 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 names_same EE' SG'
 < NS': apply IH to _ _ _ _ _ _ Ev2 Sec2.

Subgoal 2.8.2:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond Scope2 SG2
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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)
NS1 : names_same ([]::(Scope::EE)) ([]::SG')
NS' : names_same (Scope1::EE3) (Scope2::SG2)
============================
 names_same EE' SG'
 < apply secure_older_scopes to _ _ _ Sec2.

Subgoal 2.8.2:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond Scope'
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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')
NS1 : names_same ([]::(Scope::EE)) ([]::SG')
NS' : names_same (Scope1::EE3) (Scope'::SG')
H3 : forall X L, lookup [] X L -> lookup Scope' X L
============================
 names_same EE' SG'
 < NS+: case NS'.

Subgoal 2.8.2:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond Scope'
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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')
NS1 : names_same ([]::(Scope::EE)) ([]::SG')
H3 : 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 EE3 SG'
============================
 names_same EE' SG'
 < IsEE4+: apply evalStmt_isCtx to _ _ _ Ev2.

Subgoal 2.8.2:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond Scope'
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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')
NS1 : names_same ([]::(Scope::EE)) ([]::SG')
H3 : 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 EE3 SG'
IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE3)
============================
 names_same EE' SG'
 < case IsEE4+.

Subgoal 2.8.2:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond Scope'
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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')
NS1 : names_same ([]::(Scope::EE)) ([]::SG')
H3 : 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 EE3 SG'
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 names_same EE' SG'
 < case NS.

Subgoal 2.8.2:

Variables: SF FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond Scope' BRest B
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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))
NS1 : names_same ([]::(Scope::EE)) ([]::(B::BRest))
H3 : 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 EE3 (B::BRest)
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
H8 : names_same EE BRest
============================
 names_same EE' (B::BRest)
 < case NS+2.

Subgoal 2.8.2:

Variables: SF FE Scope EE EE' O O2 Scope1 O3 O4 O12 Body Cond Scope' BRest B ARest A
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::(A::ARest)) O3 *
Ev3 : evalStmt FE (A::ARest) (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))
NS1 : names_same ([]::(Scope::EE)) ([]::(B::BRest))
H3 : 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
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) (A::ARest)
H6 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
H8 : names_same EE BRest
H9 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H10 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H11 : names_same ARest BRest
============================
 names_same EE' (B::BRest)
 < apply IH to _ _ _ _ _ _ Ev3 Sec.

Subgoal 2.8.2:

Variables: SF FE Scope EE EE' O O2 Scope1 O3 O4 O12 Body Cond Scope' BRest B ARest A
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::(A::ARest)) O3 *
Ev3 : evalStmt FE (A::ARest) (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))
NS1 : names_same ([]::(Scope::EE)) ([]::(B::BRest))
H3 : 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
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) (A::ARest)
H6 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
H8 : names_same EE BRest
H9 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H10 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H11 : names_same ARest BRest
H12 : names_same EE' (B::BRest)
============================
 names_same EE' (B::BRest)
 < search.

Subgoal 2.9:

Variables: SF SG PC SG' FE Scope EE O Body Cond
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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) (Scope::EE) O @
Sec : secure SF SG PC (while Cond Body) SG'
Ev1 : evalExpr FE (Scope::EE) Cond falseVal O *
============================
 names_same (Scope::EE) SG'
 < case IsS.

Subgoal 2.9:

Variables: SF SG PC SG' FE Scope EE O Body Cond
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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) (Scope::EE) O @
Sec : secure SF SG PC (while Cond Body) SG'
Ev1 : evalExpr FE (Scope::EE) Cond falseVal O *
H1 : is_expr Cond
H2 : is_stmt Body
============================
 names_same (Scope::EE) SG'
 < Sec: case Sec.

Subgoal 2.9.1:

Variables: SF SG' FE Scope EE O Body Cond L Scope1 SG2
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) Cond falseVal 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 (Scope::EE) SG'
 < search.

Subgoal 2.9.2:

Variables: SF SG' FE Scope EE O Body Cond Scope1 SG2
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) Cond falseVal 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 (Scope::EE) SG'
 < search.

Subgoal 2.10:

Variables: SF SG PC SG' FE Scope EE EE' O Scope1 S1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 2.10:

Variables: SF SG PC SG' FE Scope EE EE' O Scope1 S1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 2.10:

Variables: SF SG PC SG' FE Scope EE EE' O Scope1 S1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 2.10:

Variables: SF PC SG' FE Scope EE EE' O Scope1 S1 Scope2
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 IH to _ _ _ _ _ _ Ev1 Sec.

Subgoal 2.10:

Variables: SF PC SG' FE Scope EE EE' O Scope1 S1 Scope2
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 2.10:

Variables: SF PC SG' FE Scope EE EE' O Scope1 S1 Scope2
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 2.10:

Variables: SF PC SG' FE Scope EE EE' O Scope1 S1 Scope'
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 2.11:

Variables: SF SG PC SG' FE Scope EE O I O2 E
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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) (Scope::EE) O @
Sec : secure SF SG PC (printVal E) SG'
Ev1 : evalExpr FE (Scope::EE) E (intVal I) O2 *
Ev2 : O2 ++ [intVal I] = O
============================
 names_same (Scope::EE) SG'
 < case IsS.

Subgoal 2.11:

Variables: SF SG PC SG' FE Scope EE O I O2 E
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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) (Scope::EE) O @
Sec : secure SF SG PC (printVal E) SG'
Ev1 : evalExpr FE (Scope::EE) E (intVal I) O2 *
Ev2 : O2 ++ [intVal I] = O
H1 : is_expr E
============================
 names_same (Scope::EE) SG'
 < Sec: case Sec.

Subgoal 2.11:

Variables: SF SG' FE Scope EE O I O2 E
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E (intVal I) O2 *
Ev2 : O2 ++ [intVal I] = O
H1 : is_expr E
Sec : level SF SG' public E public
============================
 names_same (Scope::EE) SG'
 < search.

Subgoal 2.12:

Variables: SF SG PC SG' FE Scope EE O O2 E
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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) (Scope::EE) O @
Sec : secure SF SG PC (printVal E) SG'
Ev1 : evalExpr FE (Scope::EE) E trueVal O2 *
Ev2 : O2 ++ [trueVal] = O
============================
 names_same (Scope::EE) SG'
 < case IsS.

Subgoal 2.12:

Variables: SF SG PC SG' FE Scope EE O O2 E
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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) (Scope::EE) O @
Sec : secure SF SG PC (printVal E) SG'
Ev1 : evalExpr FE (Scope::EE) E trueVal O2 *
Ev2 : O2 ++ [trueVal] = O
H1 : is_expr E
============================
 names_same (Scope::EE) SG'
 < Sec: case Sec.

Subgoal 2.12:

Variables: SF SG' FE Scope EE O O2 E
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E trueVal O2 *
Ev2 : O2 ++ [trueVal] = O
H1 : is_expr E
Sec : level SF SG' public E public
============================
 names_same (Scope::EE) SG'
 < search.

Subgoal 2.13:

Variables: SF SG PC SG' FE Scope EE O O2 E
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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) (Scope::EE) O @
Sec : secure SF SG PC (printVal E) SG'
Ev1 : evalExpr FE (Scope::EE) E falseVal O2 *
Ev2 : O2 ++ [falseVal] = O
============================
 names_same (Scope::EE) SG'
 < case IsS.

Subgoal 2.13:

Variables: SF SG PC SG' FE Scope EE O O2 E
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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) (Scope::EE) O @
Sec : secure SF SG PC (printVal E) SG'
Ev1 : evalExpr FE (Scope::EE) E falseVal O2 *
Ev2 : O2 ++ [falseVal] = O
H1 : is_expr E
============================
 names_same (Scope::EE) SG'
 < Sec: case Sec.

Subgoal 2.13:

Variables: SF SG' FE Scope EE O O2 E
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E falseVal O2 *
Ev2 : O2 ++ [falseVal] = O
H1 : is_expr E
Sec : level SF SG' public E public
============================
 names_same (Scope::EE) SG'
 < search.

Subgoal 2.14:

Variables: SF SG PC SG' FE Scope EE O S1 O2 E
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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) (Scope::EE) O @
Sec : secure SF SG PC (printVal E) SG'
Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) O2 *
Ev2 : O2 ++ [stringVal S1] = O
============================
 names_same (Scope::EE) SG'
 < case IsS.

Subgoal 2.14:

Variables: SF SG PC SG' FE Scope EE O S1 O2 E
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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) (Scope::EE) O @
Sec : secure SF SG PC (printVal E) SG'
Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) O2 *
Ev2 : O2 ++ [stringVal S1] = O
H1 : is_expr E
============================
 names_same (Scope::EE) SG'
 < Sec: case Sec.

Subgoal 2.14:

Variables: SF SG' FE Scope EE O S1 O2 E
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) O2 *
Ev2 : O2 ++ [stringVal S1] = O
H1 : is_expr E
Sec : level SF SG' public E public
============================
 names_same (Scope::EE) SG'
 < search.

Subgoal 2.15:

Variables: SF SG PC SG' FE Scope EE O V X E Ty L
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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)::Scope)::EE) O @
Sec : secure SF SG PC (secdecl L Ty X E) SG'
Ev1 : evalExpr FE (Scope::EE) E V O *
============================
 names_same (((X, V)::Scope)::EE) SG'
 < case IsS.

Subgoal 2.15:

Variables: SF SG PC SG' FE Scope EE O V X E Ty L
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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)::Scope)::EE) O @
Sec : secure SF SG PC (secdecl L Ty X E) SG'
Ev1 : evalExpr FE (Scope::EE) E V O *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
============================
 names_same (((X, V)::Scope)::EE) SG'
 < Sec: case Sec.

Subgoal 2.15.1:

Variables: SF PC FE Scope EE O V X E Ty L1 SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
NS : names_same (Scope::EE) (Scope1::SG1)
Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
============================
 names_same (((X, V)::Scope)::EE) (((X, private)::Scope1)::SG1)
 < R: case NS.

Subgoal 2.15.1:

Variables: SF PC FE Scope EE O V X E Ty L1 SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 private Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 names_same (((X, V)::Scope)::EE) (((X, private)::Scope1)::SG1)
 < unfold .

Subgoal 2.15.1.1:

Variables: SF PC FE Scope EE O V X E Ty L1 SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 private Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 forall X1 IA,
   mem (X1, IA) ((X, V)::Scope) -> exists IB,
     mem (X1, IB) ((X, private)::Scope1)
 < intros M.

Subgoal 2.15.1.1:

Variables: SF PC FE Scope EE O V X E Ty L1 SG1 Scope1 X1 IA
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 private Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IA) ((X, V)::Scope)
============================
 exists IB, mem (X1, IB) ((X, private)::Scope1)
 < M: case M.

Subgoal 2.15.1.1.1:

Variables: SF PC FE Scope EE O V X E Ty L1 SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 private Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 exists IB, mem (X, IB) ((X, private)::Scope1)
 < search.

Subgoal 2.15.1.1.2:

Variables: SF PC FE Scope EE O V X E Ty L1 SG1 Scope1 X1 IA
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 private Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IA) Scope
============================
 exists IB, mem (X1, IB) ((X, private)::Scope1)
 < apply R to M.

Subgoal 2.15.1.1.2:

Variables: SF PC FE Scope EE O V X E Ty L1 SG1 Scope1 X1 IA IB
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 private Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IA) Scope
H5 : mem (X1, IB) Scope1
============================
 exists IB, mem (X1, IB) ((X, private)::Scope1)
 < search.

Subgoal 2.15.1.2:

Variables: SF PC FE Scope EE O V X E Ty L1 SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 private Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 forall X1 IB,
   mem (X1, IB) ((X, private)::Scope1) -> exists IA,
     mem (X1, IA) ((X, V)::Scope)
 < intros M.

Subgoal 2.15.1.2:

Variables: SF PC FE Scope EE O V X E Ty L1 SG1 Scope1 X1 IB
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 private Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IB) ((X, private)::Scope1)
============================
 exists IA, mem (X1, IA) ((X, V)::Scope)
 < M: case M.

Subgoal 2.15.1.2.1:

Variables: SF PC FE Scope EE O V X E Ty L1 SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 private Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 exists IA, mem (X, IA) ((X, V)::Scope)
 < search.

Subgoal 2.15.1.2.2:

Variables: SF PC FE Scope EE O V X E Ty L1 SG1 Scope1 X1 IB
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 private Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IB) Scope1
============================
 exists IA, mem (X1, IA) ((X, V)::Scope)
 < apply R1 to M.

Subgoal 2.15.1.2.2:

Variables: SF PC FE Scope EE O V X E Ty L1 SG1 Scope1 X1 IB IA
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 private Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IB) Scope1
H5 : mem (X1, IA) Scope
============================
 exists IA, mem (X1, IA) ((X, V)::Scope)
 < search.

Subgoal 2.15.1.3:

Variables: SF PC FE Scope EE O V X E Ty L1 SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 private Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 names_same EE SG1
 < search.

Subgoal 2.15.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
NS : names_same (Scope::EE) (Scope1::SG1)
Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
============================
 names_same (((X, V)::Scope)::EE) (((X, public)::Scope1)::SG1)
 < R: case NS.

Subgoal 2.15.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 public Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 names_same (((X, V)::Scope)::EE) (((X, public)::Scope1)::SG1)
 < unfold .

Subgoal 2.15.2.1:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 public Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 forall X1 IA,
   mem (X1, IA) ((X, V)::Scope) -> exists IB, mem (X1, IB) ((X, public)::Scope1)
 < intros M.

Subgoal 2.15.2.1:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1 X1 IA
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 public Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IA) ((X, V)::Scope)
============================
 exists IB, mem (X1, IB) ((X, public)::Scope1)
 < M: case M.

Subgoal 2.15.2.1.1:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 public Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 exists IB, mem (X, IB) ((X, public)::Scope1)
 < search.

Subgoal 2.15.2.1.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1 X1 IA
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 public Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IA) Scope
============================
 exists IB, mem (X1, IB) ((X, public)::Scope1)
 < apply R to M.

Subgoal 2.15.2.1.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1 X1 IA IB
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 public Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IA) Scope
H5 : mem (X1, IB) Scope1
============================
 exists IB, mem (X1, IB) ((X, public)::Scope1)
 < search.

Subgoal 2.15.2.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 public Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 forall X1 IB,
   mem (X1, IB) ((X, public)::Scope1) -> exists IA, mem (X1, IA) ((X, V)::Scope)
 < intros M.

Subgoal 2.15.2.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1 X1 IB
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 public Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IB) ((X, public)::Scope1)
============================
 exists IA, mem (X1, IA) ((X, V)::Scope)
 < M: case M.

Subgoal 2.15.2.2.1:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 public Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 exists IA, mem (X, IA) ((X, V)::Scope)
 < search.

Subgoal 2.15.2.2.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1 X1 IB
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 public Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IB) Scope1
============================
 exists IA, mem (X1, IA) ((X, V)::Scope)
 < apply R1 to M.

Subgoal 2.15.2.2.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1 X1 IB IA
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 public Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
M : mem (X1, IB) Scope1
H5 : mem (X1, IA) Scope
============================
 exists IA, mem (X1, IA) ((X, V)::Scope)
 < search.

Subgoal 2.15.2.3:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG'
IsSF : is_list (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)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 public Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
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
R : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
R1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
R2 : names_same EE SG1
============================
 names_same EE SG1
 < search.

Subgoal 2.16:

Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 2.16:

Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 2.16:

Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 2.16:

Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 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 S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 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 S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 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 S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 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 S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 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 S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 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 S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 2.16:

Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 2.16:

Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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 IH to _ _ _ _ _ _ Ev3 Sec2.

Subgoal 2.16:

Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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_exists to Ev2 Ev1 _ _ _ Ev.

Subgoal 2.16:

Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 EE''
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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
============================
 names_same EE' SG'
 < SS: apply proj_evalStmt_rel to Ev2 Ev1 _ _ _ Ev EvP.

Subgoal 2.16:

Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 EE''
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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
SS : scopes_same EE' EE''
============================
 names_same EE' SG'
 < apply evalStmt_unique to _ _ _ EvP Ev3.

Subgoal 2.16:

Variables: SF SG PC SG' FE Scope EE EE' Names S_P EE_P O_P Names1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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
SS : scopes_same EE' EE_P
============================
 names_same EE' SG'
 < apply evalStmt_isCtx to _ _ _ Ev.

Subgoal 2.16:

Variables: SF SG PC SG' FE Scope EE EE' Names S_P EE_P O_P Names1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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
SS : 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 2.16:

Variables: SF SG PC SG' FE Scope EE EE' Names S_P EE_P O_P Names1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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
SS : 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 SS.

Subgoal 2.16:

Variables: SF SG PC SG' FE Scope EE EE' Names S_P EE_P O_P Names1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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
SS : 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 2.16:

Variables: SF SG PC SG' FE Scope EE EE' Names S_P EE_P O_P Names1
IH : forall S SF SG PC SG' FE Scope EE EE' O,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) SG ->
       evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> 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
SS : 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.

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.

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.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'
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 2.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'
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 2.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'
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 2.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'
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 2.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'
IsSF : is_list (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 2.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'
IsSF : is_list (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 2.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'
IsSF : is_list (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 2.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'
IsSF : is_list (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 2.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'
IsSF : is_list (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 2.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'
IsSF : is_list (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 2.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'
IsSF : is_list (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 2.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'
IsSF : is_list (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 2.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'
IsSF : is_list (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 2.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'
IsSF : is_list (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 2.3:

Variables: SF SScope SG PC SG' FE Scope EE' O 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'
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)::Scope)::EE') O @
Sec : secure SF (SScope::SG) PC (declare Ty X E) SG'
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE') E V O *
============================
 public_equiv SG EE' EE'
 < case IsS.

Subgoal 2.3:

Variables: SF SScope SG PC SG' FE Scope EE' O 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'
IsSF : is_list (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)::Scope)::EE') O @
Sec : secure SF (SScope::SG) PC (declare Ty X E) SG'
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE') E V O *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
============================
 public_equiv SG EE' EE'
 < Sec: case Sec.

Subgoal 2.3:

Variables: SF SScope SG FE Scope EE' O 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'
IsSF : is_list (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)::Scope)::EE') O @
NEq : public = public -> false
Ev1 : evalExpr FE (Scope::EE') E V 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 2.4:

Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O V 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'
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 O *
Ev2 : replaceScopes X V (Scope::EE) (Scope'::EE')
============================
 public_equiv SG EE EE'
 < case IsS.

Subgoal 2.4:

Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O V 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'
IsSF : is_list (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 O *
Ev2 : replaceScopes X V (Scope::EE) (Scope'::EE')
H1 : is_string X
H2 : is_expr E
============================
 public_equiv SG EE EE'
 < Sec: case Sec.

Subgoal 2.4.1:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O V 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'
IsSF : is_list (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 O *
Ev2 : replaceScopes X V (Scope::EE) (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'
 < PE1: apply replaceScopes_public_equiv to _ Ev2 Sec1 _.

Subgoal 2.4.1:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O V 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'
IsSF : is_list (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 O *
Ev2 : replaceScopes X V (Scope::EE) (Scope'::EE')
H1 : is_string X
H2 : is_expr E
Sec : level SF (SScope::SG) PC E L
Sec1 : lookupScopes X (SScope::SG) private
PE1 : public_equiv (SScope::SG) (Scope::EE) (Scope'::EE')
============================
 public_equiv SG EE EE'
 < case PE1.

Subgoal 2.4.1:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O V 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'
IsSF : is_list (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 O *
Ev2 : replaceScopes X V (Scope::EE) (Scope'::EE')
H1 : is_string X
H2 : is_expr E
Sec : level SF (SScope::SG) PC E L
Sec1 : lookupScopes X (SScope::SG) private
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 2.4.2:

Variables: SF SScope SG FE Scope EE Scope' EE' O V 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'
IsSF : is_list (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 O *
Ev2 : replaceScopes X V (Scope::EE) (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 2.5:

Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O V 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'
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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) (Scope'::EE')
============================
 public_equiv SG EE EE'
 < case IsS.

Subgoal 2.5:

Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O V 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'
IsSF : is_list (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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) (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 2.5.1:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O V 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'
IsSF : is_list (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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) (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'
 < PE1: apply replaceScopes_public_equiv to _ Ev4 Sec1 _.

Subgoal 2.5.1:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O V 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'
IsSF : is_list (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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) (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
PE1 : public_equiv (SScope::SG) (Scope::EE) (Scope'::EE')
============================
 public_equiv SG EE EE'
 < case PE1.

Subgoal 2.5.1:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O V 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'
IsSF : is_list (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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) (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
H4 : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope' X V
H5 : forall X V, lookup SScope X public -> lookup Scope' X V -> lookup Scope X V
H6 : public_equiv SG EE EE'
============================
 public_equiv SG EE EE'
 < search.

Subgoal 2.5.2:

Variables: SF SScope SG FE Scope EE Scope' EE' O V 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'
IsSF : is_list (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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) (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 2.6:

Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O 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'
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Th (Scope1::(Scope'::EE')) O3 *
Ev3 : O2 ++ O3 = O
============================
 public_equiv SG EE EE'
 < case IsS.

Subgoal 2.6:

Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 2.6:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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'
 < apply level_is to _ _ _ Sec.

Subgoal 2.6:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
============================
 public_equiv SG EE EE'
 < assert Sl1 = public -> false.

Subgoal 2.6.1:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
============================
 Sl1 = public -> false
 < intros E.

Subgoal 2.6.1:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
E : Sl1 = public
============================
 false
 < case E.

Subgoal 2.6.1:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : is_slev L
============================
 false
 < apply join_public to _ _ Sec1.

Subgoal 2.6.1:

Variables: SF SScope SG FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : is_slev public
============================
 false
 < backchain NEq.

Subgoal 2.6:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
============================
 public_equiv SG EE EE'
 < apply names_same_add_scope to NS.

Subgoal 2.6:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H6 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
============================
 public_equiv SG EE EE'
 < apply join_is to _ _ Sec1.

Subgoal 2.6:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H6 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
H7 : is_slev Sl1
============================
 public_equiv SG EE EE'
 < PE2: apply IH_S to _ _ _ _ _ _ _ Ev2 Sec2 _.

Subgoal 2.6:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H6 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
H7 : is_slev Sl1
PE2 : public_equiv (SScope::SG) (Scope::EE) (Scope'::EE')
============================
 public_equiv SG EE EE'
 < PE2': case PE2.

Subgoal 2.6:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H6 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
H7 : is_slev Sl1
PE2' : forall X V,
         lookup SScope X public -> lookup Scope X V -> lookup Scope' X V
PE2'1 : forall X V,
          lookup SScope X public -> lookup Scope' X V -> lookup Scope X V
PE2'2 : public_equiv SG EE EE'
============================
 public_equiv SG EE EE'
 < search.

Subgoal 2.7:

Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O 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'
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) El (Scope1::(Scope'::EE')) O3 *
Ev3 : O2 ++ O3 = O
============================
 public_equiv SG EE EE'
 < case IsS.

Subgoal 2.7:

Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 2.7:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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'
 < apply level_is to _ _ _ Sec.

Subgoal 2.7:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
============================
 public_equiv SG EE EE'
 < assert Sl1 = public -> false.

Subgoal 2.7.1:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
============================
 Sl1 = public -> false
 < intros E.

Subgoal 2.7.1:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
E : Sl1 = public
============================
 false
 < case E.

Subgoal 2.7.1:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : is_slev L
============================
 false
 < apply join_public to _ _ Sec1.

Subgoal 2.7.1:

Variables: SF SScope SG FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : is_slev public
============================
 false
 < backchain NEq.

Subgoal 2.7:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
============================
 public_equiv SG EE EE'
 < apply names_same_add_scope to NS.

Subgoal 2.7:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H6 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
============================
 public_equiv SG EE EE'
 < apply join_is to _ _ Sec1.

Subgoal 2.7:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H6 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
H7 : is_slev Sl1
============================
 public_equiv SG EE EE'
 < PE2: apply IH_S to _ _ _ _ _ _ _ Ev2 Sec3 _.

Subgoal 2.7:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H6 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
H7 : is_slev Sl1
PE2 : public_equiv (SScope::SG) (Scope::EE) (Scope'::EE')
============================
 public_equiv SG EE EE'
 < PE2': case PE2.

Subgoal 2.7:

Variables: SF SScope SG PC FE Scope EE Scope' EE' O 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H6 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
H7 : is_slev Sl1
PE2' : forall X V,
         lookup SScope X public -> lookup Scope X V -> lookup Scope' X V
PE2'1 : forall X V,
          lookup SScope X public -> lookup Scope' X V -> lookup Scope X V
PE2'2 : public_equiv SG EE EE'
============================
 public_equiv SG EE EE'
 < search.

Subgoal 2.8:

Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O O2 Scope1 EE3 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'
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (while Cond Body) (Scope'::EE') O4 *
Ev4 : O2 ++ O3 = O12
Ev5 : O12 ++ O4 = O
============================
 public_equiv SG EE EE'
 < case IsS.

Subgoal 2.8:

Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O O2 Scope1 EE3 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 2.8.1:

Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 EE3 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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'
 < apply level_is to _ _ _ Sec1.

Subgoal 2.8.1:

Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 EE3 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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
============================
 public_equiv SG EE EE'
 < apply names_same_add_scope to NS.

Subgoal 2.8.1:

Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 EE3 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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
H4 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
============================
 public_equiv SG EE EE'
 < PE2: apply IH_S to _ _ _ _ _ _ _ Ev2 Sec2 _.

Subgoal 2.8.1:

Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 EE3 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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
H4 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
PE2 : public_equiv (SScope::SG) (Scope::EE) EE3
============================
 public_equiv SG EE EE'
 < PE2': case PE2.

Subgoal 2.8.1:

Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L Scope2 SG2 G2 Scope4
IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC ->
         is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) (SScope::SG) ->
         evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' ->
         (PC = public -> false) -> public_equiv SG EE EE'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
PE2' : forall X V,
         lookup SScope X public -> lookup Scope X V -> lookup Scope4 X V
PE2'1 : forall X V,
          lookup SScope X public -> lookup Scope4 X V -> lookup Scope X V
PE2'2 : public_equiv SG EE G2
============================
 public_equiv SG EE EE'
 < NS+: apply secure_eval_names_same to _ _ _ _ _ _ Ev2 Sec2.

Subgoal 2.8.1:

Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L Scope2 SG2 G2 Scope4
IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC ->
         is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) (SScope::SG) ->
         evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' ->
         (PC = public -> false) -> public_equiv SG EE EE'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
PE2' : forall X V,
         lookup SScope X public -> lookup Scope X V -> lookup Scope4 X V
PE2'1 : forall X V,
          lookup SScope X public -> lookup Scope4 X V -> lookup Scope X V
PE2'2 : 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 2.8.1:

Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L Scope2 SG2 G2 Scope4
IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC ->
         is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) (SScope::SG) ->
         evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' ->
         (PC = public -> false) -> public_equiv SG EE EE'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
PE2' : forall X V,
         lookup SScope X public -> lookup Scope X V -> lookup Scope4 X V
PE2'1 : forall X V,
          lookup SScope X public -> lookup Scope4 X V -> lookup Scope X V
PE2'2 : 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 2.8.1:

Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L Scope2 SG2 G2 Scope4
IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC ->
         is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> names_same (Scope::EE) (SScope::SG) ->
         evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' ->
         (PC = public -> false) -> public_equiv SG EE EE'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
PE2' : forall X V,
         lookup SScope X public -> lookup Scope X V -> lookup Scope4 X V
PE2'1 : forall X V,
          lookup SScope X public -> lookup Scope4 X V -> lookup Scope X V
PE2'2 : public_equiv SG EE G2
NS+ : names_same (Scope1::(Scope4::G2)) (Scope2::SG2)
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) (Scope4::G2)
============================
 public_equiv SG EE EE'
 < apply secure_older_scopes to _ _ _ Sec2.

Subgoal 2.8.1:

Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L G2 Scope4 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
PE2' : forall X V,
         lookup SScope X public -> lookup Scope X V -> lookup Scope4 X V
PE2'1 : forall X V,
          lookup SScope X public -> lookup Scope4 X V -> lookup Scope X V
PE2'2 : public_equiv SG EE G2
NS+ : names_same (Scope1::(Scope4::G2)) (Scope'1::(SScope::SG))
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) (Scope4::G2)
H7 : forall X L, lookup [] X L -> lookup Scope'1 X L
============================
 public_equiv SG EE EE'
 < case NS+.

Subgoal 2.8.1:

Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L G2 Scope4 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
PE2' : forall X V,
         lookup SScope X public -> lookup Scope X V -> lookup Scope4 X V
PE2'1 : forall X V,
          lookup SScope X public -> lookup Scope4 X V -> lookup Scope X V
PE2'2 : public_equiv SG EE G2
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) (Scope4::G2)
H7 : forall X L, lookup [] X L -> lookup Scope'1 X L
H8 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope'1
H9 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) Scope1
H10 : names_same (Scope4::G2) (SScope::SG)
============================
 public_equiv SG EE EE'
 < PE4: apply IH_S to _ _ _ _ _ _ _ Ev3 Sec _.

Subgoal 2.8.1:

Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L G2 Scope4 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
PE2' : forall X V,
         lookup SScope X public -> lookup Scope X V -> lookup Scope4 X V
PE2'1 : forall X V,
          lookup SScope X public -> lookup Scope4 X V -> lookup Scope X V
PE2'2 : public_equiv SG EE G2
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) (Scope4::G2)
H7 : forall X L, lookup [] X L -> lookup Scope'1 X L
H8 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope'1
H9 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) Scope1
H10 : names_same (Scope4::G2) (SScope::SG)
PE4 : public_equiv SG G2 EE'
============================
 public_equiv SG EE EE'
 < apply public_equiv_trans to PE2'2 PE4.

Subgoal 2.8.1:

Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L G2 Scope4 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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
H4 : names_same ([]::(Scope::EE)) ([]::(SScope::SG))
PE2' : forall X V,
         lookup SScope X public -> lookup Scope X V -> lookup Scope4 X V
PE2'1 : forall X V,
          lookup SScope X public -> lookup Scope4 X V -> lookup Scope X V
PE2'2 : public_equiv SG EE G2
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) (Scope4::G2)
H7 : forall X L, lookup [] X L -> lookup Scope'1 X L
H8 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope'1
H9 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) Scope1
H10 : names_same (Scope4::G2) (SScope::SG)
PE4 : public_equiv SG G2 EE'
H11 : public_equiv SG EE EE'
============================
 public_equiv SG EE EE'
 < search.

Subgoal 2.8.2:

Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 EE3 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'
IsSF : is_list (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 2.9:

Variables: SF SScope SG PC SG' FE 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'
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 O *
============================
 public_equiv SG EE' EE'
 < case IsS.

Subgoal 2.9:

Variables: SF SScope SG PC SG' FE 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'
IsSF : is_list (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 O *
H1 : is_expr Cond
H2 : is_stmt Body
============================
 public_equiv SG EE' EE'
 < Sec: case Sec (keep).

Subgoal 2.9.1:

Variables: SF SScope SG FE 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'
IsSF : is_list (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 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'
 < case NS.

Subgoal 2.9.1:

Variables: SF SScope SG FE 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'
IsSF : is_list (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')
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 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 IA, mem (X, IA) Scope' -> exists IB, mem (X, IB) SScope
H4 : forall X IB, mem (X, IB) SScope -> exists IA, mem (X, IA) Scope'
H5 : names_same EE' SG
============================
 public_equiv SG EE' EE'
 < backchain public_equiv_refl.

Subgoal 2.9.2:

Variables: SF SScope SG FE 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'
IsSF : is_list (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 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 2.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'
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 2.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'
IsSF : is_list (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 2.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'
IsSF : is_list (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 2.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'
IsSF : is_list (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 2.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'
IsSF : is_list (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 2.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'
IsSF : is_list (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 2.11:

Variables: SF SScope SG PC SG' FE 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'
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) O2 *
Ev2 : O2 ++ [intVal I] = O
============================
 public_equiv SG EE' EE'
 < case Sec.

Subgoal 2.11:

Variables: SF SScope SG FE 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'
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) O2 *
Ev2 : O2 ++ [intVal I] = O
H1 : level SF (SScope::SG) public E public
============================
 public_equiv SG EE' EE'
 < apply NEq to _.

Subgoal 2.12:

Variables: SF SScope SG PC SG' FE 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'
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 O2 *
Ev2 : O2 ++ [trueVal] = O
============================
 public_equiv SG EE' EE'
 < case Sec.

Subgoal 2.12:

Variables: SF SScope SG FE 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'
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 O2 *
Ev2 : O2 ++ [trueVal] = O
H1 : level SF (SScope::SG) public E public
============================
 public_equiv SG EE' EE'
 < apply NEq to _.

Subgoal 2.13:

Variables: SF SScope SG PC SG' FE 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'
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 O2 *
Ev2 : O2 ++ [falseVal] = O
============================
 public_equiv SG EE' EE'
 < case Sec.

Subgoal 2.13:

Variables: SF SScope SG FE 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'
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 O2 *
Ev2 : O2 ++ [falseVal] = O
H1 : level SF (SScope::SG) public E public
============================
 public_equiv SG EE' EE'
 < apply NEq to _.

Subgoal 2.14:

Variables: SF SScope SG PC SG' FE 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'
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) O2 *
Ev2 : O2 ++ [stringVal S1] = O
============================
 public_equiv SG EE' EE'
 < case Sec.

Subgoal 2.14:

Variables: SF SScope SG FE 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'
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) O2 *
Ev2 : O2 ++ [stringVal S1] = O
H1 : level SF (SScope::SG) public E public
============================
 public_equiv SG EE' EE'
 < apply NEq to _.

Subgoal 2.15:

Variables: SF SScope SG PC SG' FE Scope EE' O 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'
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)::Scope)::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 O *
============================
 public_equiv SG EE' EE'
 < case IsS.

Subgoal 2.15:

Variables: SF SScope SG PC SG' FE Scope EE' O 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'
IsSF : is_list (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)::Scope)::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 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 2.15.1:

Variables: SF SScope SG PC FE Scope EE' O 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'
IsSF : is_list (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)::Scope)::EE') O @
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE') E V 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'
 < case NS.

Subgoal 2.15.1:

Variables: SF SScope SG PC FE Scope EE' O 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'
IsSF : is_list (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') (secdecl private Ty X E) (((X, V)::Scope)::EE') O @
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE') E V 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 IA, mem (X, IA) Scope -> exists IB, mem (X, IB) SScope
H6 : forall X IB, mem (X, IB) SScope -> exists IA, mem (X, IA) Scope
H7 : names_same EE' SG
============================
 public_equiv SG EE' EE'
 < backchain public_equiv_refl.

Subgoal 2.15.2:

Variables: SF SScope SG FE Scope EE' O 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'
IsSF : is_list (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)::Scope)::EE') O @
NEq : public = public -> false
Ev1 : evalExpr FE (Scope::EE') E V 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'
 < case NS.

Subgoal 2.15.2:

Variables: SF SScope SG FE Scope EE' O 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'
IsSF : is_list (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')
Ev : evalStmt FE (Scope::EE') (secdecl public Ty X E) (((X, V)::Scope)::EE') O @
NEq : public = public -> false
Ev1 : evalExpr FE (Scope::EE') E V 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 IA, mem (X, IA) Scope -> exists IB, mem (X, IB) SScope
H6 : forall X IB, mem (X, IB) SScope -> exists IA, mem (X, IA) Scope
H7 : names_same EE' SG
============================
 public_equiv SG EE' EE'
 < backchain public_equiv_refl.

Subgoal 2.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'
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 2.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'
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 2.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'
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 2.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'
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 2.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'
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 2.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'
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 2.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'
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 2.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'
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 2.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'
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 2.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'
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 2.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'
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 2.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'
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 2.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'
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 2.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'
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 2.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'
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 2.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'
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'
 < EvP: apply proj_evalStmt_exists to Ev2 Ev1 _ _ _ Ev.

Subgoal 2.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'
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
EvP : evalStmt FE (Scope::EE) S_P EE'' O
============================
 public_equiv SG EE EE'
 < SS: apply proj_evalStmt_rel to Ev2 Ev1 _ _ _ Ev EvP.

Subgoal 2.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'
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
EvP : evalStmt FE (Scope::EE) S_P EE'' O
SS : scopes_same (Scope'::EE') EE''
============================
 public_equiv SG EE EE'
 < apply evalStmt_unique to _ _ _ EvP Ev3.

Subgoal 2.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'
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
EvP : evalStmt FE (Scope::EE) S_P (A::ARest) O_P
SS : scopes_same (Scope'::EE') (A::ARest)
============================
 public_equiv SG EE EE'
 < SS': case SS.

Subgoal 2.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'
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
EvP : 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 2.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'
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
EvP : 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.

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 O2 Scope EE1 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 O2 *
Ev1 : evalStmt FE ([]::EE) Body (Scope::EE1) O3 *
Ev2 : evalStmt FE EE1 (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 O2 Scope EE1 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 O2 *
Ev1 : evalStmt FE ([]::EE) Body (Scope::EE1) O3 *
Ev2 : evalStmt FE EE1 (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 O2 Scope EE1 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 O2 *
Ev1 : evalStmt FE ([]::EE) Body (Scope::EE1) O3 *
Ev2 : evalStmt FE EE1 (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
 < apply names_same_add_scope to NS.

Subgoal 1.1:

Variables: SF SG' L Cond Body FE EE EE2 O O2 Scope EE1 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 O2 *
Ev1 : evalStmt FE ([]::EE) Body (Scope::EE1) O3 *
Ev2 : evalStmt FE EE1 (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)
H1 : names_same ([]::EE) ([]::SG')
============================
 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 O2 Scope EE1 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 O2 *
Ev1 : evalStmt FE ([]::EE) Body (Scope::EE1) O3 *
Ev2 : evalStmt FE EE1 (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)
H1 : names_same ([]::EE) ([]::SG')
PE2 : public_equiv SG' EE EE1
============================
 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 O2 Scope EE1 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 O2 *
Ev1 : evalStmt FE ([]::EE) Body (Scope::EE1) O3 *
Ev2 : evalStmt FE EE1 (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)
H1 : names_same ([]::EE) ([]::SG')
PE2 : public_equiv SG' EE EE1
NS'' : names_same (Scope::EE1) (Scope1::SG2)
============================
 public_equiv SG' EE EE2
 < case NS''.

Subgoal 1.1:

Variables: SF SG' L Cond Body FE EE EE2 O O2 Scope EE1 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 O2 *
Ev1 : evalStmt FE ([]::EE) Body (Scope::EE1) O3 *
Ev2 : evalStmt FE EE1 (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)
H1 : names_same ([]::EE) ([]::SG')
PE2 : public_equiv SG' EE EE1
H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1
H3 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope
H4 : names_same EE1 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 O2 Scope EE1 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 O2 *
Ev1 : evalStmt FE ([]::EE) Body (Scope::EE1) O3 *
Ev2 : evalStmt FE EE1 (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')
H1 : names_same ([]::EE) ([]::SG')
PE2 : public_equiv SG' EE EE1
H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope'
H3 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope
H4 : names_same EE1 SG'
H5 : 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 O2 Scope EE1 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 O2 *
Ev1 : evalStmt FE ([]::EE) Body (Scope::EE1) O3 *
Ev2 : evalStmt FE EE1 (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')
H1 : names_same ([]::EE) ([]::SG')
PE2 : public_equiv SG' EE EE1
H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope'
H3 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope
H4 : names_same EE1 SG'
H5 : forall X L, lookup [] X L -> lookup Scope' X L
IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
 public_equiv SG' EE EE2
 < case IsEE4+.

Subgoal 1.1:

Variables: SF SG' L Cond Body FE EE EE2 O O2 Scope EE1 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 O2 *
Ev1 : evalStmt FE ([]::EE) Body (Scope::EE1) O3 *
Ev2 : evalStmt FE EE1 (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')
H1 : names_same ([]::EE) ([]::SG')
PE2 : public_equiv SG' EE EE1
H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope'
H3 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope
H4 : names_same EE1 SG'
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 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 O2 Scope EE1 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 O2 *
Ev1 : evalStmt FE ([]::EE) Body (Scope::EE1) O3 *
Ev2 : evalStmt FE EE1 (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')
H1 : names_same ([]::EE) ([]::SG')
PE2 : public_equiv SG' EE EE1
H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope'
H3 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope
H4 : names_same EE1 SG'
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
PE4 : public_equiv SG' EE1 EE2
============================
 public_equiv SG' EE EE2
 < apply public_equiv_trans to PE2 PE4.

Subgoal 1.1:

Variables: SF SG' L Cond Body FE EE EE2 O O2 Scope EE1 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 O2 *
Ev1 : evalStmt FE ([]::EE) Body (Scope::EE1) O3 *
Ev2 : evalStmt FE EE1 (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')
H1 : names_same ([]::EE) ([]::SG')
PE2 : public_equiv SG' EE EE1
H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope'
H3 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope
H4 : names_same EE1 SG'
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
PE4 : public_equiv SG' EE1 EE2
H8 : public_equiv SG' EE EE2
============================
 public_equiv SG' EE EE2
 < search.

Subgoal 1.2:

Variables: SF SG' L Cond Body FE EE EE2 O O2 Scope EE1 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 O2 *
Ev1 : evalStmt FE ([]::EE) Body (Scope::EE1) O3 *
Ev2 : evalStmt FE EE1 (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 O2 Scope EE1 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 O2 *
Ev1 : evalStmt FE ([]::EE) Body (Scope::EE1) O3 *
Ev2 : evalStmt FE EE1 (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 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)) EE2
NS : names_same EE2 SG
Sec : secure SF SG PC (while Cond Body) SG'
Lev : level SF SG PC Cond L
NEq : L = public -> false
Ev : evalExpr FE EE2 Cond falseVal O *
============================
 public_equiv SG EE2 EE2
 < Sec: case Sec (keep).

Subgoal 2.1:

Variables: SF SG' L Cond Body FE 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)) EE2
NS : names_same EE2 SG'
Sec : secure SF SG' private (while Cond Body) SG'
Lev : level SF SG' private Cond L
NEq : L = public -> false
Ev : evalExpr FE EE2 Cond falseVal O *
Sec1 : level SF SG' private Cond L1
Sec2 : secure SF ([]::SG') private Body (Scope::SG2)
============================
 public_equiv SG' EE2 EE2
 < backchain public_equiv_refl.

Subgoal 2.2:

Variables: SF SG' L Cond Body FE 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)) EE2
NS : names_same EE2 SG'
Sec : secure SF SG' public (while Cond Body) SG'
Lev : level SF SG' public Cond L
NEq : L = public -> false
Ev : evalExpr FE EE2 Cond falseVal O *
Sec1 : level SF SG' public Cond public
Sec2 : secure SF ([]::SG') public Body (Scope::SG2)
============================
 public_equiv SG' EE2 EE2
 < apply level_unique to _ _ _ _ Sec1 Lev.

Subgoal 2.2:

Variables: SF SG' Cond Body FE 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)) EE2
NS : names_same EE2 SG'
Sec : secure SF SG' public (while Cond Body) SG'
Lev : level SF SG' public Cond public
NEq : public = public -> false
Ev : evalExpr FE EE2 Cond falseVal O *
Sec1 : level SF SG' public Cond public
Sec2 : secure SF ([]::SG') public Body (Scope::SG2)
============================
 public_equiv SG' EE2 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.


 < Theorem expr_level :
     forall E SF SG PC FE EE_A VA OA EE_B VB OB,
       is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
       secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
       public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA OA ->
       evalExpr FE EE_B E VB OB -> VA = VB /\ OA = OB.

============================
 forall E SF SG PC FE EE_A VA OA EE_B VB OB,
   is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
   is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
   secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
   public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA OA ->
   evalExpr FE EE_B E VB OB -> VA = VB /\ OA = OB
 < intros IsE IsSF IsSG IsPC IsFE IsEE_A IsEE_B SF SFC NSA NSB PE Lev EvA EvB.

Variables: E SF SG PC FE EE_A VA OA 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
SF : secFuns SF
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 OA
EvB : evalExpr FE EE_B E VB OB
============================
 VA = VB /\ OA = OB
 < Vars: apply vars_exist to IsE.

Variables: E SF SG PC FE EE_A VA OA EE_B VB OB V
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
SF : secFuns SF
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 OA
EvB : evalExpr FE EE_B E VB OB
Vars : vars E V
============================
 VA = VB /\ OA = OB
 < apply evalExpr_rel to _ _ _ _ EvA EvB Vars _.

Subgoal 1:

Variables: E SF SG PC FE EE_A VA OA EE_B VB OB V
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
SF : secFuns SF
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 OA
EvB : evalExpr FE EE_B E VB OB
Vars : vars E V
============================
 forall X V1, mem X V -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
 < intros M L.

Subgoal 1:

Variables: E SF SG PC FE EE_A VA OA EE_B VB OB V X V1
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
SF : secFuns SF
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 OA
EvB : evalExpr FE EE_B E VB OB
Vars : vars E V
M : mem X V
L : lookupScopes X EE_B V1
============================
 lookupScopes X EE_A V1
 < LP: apply public_vars to _ _ _ _ SF Lev Vars M.

Subgoal 1:

Variables: E SF SG PC FE EE_A VA OA EE_B VB OB V X V1
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
SF : secFuns SF
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 OA
EvB : evalExpr FE EE_B E VB OB
Vars : vars E V
M : mem X V
L : lookupScopes X EE_B V1
LP : lookupScopes X SG public
============================
 lookupScopes X EE_A V1
 < PE': apply public_equiv_symm to PE.

Subgoal 1:

Variables: E SF SG PC FE EE_A VA OA EE_B VB OB V X V1
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
SF : secFuns SF
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 OA
EvB : evalExpr FE EE_B E VB OB
Vars : vars E V
M : mem X V
L : lookupScopes X EE_B V1
LP : lookupScopes X SG public
PE' : public_equiv SG EE_B EE_A
============================
 lookupScopes X EE_A V1
 < apply public_equiv_lookupScopes to PE' _ _ _ LP L.

Subgoal 1:

Variables: E SF SG PC FE EE_A VA OA EE_B VB OB V X V1
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
SF : secFuns SF
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 OA
EvB : evalExpr FE EE_B E VB OB
Vars : vars E V
M : mem X V
L : lookupScopes X EE_B V1
LP : lookupScopes X SG public
PE' : public_equiv SG EE_B EE_A
H1 : lookupScopes X EE_A V1
============================
 lookupScopes X EE_A V1
 < search.

Variables: E SF SG PC FE EE_A EE_B VB OB V
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
SF : secFuns SF
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 VB OB
EvB : evalExpr FE EE_B E VB OB
Vars : vars E V
============================
 VB = VB /\ OB = OB
 < search.

Proof completed.
 < Theorem args_level :
     forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
       is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
       secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
       public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> allPublic Ls -> evalArgs FE EE_A A VA OA ->
       evalArgs FE EE_B A VB OB -> VA = VB /\ OA = OB.

============================
 forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
   is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
   is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
   secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
   public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> allPublic Ls -> evalArgs FE EE_A A VA OA ->
   evalArgs FE EE_B A VB OB -> VA = VB /\ OA = OB
 < intros IsA IsSF IsSG IsPC IsFE IsEE_A IsEE_B SF SFC NSA NSB PE Lev AP EvA EvB.

Variables: A SF SG PC Ls FE EE_A VA OA 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
SF : secFuns SF
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
AP : allPublic Ls
EvA : evalArgs FE EE_A A VA OA
EvB : evalArgs FE EE_B A VB OB
============================
 VA = VB /\ OA = OB
 < Vars: apply varsArgs_exist to IsA.

Variables: A SF SG PC Ls FE EE_A VA OA EE_B VB OB V
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
SF : secFuns SF
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
AP : allPublic Ls
EvA : evalArgs FE EE_A A VA OA
EvB : evalArgs FE EE_B A VB OB
Vars : varsArgs A V
============================
 VA = VB /\ OA = OB
 < apply evalArgs_rel to _ _ _ _ EvA EvB Vars _.

Subgoal 1:

Variables: A SF SG PC Ls FE EE_A VA OA EE_B VB OB V
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
SF : secFuns SF
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
AP : allPublic Ls
EvA : evalArgs FE EE_A A VA OA
EvB : evalArgs FE EE_B A VB OB
Vars : varsArgs A V
============================
 forall X V1, mem X V -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
 < intros M L.

Subgoal 1:

Variables: A SF SG PC Ls FE EE_A VA OA EE_B VB OB V X V1
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
SF : secFuns SF
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
AP : allPublic Ls
EvA : evalArgs FE EE_A A VA OA
EvB : evalArgs FE EE_B A VB OB
Vars : varsArgs A V
M : mem X V
L : lookupScopes X EE_B V1
============================
 lookupScopes X EE_A V1
 < LP: apply public_varsArgs to _ _ _ _ SF Lev AP Vars M.

Subgoal 1:

Variables: A SF SG PC Ls FE EE_A VA OA EE_B VB OB V X V1
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
SF : secFuns SF
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
AP : allPublic Ls
EvA : evalArgs FE EE_A A VA OA
EvB : evalArgs FE EE_B A VB OB
Vars : varsArgs A V
M : mem X V
L : lookupScopes X EE_B V1
LP : lookupScopes X SG public
============================
 lookupScopes X EE_A V1
 < PE': apply public_equiv_symm to PE.

Subgoal 1:

Variables: A SF SG PC Ls FE EE_A VA OA EE_B VB OB V X V1
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
SF : secFuns SF
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
AP : allPublic Ls
EvA : evalArgs FE EE_A A VA OA
EvB : evalArgs FE EE_B A VB OB
Vars : varsArgs A V
M : mem X V
L : lookupScopes X EE_B V1
LP : lookupScopes X SG public
PE' : public_equiv SG EE_B EE_A
============================
 lookupScopes X EE_A V1
 < apply public_equiv_lookupScopes to PE' _ _ _ LP L.

Subgoal 1:

Variables: A SF SG PC Ls FE EE_A VA OA EE_B VB OB V X V1
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
SF : secFuns SF
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
AP : allPublic Ls
EvA : evalArgs FE EE_A A VA OA
EvB : evalArgs FE EE_B A VB OB
Vars : varsArgs A V
M : mem X V
L : lookupScopes X EE_B V1
LP : lookupScopes X SG public
PE' : public_equiv SG EE_B EE_A
H1 : lookupScopes X EE_A V1
============================
 lookupScopes X EE_A V1
 < search.

Variables: A SF SG PC Ls FE EE_A EE_B VB OB V
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
SF : secFuns SF
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
AP : allPublic Ls
EvA : evalArgs FE EE_A A VB OB
EvB : evalArgs FE EE_B A VB OB
Vars : varsArgs A V
============================
 VB = VB /\ OB = OB
 < search.

Proof completed.
 < Theorem recFields_level :
     forall RF SF SG PC FE EE_A VA OA EE_B VB OB,
       is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
       secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
       public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA OA ->
       evalRecFields FE EE_B RF VB OB -> VA = VB /\ OA = OB.

============================
 forall RF SF SG PC FE EE_A VA OA EE_B VB OB,
   is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
   is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
   secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
   public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA OA ->
   evalRecFields FE EE_B RF VB OB -> VA = VB /\ OA = OB
 < intros IsRF IsSF IsSG IsPC IsFE IsEE_A IsEE_B SF SFC NSA NSB PE Lev EvA EvB.

Variables: RF SF SG PC FE EE_A VA OA 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
SF : secFuns SF
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 OA
EvB : evalRecFields FE EE_B RF VB OB
============================
 VA = VB /\ OA = OB
 < Vars: apply varsRecFields_exist to IsRF.

Variables: RF SF SG PC FE EE_A VA OA EE_B VB OB V
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
SF : secFuns SF
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 OA
EvB : evalRecFields FE EE_B RF VB OB
Vars : varsRecFields RF V
============================
 VA = VB /\ OA = OB
 < apply evalRecFields_rel to _ _ _ _ EvA EvB Vars _.

Subgoal 1:

Variables: RF SF SG PC FE EE_A VA OA EE_B VB OB V
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
SF : secFuns SF
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 OA
EvB : evalRecFields FE EE_B RF VB OB
Vars : varsRecFields RF V
============================
 forall X V1, mem X V -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
 < intros M L.

Subgoal 1:

Variables: RF SF SG PC FE EE_A VA OA EE_B VB OB V X V1
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
SF : secFuns SF
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 OA
EvB : evalRecFields FE EE_B RF VB OB
Vars : varsRecFields RF V
M : mem X V
L : lookupScopes X EE_B V1
============================
 lookupScopes X EE_A V1
 < LP: apply public_varsRecFields to _ _ _ _ SF Lev Vars M.

Subgoal 1:

Variables: RF SF SG PC FE EE_A VA OA EE_B VB OB V X V1
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
SF : secFuns SF
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 OA
EvB : evalRecFields FE EE_B RF VB OB
Vars : varsRecFields RF V
M : mem X V
L : lookupScopes X EE_B V1
LP : lookupScopes X SG public
============================
 lookupScopes X EE_A V1
 < PE': apply public_equiv_symm to PE.

Subgoal 1:

Variables: RF SF SG PC FE EE_A VA OA EE_B VB OB V X V1
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
SF : secFuns SF
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 OA
EvB : evalRecFields FE EE_B RF VB OB
Vars : varsRecFields RF V
M : mem X V
L : lookupScopes X EE_B V1
LP : lookupScopes X SG public
PE' : public_equiv SG EE_B EE_A
============================
 lookupScopes X EE_A V1
 < apply public_equiv_lookupScopes to PE' _ _ _ LP L.

Subgoal 1:

Variables: RF SF SG PC FE EE_A VA OA EE_B VB OB V X V1
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
SF : secFuns SF
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 OA
EvB : evalRecFields FE EE_B RF VB OB
Vars : varsRecFields RF V
M : mem X V
L : lookupScopes X EE_B V1
LP : lookupScopes X SG public
PE' : public_equiv SG EE_B EE_A
H1 : lookupScopes X EE_A V1
============================
 lookupScopes X EE_A V1
 < search.

Variables: RF SF SG PC FE EE_A EE_B VB OB V
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
SF : secFuns SF
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 VB OB
EvB : evalRecFields FE EE_B RF VB OB
Vars : varsRecFields RF V
============================
 VB = VB /\ OB = OB
 < search.

Proof completed.
 < Extensible_Theorem
      level_args_vals : forall A SF SG PC Ls FE EE_A VA OA 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 ->
         SecFuns : secFuns SF ->
         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 OA ->
         EvB : evalArgs FE EE_B A VB OB ->
         level_arg_vals Ls VA VB
      on EvA as IH_A_L.

Subgoal 1:

Variables: A SF SG PC Ls FE EE_A VA OA 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
SecFuns : secFuns SF
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 OA
EvB : evalArgs FE EE_B A VB 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 2.1:

Variables: SF SG PC Ls FE EE_A EE_B VB OB
IH_A_L : forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
           is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
           is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
           public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA OA * ->
           evalArgs FE EE_B A VB 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
SecFuns : secFuns SF
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 [] [] @
EvB : evalArgs FE EE_B nilArgs VB OB
============================
 level_arg_vals Ls [] VB
 < case EvB.

Subgoal 2.1:

Variables: SF SG PC Ls FE EE_A EE_B
IH_A_L : forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
           is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
           is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
           public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA OA * ->
           evalArgs FE EE_B A VB 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
SecFuns : secFuns SF
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 [] [] @
============================
 level_arg_vals Ls [] []
 < case Lev.

Subgoal 2.1:

Variables: SF SG PC FE EE_A EE_B
IH_A_L : forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
           is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
           is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
           public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA OA * ->
           evalArgs FE EE_B A VB 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
SecFuns : secFuns SF
SFC : 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 [] [] @
============================
 level_arg_vals [] [] []
 < search.

Subgoal 2.2:

Variables: SF SG PC Ls FE EE_A OA EE_B VB OB O1 O2 VRest V Rest E
IH_A_L : forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
           is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
           is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
           public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA OA * ->
           evalArgs FE EE_B A VB 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
SecFuns : secFuns SF
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) OA @
EvB : evalArgs FE EE_B (consArgs E Rest) VB OB
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
============================
 level_arg_vals Ls (V::VRest) VB
 < case IsA.

Subgoal 2.2:

Variables: SF SG PC Ls FE EE_A OA EE_B VB OB O1 O2 VRest V Rest E
IH_A_L : forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
           is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
           is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
           public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA OA * ->
           evalArgs FE EE_B A VB OB -> level_arg_vals Ls VA VB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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) OA @
EvB : evalArgs FE EE_B (consArgs E Rest) VB OB
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E
H2 : is_args Rest
============================
 level_arg_vals Ls (V::VRest) VB
 < EvB: case EvB.

Subgoal 2.2:

Variables: SF SG PC Ls FE EE_A OA EE_B OB O1 O2 VRest V Rest E O3 O4 VRest1 V1
IH_A_L : forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
           is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
           is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
           public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA OA * ->
           evalArgs FE EE_B A VB OB -> level_arg_vals Ls VA VB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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) OA @
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E
H2 : is_args Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
 level_arg_vals Ls (V::VRest) (V1::VRest1)
 < Lev: case Lev.

Subgoal 2.2:

Variables: SF SG PC FE EE_A OA EE_B OB O1 O2 VRest V Rest E O3 O4 VRest1 V1 Rest1 L
IH_A_L : forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
           is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
           is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
           public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA OA * ->
           evalArgs FE EE_B A VB OB -> level_arg_vals Ls VA VB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) OA @
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E
H2 : is_args Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
Lev : level SF SG PC E L
Lev1 : levelArgs SF SG PC Rest Rest1
============================
 level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
 < apply IH_A_L to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 2.2:

Variables: SF SG PC FE EE_A OA EE_B OB O1 O2 VRest V Rest E O3 O4 VRest1 V1 Rest1 L
IH_A_L : forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
           is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
           is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
           public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA OA * ->
           evalArgs FE EE_B A VB OB -> level_arg_vals Ls VA VB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) OA @
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E
H2 : is_args Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
Lev : level SF SG PC E L
Lev1 : levelArgs SF SG PC Rest Rest1
H3 : level_arg_vals Rest1 VRest VRest1
============================
 level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
 < IsL: apply level_is to _ _ _ Lev.

Subgoal 2.2:

Variables: SF SG PC FE EE_A OA EE_B OB O1 O2 VRest V Rest E O3 O4 VRest1 V1 Rest1 L
IH_A_L : forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
           is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
           is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
           public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA OA * ->
           evalArgs FE EE_B A VB OB -> level_arg_vals Ls VA VB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) OA @
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E
H2 : is_args Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
Lev : level SF SG PC E L
Lev1 : levelArgs SF SG PC Rest Rest1
H3 : level_arg_vals Rest1 VRest VRest1
IsL : is_slev L
============================
 level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
 < Or: apply is_slev_public_or_not to IsL.

Subgoal 2.2:

Variables: SF SG PC FE EE_A OA EE_B OB O1 O2 VRest V Rest E O3 O4 VRest1 V1 Rest1 L
IH_A_L : forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
           is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
           is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
           public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA OA * ->
           evalArgs FE EE_B A VB OB -> level_arg_vals Ls VA VB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) OA @
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E
H2 : is_args Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
Lev : level SF SG PC E L
Lev1 : levelArgs SF SG PC Rest Rest1
H3 : level_arg_vals Rest1 VRest VRest1
IsL : is_slev L
Or : L = public \/ (L = public -> false)
============================
 level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
 < N: case Or.

Subgoal 2.2.1:

Variables: SF SG PC FE EE_A OA EE_B OB O1 O2 VRest V Rest E O3 O4 VRest1 V1 Rest1
IH_A_L : forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
           is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
           is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
           public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA OA * ->
           evalArgs FE EE_B A VB OB -> level_arg_vals Ls VA VB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) OA @
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E
H2 : is_args Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
Lev : level SF SG PC E public
Lev1 : levelArgs SF SG PC Rest Rest1
H3 : level_arg_vals Rest1 VRest VRest1
IsL : is_slev public
============================
 level_arg_vals (public::Rest1) (V::VRest) (V1::VRest1)
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ _ EvA1 EvB.

Subgoal 2.2.1:

Variables: SF SG PC FE EE_A OA EE_B OB O2 VRest Rest E O3 O4 VRest1 V1 Rest1
IH_A_L : forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
           is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
           is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
           public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA OA * ->
           evalArgs FE EE_B A VB OB -> level_arg_vals Ls VA VB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) OA @
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr E
H2 : is_args Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
Lev : level SF SG PC E public
Lev1 : levelArgs SF SG PC Rest Rest1
H3 : level_arg_vals Rest1 VRest VRest1
IsL : is_slev public
============================
 level_arg_vals (public::Rest1) (V1::VRest) (V1::VRest1)
 < search.

Subgoal 2.2.2:

Variables: SF SG PC FE EE_A OA EE_B OB O1 O2 VRest V Rest E O3 O4 VRest1 V1 Rest1 L
IH_A_L : forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
           is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
           is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
           public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA OA * ->
           evalArgs FE EE_B A VB OB -> level_arg_vals Ls VA VB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) OA @
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E
H2 : is_args Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
Lev : level SF SG PC E L
Lev1 : levelArgs SF SG PC Rest Rest1
H3 : level_arg_vals Rest1 VRest VRest1
IsL : is_slev L
N : L = public -> false
============================
 level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
 < search.

Subgoal 2.3:

Variables: SF SG PC Ls FE EE_A VA OA EE_B VB OB
IH_A_L : forall A SF SG PC Ls FE EE_A VA OA EE_B VB OB,
           is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
           is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
           public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA OA * ->
           evalArgs FE EE_B A VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalArgs FE EE_B <unknown K evalArgs> VB OB
============================
 level_arg_vals Ls VA VB
 < case Lev.

Proof completed.
 < 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) ->
         SecFuns : secFuns SF ->
         SFC : secFunCtxs SF FE ->
         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.

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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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.1:

Variables: SF SG PC SG' FE ScopeA EE_A ScopeB EE_B EE_B' OB
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 2.1:

Variables: SF SG PC SG' FE ScopeA EE_A ScopeB EE_B
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 2.1:

Variables: SF PC SG' FE ScopeA EE_A ScopeB EE_B
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 to _ _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB.

Subgoal 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 to _ _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA2 EvB1.

Subgoal 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 2.3:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB V X E Ty
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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)::ScopeA)::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (declare Ty X E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E V OA *
============================
 public_equiv SG' (((X, V)::ScopeA)::EE_A) EE_B'
 < case IsS.

Subgoal 2.3:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB V X E Ty
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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)::ScopeA)::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (declare Ty X E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E V OA *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
============================
 public_equiv SG' (((X, V)::ScopeA)::EE_A) EE_B'
 < Sec: case Sec.

Subgoal 2.3:

Variables: SF FE ScopeA EE_A OA ScopeB EE_B EE_B' OB V X E Ty SG1 Scope
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V)::ScopeA)::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (declare Ty X E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E V OA *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
Sec : level SF (Scope::SG1) public E public
Sec1 : no_lookup Scope X
============================
 public_equiv (((X, public)::Scope)::SG1) (((X, V)::ScopeA)::EE_A) EE_B'
 < EvB: case EvB.

Subgoal 2.3:

Variables: SF FE ScopeA EE_A OA ScopeB EE_B OB V X E Ty SG1 Scope V1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V)::ScopeA)::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E V OA *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
Sec : level SF (Scope::SG1) public E public
Sec1 : no_lookup Scope X
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
============================
 public_equiv (((X, public)::Scope)::SG1) (((X, V)::ScopeA)::EE_A) (((X, V1)::ScopeB)::EE_B)
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ PE Sec EvA1 EvB.

Subgoal 2.3:

Variables: SF FE ScopeA EE_A ScopeB EE_B OB X E Ty SG1 Scope V1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V1)::ScopeA)::EE_A) OB @
EvA1 : evalExpr FE (ScopeA::EE_A) E V1 OB *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
Sec : level SF (Scope::SG1) public E public
Sec1 : no_lookup Scope X
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
============================
 public_equiv (((X, public)::Scope)::SG1) (((X, V1)::ScopeA)::EE_A) (((X, V1)::ScopeB)::EE_B)
 < backchain public_equiv_add_public.

Subgoal 2.4:

Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V E X
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 OA *
EvA2 : replaceScopes X V (ScopeA::EE_A) EE_A'
============================
 public_equiv SG' EE_A' EE_B'
 < case IsS.

Subgoal 2.4:

Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V E X
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 OA *
EvA2 : replaceScopes X V (ScopeA::EE_A) EE_A'
H1 : is_string X
H2 : is_expr E
============================
 public_equiv SG' EE_A' EE_B'
 < EvB: case EvB.

Subgoal 2.4:

Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V E X V1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 OA *
EvA2 : replaceScopes X V (ScopeA::EE_A) EE_A'
H1 : is_string X
H2 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : replaceScopes X V1 (ScopeB::EE_B) EE_B'
============================
 public_equiv SG' EE_A' EE_B'
 < Sec: case Sec.

Subgoal 2.4.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V E X V1 L
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : replaceScopes X V (ScopeA::EE_A) EE_A'
H1 : is_string X
H2 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : replaceScopes X V1 (ScopeB::EE_B) EE_B'
Sec : level SF SG' PC E L
Sec1 : lookupScopes X SG' private
============================
 public_equiv SG' EE_A' EE_B'
 < apply public_equiv_replaceScopes_other to PE _ _ Sec1 _ EvA2 EvB1.

Subgoal 2.4.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V E X V1 L
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : replaceScopes X V (ScopeA::EE_A) EE_A'
H1 : is_string X
H2 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : replaceScopes X V1 (ScopeB::EE_B) EE_B'
Sec : level SF SG' PC E L
Sec1 : lookupScopes X SG' private
H3 : public_equiv SG' EE_A' EE_B'
============================
 public_equiv SG' EE_A' EE_B'
 < search.

Subgoal 2.4.2:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V E X V1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : replaceScopes X V (ScopeA::EE_A) EE_A'
H1 : is_string X
H2 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : replaceScopes X V1 (ScopeB::EE_B) EE_B'
Sec : level SF SG' public E public
Sec1 : lookupScopes X SG' public
============================
 public_equiv SG' EE_A' EE_B'
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB.

Subgoal 2.4.2:

Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB E X V1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 V1 OB *
EvA2 : replaceScopes X V1 (ScopeA::EE_A) EE_A'
H1 : is_string X
H2 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : replaceScopes X V1 (ScopeB::EE_B) EE_B'
Sec : level SF SG' public E public
Sec1 : lookupScopes X SG' public
============================
 public_equiv SG' EE_A' EE_B'
 < apply public_equiv_replaceScopes_public to PE _ _ Sec1 EvA2 EvB1.

Subgoal 2.4.2:

Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB E X V1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 V1 OB *
EvA2 : replaceScopes X V1 (ScopeA::EE_A) EE_A'
H1 : is_string X
H2 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : replaceScopes X V1 (ScopeB::EE_B) EE_B'
Sec : level SF SG' public E public
Sec1 : lookupScopes X SG' public
H3 : public_equiv SG' EE_A' EE_B'
============================
 public_equiv SG' EE_A' EE_B'
 < search.

Subgoal 2.5:

Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V FieldVals NewVals E Fields Rec
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 OA *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) EE_A'
============================
 public_equiv SG' EE_A' EE_B'
 < case IsS.

Subgoal 2.5:

Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V FieldVals NewVals E Fields Rec
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 OA *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) 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 2.5:

Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V FieldVals NewVals E Fields Rec V1 FieldVals1 NewVals1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 OA *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (ScopeB::EE_B) EE_B'
============================
 public_equiv SG' EE_A' EE_B'
 < Sec: case Sec.

Subgoal 2.5.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V FieldVals NewVals E Fields Rec V1 FieldVals1 NewVals1 L
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (ScopeB::EE_B) EE_B'
Sec : level SF SG' PC E L
Sec1 : lookupScopes Rec SG' private
============================
 public_equiv SG' EE_A' EE_B'
 < apply public_equiv_replaceScopes_other to PE _ _ Sec1 _ EvA4 EvB3.

Subgoal 2.5.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V FieldVals NewVals E Fields Rec V1 FieldVals1 NewVals1 L
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (ScopeB::EE_B) EE_B'
Sec : level SF SG' PC E L
Sec1 : lookupScopes Rec SG' private
H4 : public_equiv SG' EE_A' EE_B'
============================
 public_equiv SG' EE_A' EE_B'
 < search.

Subgoal 2.5.2:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V FieldVals NewVals E Fields Rec V1 FieldVals1 NewVals1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (ScopeB::EE_B) EE_B'
Sec : level SF SG' public E public
Sec1 : lookupScopes Rec SG' public
============================
 public_equiv SG' EE_A' EE_B'
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB.

Subgoal 2.5.2:

Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB FieldVals NewVals E Fields Rec V1 FieldVals1 NewVals1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 V1 OB *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V1 FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (ScopeB::EE_B) EE_B'
Sec : level SF SG' public E public
Sec1 : lookupScopes Rec SG' public
============================
 public_equiv SG' EE_A' EE_B'
 < LB: apply public_equiv_lookupScopes to PE _ _ _ Sec1 EvA2.

Subgoal 2.5.2:

Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB FieldVals NewVals E Fields Rec V1 FieldVals1 NewVals1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 V1 OB *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V1 FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (ScopeB::EE_B) EE_B'
Sec : level SF SG' public E public
Sec1 : lookupScopes Rec SG' public
LB : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals)
============================
 public_equiv SG' EE_A' EE_B'
 < apply lookupScopes_unique to LB EvB1.

Subgoal 2.5.2:

Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB NewVals E Fields Rec V1 FieldVals1 NewVals1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 V1 OB *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals1)
EvA3 : updateRecFields Fields V1 FieldVals1 NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (ScopeB::EE_B) EE_B'
Sec : level SF SG' public E public
Sec1 : lookupScopes Rec SG' public
LB : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
============================
 public_equiv SG' EE_A' EE_B'
 < apply updateRecFields_unique to EvA3 EvB2.

Subgoal 2.5.2:

Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB E Fields Rec V1 FieldVals1 NewVals1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 V1 OB *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals1)
EvA3 : updateRecFields Fields V1 FieldVals1 NewVals1
EvA4 : replaceScopes Rec (recVal NewVals1) (ScopeA::EE_A) EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (ScopeB::EE_B) EE_B'
Sec : level SF SG' public E public
Sec1 : lookupScopes Rec SG' public
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 2.5.2:

Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB E Fields Rec V1 FieldVals1 NewVals1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 V1 OB *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals1)
EvA3 : updateRecFields Fields V1 FieldVals1 NewVals1
EvA4 : replaceScopes Rec (recVal NewVals1) (ScopeA::EE_A) EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (ScopeB::EE_B) EE_B'
Sec : level SF SG' public E public
Sec1 : lookupScopes Rec SG' public
LB : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
H4 : public_equiv SG' EE_A' EE_B'
============================
 public_equiv SG' EE_A' EE_B'
 < search.

Subgoal 2.6:

Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Th (Scope::EE_A') O2 *
EvA3 : O1 ++ O2 = OA
============================
 public_equiv SG' EE_A' EE_B'
 < case IsS.

Subgoal 2.6:

Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 2.6:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 2.6.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
 public_equiv SG' EE_A' EE_B'
 < apply public_equiv_add_scope to PE.

Subgoal 2.6.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
============================
 public_equiv SG' EE_A' EE_B'
 < apply names_same_add_scope to NSA.

Subgoal 2.6.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H5 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < apply names_same_add_scope to NSB.

Subgoal 2.6.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H5 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H6 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < apply level_is to _ _ _ Sec.

Subgoal 2.6.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H5 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H6 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H7 : is_slev L
============================
 public_equiv SG' EE_A' EE_B'
 < apply join_is to _ _ Sec1.

Subgoal 2.6.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H5 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H6 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H7 : is_slev L
H8 : is_slev Sl1
============================
 public_equiv SG' EE_A' EE_B'
 < PE2: apply IH to _ _ _ _ _ _ _ _ _ _ _ _ Sec2 EvA2 EvB1.

Subgoal 2.6.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H5 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H6 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H7 : is_slev L
H8 : 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 2.6.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGF O3 Scope1 O4 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H5 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H6 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H7 : is_slev L
H8 : is_slev Sl1
PE2 : public_equiv (Scope'::SG') (Scope::EE_A') (Scope1::EE_B')
H9 : forall X L, lookup [] X L -> lookup Scope' X L
============================
 public_equiv SG' EE_A' EE_B'
 < case PE2.

Subgoal 2.6.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGF O3 Scope1 O4 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H5 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H6 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H7 : is_slev L
H8 : is_slev Sl1
H9 : forall X L, lookup [] X L -> lookup Scope' X L
H10 : forall X V,
        lookup Scope' X public -> lookup Scope X V -> lookup Scope1 X V
H11 : forall X V,
        lookup Scope' X public -> lookup Scope1 X V -> lookup Scope X V
H12 : public_equiv SG' EE_A' EE_B'
============================
 public_equiv SG' EE_A' EE_B'
 < search.

Subgoal 2.6.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
 public_equiv SG' EE_A' EE_B'
 < apply names_same_add_scope to NSA.

Subgoal 2.6.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < apply names_same_add_scope to NSB.

Subgoal 2.6.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < apply level_is to _ _ _ Sec.

Subgoal 2.6.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
============================
 public_equiv SG' EE_A' EE_B'
 < apply join_is to _ _ Sec1.

Subgoal 2.6.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
============================
 public_equiv SG' EE_A' EE_B'
 < assert Sl1 = public -> false.

Subgoal 2.6.2.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
============================
 Sl1 = public -> false
 < intros E.

Subgoal 2.6.2.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
E : Sl1 = public
============================
 false
 < case E.

Subgoal 2.6.2.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev public
============================
 false
 < apply join_public to _ _ Sec1.

Subgoal 2.6.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev public
H7 : is_slev public
============================
 false
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB.

Subgoal 2.6.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
H8 : Sl1 = public -> false
============================
 public_equiv SG' EE_A' EE_B'
 < PEA: apply stmt_not_public_no_public_change to _ _ _ _ _ _ _ EvA2 Sec2 _.

Subgoal 2.6.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
H8 : Sl1 = public -> false
PEA : public_equiv SG' (ScopeA::EE_A) EE_A'
============================
 public_equiv SG' EE_A' EE_B'
 < PEB: apply stmt_not_public_no_public_change to _ _ _ _ _ _ _ EvB1 Sec3 _.

Subgoal 2.6.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
H8 : Sl1 = 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'
 < PE': apply public_equiv_trans to PE PEB.

Subgoal 2.6.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
H8 : Sl1 = public -> false
PEA : public_equiv SG' (ScopeA::EE_A) EE_A'
PEB : public_equiv SG' (ScopeB::EE_B) EE_B'
PE' : public_equiv SG' (ScopeA::EE_A) EE_B'
============================
 public_equiv SG' EE_A' EE_B'
 < PEA': apply public_equiv_symm to PEA.

Subgoal 2.6.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
H8 : Sl1 = public -> false
PEA : public_equiv SG' (ScopeA::EE_A) EE_A'
PEB : public_equiv SG' (ScopeB::EE_B) EE_B'
PE' : public_equiv SG' (ScopeA::EE_A) EE_B'
PEA' : public_equiv SG' EE_A' (ScopeA::EE_A)
============================
 public_equiv SG' EE_A' EE_B'
 < apply public_equiv_trans to PEA' PE'.

Subgoal 2.6.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
H8 : Sl1 = public -> false
PEA : public_equiv SG' (ScopeA::EE_A) EE_A'
PEB : public_equiv SG' (ScopeB::EE_B) EE_B'
PE' : public_equiv SG' (ScopeA::EE_A) EE_B'
PEA' : public_equiv SG' EE_A' (ScopeA::EE_A)
H9 : public_equiv SG' EE_A' EE_B'
============================
 public_equiv SG' EE_A' EE_B'
 < search.

Subgoal 2.7:

Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) El (Scope::EE_A') O2 *
EvA3 : O1 ++ O2 = OA
============================
 public_equiv SG' EE_A' EE_B'
 < case IsS.

Subgoal 2.7:

Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 2.7:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 2.7.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
 public_equiv SG' EE_A' EE_B'
 < apply names_same_add_scope to NSA.

Subgoal 2.7.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < apply names_same_add_scope to NSB.

Subgoal 2.7.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < apply level_is to _ _ _ Sec.

Subgoal 2.7.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
============================
 public_equiv SG' EE_A' EE_B'
 < apply join_is to _ _ Sec1.

Subgoal 2.7.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
============================
 public_equiv SG' EE_A' EE_B'
 < assert Sl1 = public -> false.

Subgoal 2.7.1.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
============================
 Sl1 = public -> false
 < intros E.

Subgoal 2.7.1.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
E : Sl1 = public
============================
 false
 < case E.

Subgoal 2.7.1.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev public
============================
 false
 < apply join_public to _ _ Sec1.

Subgoal 2.7.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev public
H7 : is_slev public
============================
 false
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB.

Subgoal 2.7.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
H8 : Sl1 = public -> false
============================
 public_equiv SG' EE_A' EE_B'
 < PEA: apply stmt_not_public_no_public_change to _ _ _ _ _ _ _ EvA2 Sec3 _.

Subgoal 2.7.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
H8 : Sl1 = public -> false
PEA : public_equiv SG' (ScopeA::EE_A) EE_A'
============================
 public_equiv SG' EE_A' EE_B'
 < PEB: apply stmt_not_public_no_public_change to _ _ _ _ _ _ _ EvB1 Sec2 _.

Subgoal 2.7.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
H8 : Sl1 = 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'
 < PE': apply public_equiv_trans to PE PEB.

Subgoal 2.7.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
H8 : Sl1 = public -> false
PEA : public_equiv SG' (ScopeA::EE_A) EE_A'
PEB : public_equiv SG' (ScopeB::EE_B) EE_B'
PE' : public_equiv SG' (ScopeA::EE_A) EE_B'
============================
 public_equiv SG' EE_A' EE_B'
 < PEA': apply public_equiv_symm to PEA.

Subgoal 2.7.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
H8 : Sl1 = public -> false
PEA : public_equiv SG' (ScopeA::EE_A) EE_A'
PEB : public_equiv SG' (ScopeB::EE_B) EE_B'
PE' : public_equiv SG' (ScopeA::EE_A) EE_B'
PEA' : public_equiv SG' EE_A' (ScopeA::EE_A)
============================
 public_equiv SG' EE_A' EE_B'
 < apply public_equiv_trans to PEA' PE'.

Subgoal 2.7.1:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : is_slev L
H7 : is_slev Sl1
H8 : Sl1 = public -> false
PEA : public_equiv SG' (ScopeA::EE_A) EE_A'
PEB : public_equiv SG' (ScopeB::EE_B) EE_B'
PE' : public_equiv SG' (ScopeA::EE_A) EE_B'
PEA' : public_equiv SG' EE_A' (ScopeA::EE_A)
H9 : public_equiv SG' EE_A' EE_B'
============================
 public_equiv SG' EE_A' EE_B'
 < search.

Subgoal 2.7.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
 public_equiv SG' EE_A' EE_B'
 < apply public_equiv_add_scope to PE.

Subgoal 2.7.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
============================
 public_equiv SG' EE_A' EE_B'
 < apply names_same_add_scope to NSA.

Subgoal 2.7.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H5 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < apply names_same_add_scope to NSB.

Subgoal 2.7.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H5 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H6 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < apply level_is to _ _ _ Sec.

Subgoal 2.7.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H5 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H6 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H7 : is_slev L
============================
 public_equiv SG' EE_A' EE_B'
 < apply join_is to _ _ Sec1.

Subgoal 2.7.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H5 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H6 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H7 : is_slev L
H8 : is_slev Sl1
============================
 public_equiv SG' EE_A' EE_B'
 < PE2: apply IH to _ _ _ _ _ _ _ _ _ _ _ _ Sec3 EvA2 EvB1.

Subgoal 2.7.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT SGF O3 Scope1 O4
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H5 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H6 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H7 : is_slev L
H8 : 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 2.7.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT O3 Scope1 O4 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H5 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H6 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H7 : is_slev L
H8 : is_slev Sl1
PE2 : public_equiv (Scope'::SG') (Scope::EE_A') (Scope1::EE_B')
H9 : forall X L, lookup [] X L -> lookup Scope' X L
============================
 public_equiv SG' EE_A' EE_B'
 < case PE2.

Subgoal 2.7.2:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 El Th Cond L Sl1 SGT O3 Scope1 O4 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H5 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H6 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H7 : is_slev L
H8 : is_slev Sl1
H9 : forall X L, lookup [] X L -> lookup Scope' X L
H10 : forall X V,
        lookup Scope' X public -> lookup Scope X V -> lookup Scope1 X V
H11 : forall X V,
        lookup Scope' X public -> lookup Scope1 X V -> lookup Scope X V
H12 : public_equiv SG' EE_A' EE_B'
============================
 public_equiv SG' EE_A' EE_B'
 < search.

Subgoal 2.8:

Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = OA
============================
 public_equiv SG' EE_A' EE_B'
 < case IsS.

Subgoal 2.8:

Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 2.8.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L Scope1 SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 2.8.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L Scope1 SG2 O4 Scope2 EE2 O5 O6 O7
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
============================
 public_equiv SG' EE_A' EE_B'
 < apply names_same_add_scope to NSA.

Subgoal 2.8.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L Scope1 SG2 O4 Scope2 EE2 O5 O6 O7
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < apply names_same_add_scope to NSB.

Subgoal 2.8.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L Scope1 SG2 O4 Scope2 EE2 O5 O6 O7
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < PE2: apply IH to _ _ _ _ _ _ _ _ _ _ _ _ Sec2 EvA2 EvB1.

Subgoal 2.8.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L Scope1 SG2 O4 Scope2 EE2 O5 O6 O7
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
PE2 : public_equiv (Scope1::SG2) (Scope::EE1) (Scope2::EE2)
============================
 public_equiv SG' EE_A' EE_B'
 < apply secure_older_scopes to _ _ _ Sec2.

Subgoal 2.8.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
PE2 : public_equiv (Scope'::SG') (Scope::EE1) (Scope2::EE2)
H5 : forall X L, lookup [] X L -> lookup Scope' X L
============================
 public_equiv SG' EE_A' EE_B'
 < case PE2.

Subgoal 2.8.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H7 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H8 : public_equiv SG' EE1 EE2
============================
 public_equiv SG' EE_A' EE_B'
 < IsEE2+: apply evalStmt_isCtx to _ _ _ EvA2.

Subgoal 2.8.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H7 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H8 : public_equiv SG' EE1 EE2
IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
 public_equiv SG' EE_A' EE_B'
 < case IsEE2+.

Subgoal 2.8.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H7 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H8 : public_equiv SG' EE1 EE2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 public_equiv SG' EE_A' EE_B'
 < IsEE4+: apply evalStmt_isCtx to _ _ _ EvB1.

Subgoal 2.8.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H7 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H8 : public_equiv SG' EE1 EE2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope2::EE2)
============================
 public_equiv SG' EE_A' EE_B'
 < case IsEE4+.

Subgoal 2.8.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H7 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H8 : public_equiv SG' EE1 EE2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) Scope2
H12 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 public_equiv SG' EE_A' EE_B'
 < NSA2: apply secure_eval_names_same to _ _ _ _ _ _ EvA2 Sec2.

Subgoal 2.8.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H7 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H8 : public_equiv SG' EE1 EE2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) Scope2
H12 : is_list (is_list (is_pair is_string is_value)) EE2
NSA2 : names_same (Scope::EE1) (Scope'::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < NSB2: apply secure_eval_names_same to _ _ _ _ _ _ EvB1 Sec2.

Subgoal 2.8.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H7 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H8 : public_equiv SG' EE1 EE2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) Scope2
H12 : is_list (is_list (is_pair is_string is_value)) EE2
NSA2 : names_same (Scope::EE1) (Scope'::SG')
NSB2 : names_same (Scope2::EE2) (Scope'::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < NSA': case NSA2.

Subgoal 2.8.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H7 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H8 : public_equiv SG' EE1 EE2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) Scope2
H12 : is_list (is_list (is_pair is_string is_value)) EE2
NSB2 : names_same (Scope2::EE2) (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 EE1 SG'
============================
 public_equiv SG' EE_A' EE_B'
 < NSB': case NSB2.

Subgoal 2.8.1.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H7 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H8 : public_equiv SG' EE1 EE2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) Scope2
H12 : is_list (is_list (is_pair is_string is_value)) EE2
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 EE1 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 EE2 SG'
============================
 public_equiv SG' EE_A' EE_B'
 < case NSA.

Subgoal 2.8.1.1:

Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L O4 Scope2 EE2 O5 O6 O7 Scope' BRest B
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H4 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H7 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H8 : public_equiv (B::BRest) EE1 EE2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) Scope2
H12 : is_list (is_list (is_pair is_string is_value)) EE2
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 EE1 (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 EE2 (B::BRest)
H13 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H14 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H15 : names_same EE_A BRest
============================
 public_equiv (B::BRest) EE_A' EE_B'
 < case NSB'2.

Subgoal 2.8.1.1:

Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond L O4 Scope2 O5 O6 O7 Scope' BRest B ARest A
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::(A::ARest)) O5
EvB2 : evalStmt FE (A::ARest) (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H4 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H7 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H8 : public_equiv (B::BRest) EE1 (A::ARest)
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) Scope2
H12 : 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 EE1 (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
H13 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H14 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H15 : names_same EE_A BRest
H16 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H17 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H18 : names_same ARest BRest
============================
 public_equiv (B::BRest) EE_A' EE_B'
 < case NSA'2.

Subgoal 2.8.1.1:

Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 O3 O12 Body Cond L O4 Scope2 O5 O6 O7 Scope' BRest B ARest A ARest1 A1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::(A::ARest)) O5
EvB2 : evalStmt FE (A::ARest) (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H4 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H7 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H8 : public_equiv (B::BRest) (A1::ARest1) (A::ARest)
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1)
H11 : is_list (is_pair is_string is_value) Scope2
H12 : 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
H13 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H14 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H15 : names_same EE_A BRest
H16 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H17 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H18 : names_same ARest BRest
H19 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B
H20 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1
H21 : names_same ARest1 BRest
============================
 public_equiv (B::BRest) EE_A' EE_B'
 < apply IH to _ _ _ _ _ _ _ _ _ _ _ _ Sec EvA3 EvB2.

Subgoal 2.8.1.1:

Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 O3 O12 Body Cond L O4 Scope2 O5 O6 O7 Scope' BRest B ARest A ARest1 A1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::(A::ARest)) O5
EvB2 : evalStmt FE (A::ARest) (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H4 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H5 : forall X L, lookup [] X L -> lookup Scope' X L
H6 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H7 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H8 : public_equiv (B::BRest) (A1::ARest1) (A::ARest)
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1)
H11 : is_list (is_pair is_string is_value) Scope2
H12 : 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
H13 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H14 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H15 : names_same EE_A BRest
H16 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H17 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H18 : names_same ARest BRest
H19 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B
H20 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1
H21 : names_same ARest1 BRest
H22 : public_equiv (B::BRest) EE_A' EE_B'
============================
 public_equiv (B::BRest) EE_A' EE_B'
 < search.

Subgoal 2.8.1.2:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B OB O1 Scope EE1 O2 O3 O12 Body Cond L Scope1 SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 OB
============================
 public_equiv SG' EE_A' (ScopeB::EE_B)
 < assert L = public -> false.

Subgoal 2.8.1.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B OB O1 Scope EE1 O2 O3 O12 Body Cond L Scope1 SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 OB
============================
 L = public -> false
 < intros E.

Subgoal 2.8.1.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B OB O1 Scope EE1 O2 O3 O12 Body Cond L Scope1 SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 OB
E : L = public
============================
 false
 < case E.

Subgoal 2.8.1.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B OB O1 Scope EE1 O2 O3 O12 Body Cond Scope1 SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 OB
============================
 false
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB.

Subgoal 2.8.1.2:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B OB O1 Scope EE1 O2 O3 O12 Body Cond L Scope1 SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 OB
H3 : L = public -> false
============================
 public_equiv SG' EE_A' (ScopeB::EE_B)
 < PEA: apply while_no_public_change to _ _ _ _ _ _ _ _ Sec Sec1 _ EvA.

Subgoal 2.8.1.2:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B OB O1 Scope EE1 O2 O3 O12 Body Cond L Scope1 SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 OB
H3 : L = public -> false
PEA : public_equiv SG' (ScopeA::EE_A) EE_A'
============================
 public_equiv SG' EE_A' (ScopeB::EE_B)
 < PEA': apply public_equiv_symm to PEA.

Subgoal 2.8.1.2:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B OB O1 Scope EE1 O2 O3 O12 Body Cond L Scope1 SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 OB
H3 : L = public -> false
PEA : public_equiv SG' (ScopeA::EE_A) EE_A'
PEA' : public_equiv SG' EE_A' (ScopeA::EE_A)
============================
 public_equiv SG' EE_A' (ScopeB::EE_B)
 < apply public_equiv_trans to PEA' PE.

Subgoal 2.8.1.2:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B OB O1 Scope EE1 O2 O3 O12 Body Cond L Scope1 SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 OB
H3 : L = public -> false
PEA : public_equiv SG' (ScopeA::EE_A) EE_A'
PEA' : public_equiv SG' EE_A' (ScopeA::EE_A)
H4 : public_equiv SG' EE_A' (ScopeB::EE_B)
============================
 public_equiv SG' EE_A' (ScopeB::EE_B)
 < search.

Subgoal 2.8.2:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond Scope1 SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 O5 O6 O7
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
============================
 public_equiv SG' EE_A' EE_B'
 < apply public_equiv_add_scope to PE.

Subgoal 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 O5 O6 O7
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
============================
 public_equiv SG' EE_A' EE_B'
 < apply names_same_add_scope to NSA.

Subgoal 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 O5 O6 O7
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < apply names_same_add_scope to NSB.

Subgoal 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 O5 O6 O7
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < PE2: apply IH to _ _ _ _ _ _ _ _ _ _ _ _ Sec2 EvA2 EvB1.

Subgoal 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 O5 O6 O7
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
PE2 : public_equiv (Scope1::SG2) (Scope::EE1) (Scope2::EE2)
============================
 public_equiv SG' EE_A' EE_B'
 < apply secure_older_scopes to _ _ _ Sec2.

Subgoal 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
PE2 : public_equiv (Scope'::SG') (Scope::EE1) (Scope2::EE2)
H6 : forall X L, lookup [] X L -> lookup Scope' X L
============================
 public_equiv SG' EE_A' EE_B'
 < case PE2.

Subgoal 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : forall X L, lookup [] X L -> lookup Scope' X L
H7 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H8 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H9 : public_equiv SG' EE1 EE2
============================
 public_equiv SG' EE_A' EE_B'
 < IsEE2+: apply evalStmt_isCtx to _ _ _ EvA2.

Subgoal 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : forall X L, lookup [] X L -> lookup Scope' X L
H7 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H8 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H9 : public_equiv SG' EE1 EE2
IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
 public_equiv SG' EE_A' EE_B'
 < case IsEE2+.

Subgoal 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : forall X L, lookup [] X L -> lookup Scope' X L
H7 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H8 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H9 : public_equiv SG' EE1 EE2
H10 : is_list (is_pair is_string is_value) Scope
H11 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 public_equiv SG' EE_A' EE_B'
 < IsEE4+: apply evalStmt_isCtx to _ _ _ EvB1.

Subgoal 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : forall X L, lookup [] X L -> lookup Scope' X L
H7 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H8 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H9 : public_equiv SG' EE1 EE2
H10 : is_list (is_pair is_string is_value) Scope
H11 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope2::EE2)
============================
 public_equiv SG' EE_A' EE_B'
 < case IsEE4+.

Subgoal 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : forall X L, lookup [] X L -> lookup Scope' X L
H7 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H8 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H9 : public_equiv SG' EE1 EE2
H10 : is_list (is_pair is_string is_value) Scope
H11 : is_list (is_list (is_pair is_string is_value)) EE1
H12 : is_list (is_pair is_string is_value) Scope2
H13 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 public_equiv SG' EE_A' EE_B'
 < NSA2: apply secure_eval_names_same to _ _ _ _ _ _ EvA2 Sec2.

Subgoal 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : forall X L, lookup [] X L -> lookup Scope' X L
H7 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H8 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H9 : public_equiv SG' EE1 EE2
H10 : is_list (is_pair is_string is_value) Scope
H11 : is_list (is_list (is_pair is_string is_value)) EE1
H12 : is_list (is_pair is_string is_value) Scope2
H13 : is_list (is_list (is_pair is_string is_value)) EE2
NSA2 : names_same (Scope::EE1) (Scope'::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < NSB2: apply secure_eval_names_same to _ _ _ _ _ _ EvB1 Sec2.

Subgoal 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : forall X L, lookup [] X L -> lookup Scope' X L
H7 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H8 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H9 : public_equiv SG' EE1 EE2
H10 : is_list (is_pair is_string is_value) Scope
H11 : is_list (is_list (is_pair is_string is_value)) EE1
H12 : is_list (is_pair is_string is_value) Scope2
H13 : is_list (is_list (is_pair is_string is_value)) EE2
NSA2 : names_same (Scope::EE1) (Scope'::SG')
NSB2 : names_same (Scope2::EE2) (Scope'::SG')
============================
 public_equiv SG' EE_A' EE_B'
 < NSA': case NSA2.

Subgoal 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : forall X L, lookup [] X L -> lookup Scope' X L
H7 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H8 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H9 : public_equiv SG' EE1 EE2
H10 : is_list (is_pair is_string is_value) Scope
H11 : is_list (is_list (is_pair is_string is_value)) EE1
H12 : is_list (is_pair is_string is_value) Scope2
H13 : is_list (is_list (is_pair is_string is_value)) EE2
NSB2 : names_same (Scope2::EE2) (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 EE1 SG'
============================
 public_equiv SG' EE_A' EE_B'
 < NSB': case NSB2.

Subgoal 2.8.2.1:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope2 EE2 O5 O6 O7 Scope'
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : forall X L, lookup [] X L -> lookup Scope' X L
H7 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H8 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H9 : public_equiv SG' EE1 EE2
H10 : is_list (is_pair is_string is_value) Scope
H11 : is_list (is_list (is_pair is_string is_value)) EE1
H12 : is_list (is_pair is_string is_value) Scope2
H13 : is_list (is_list (is_pair is_string is_value)) EE2
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 EE1 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 EE2 SG'
============================
 public_equiv SG' EE_A' EE_B'
 < case NSA.

Subgoal 2.8.2.1:

Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope2 EE2 O5 O6 O7 Scope' BRest B
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::(B::BRest)) ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H5 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H6 : forall X L, lookup [] X L -> lookup Scope' X L
H7 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H8 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H9 : public_equiv (B::BRest) EE1 EE2
H10 : is_list (is_pair is_string is_value) Scope
H11 : is_list (is_list (is_pair is_string is_value)) EE1
H12 : is_list (is_pair is_string is_value) Scope2
H13 : is_list (is_list (is_pair is_string is_value)) EE2
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 EE1 (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 EE2 (B::BRest)
H14 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H15 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H16 : names_same EE_A BRest
============================
 public_equiv (B::BRest) EE_A' EE_B'
 < case NSB'2.

Subgoal 2.8.2.1:

Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope2 O5 O6 O7 Scope' BRest B ARest A
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::(A::ARest)) O5
EvB2 : evalStmt FE (A::ARest) (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::(B::BRest)) ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H5 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H6 : forall X L, lookup [] X L -> lookup Scope' X L
H7 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H8 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H9 : public_equiv (B::BRest) EE1 (A::ARest)
H10 : is_list (is_pair is_string is_value) Scope
H11 : is_list (is_list (is_pair is_string is_value)) EE1
H12 : is_list (is_pair is_string is_value) Scope2
H13 : 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 EE1 (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
H14 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H15 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H16 : names_same EE_A BRest
H17 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H18 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H19 : names_same ARest BRest
============================
 public_equiv (B::BRest) EE_A' EE_B'
 < case NSA'2.

Subgoal 2.8.2.1:

Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 O3 O12 Body Cond O4 Scope2 O5 O6 O7 Scope' BRest B ARest A ARest1 A1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::(A::ARest)) O5
EvB2 : evalStmt FE (A::ARest) (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::(B::BRest)) ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H5 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H6 : forall X L, lookup [] X L -> lookup Scope' X L
H7 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H8 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H9 : public_equiv (B::BRest) (A1::ARest1) (A::ARest)
H10 : is_list (is_pair is_string is_value) Scope
H11 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1)
H12 : is_list (is_pair is_string is_value) Scope2
H13 : 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
H14 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H15 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H16 : names_same EE_A BRest
H17 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H18 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H19 : names_same ARest BRest
H20 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B
H21 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1
H22 : names_same ARest1 BRest
============================
 public_equiv (B::BRest) EE_A' EE_B'
 < apply IH to _ _ _ _ _ _ _ _ _ _ _ _ Sec EvA3 EvB2.

Subgoal 2.8.2.1:

Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 Scope O2 O3 O12 Body Cond O4 Scope2 O5 O6 O7 Scope' BRest B ARest A ARest1 A1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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)
SecFuns : secFuns SF
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::(A::ARest)) O5
EvB2 : evalStmt FE (A::ARest) (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : public_equiv ([]::(B::BRest)) ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H4 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H5 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H6 : forall X L, lookup [] X L -> lookup Scope' X L
H7 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V
H8 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V
H9 : public_equiv (B::BRest) (A1::ARest1) (A::ARest)
H10 : is_list (is_pair is_string is_value) Scope
H11 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1)
H12 : is_list (is_pair is_string is_value) Scope2
H13 : 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
H14 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H15 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H16 : names_same EE_A BRest
H17 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H18 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H19 : names_same ARest BRest
H20 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B
H21 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1
H22 : names_same ARest1 BRest
H23 : public_equiv (B::BRest) EE_A' EE_B'
============================
 public_equiv (B::BRest) EE_A' EE_B'
 < search.

Subgoal 2.8.2.2:

Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B OB O1 Scope EE1 O2 O3 O12 Body Cond Scope1 SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 OB
============================
 public_equiv SG' EE_A' (ScopeB::EE_B)
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB.

Subgoal 2.9:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB Body Cond
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal OA *
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < case IsS.

Subgoal 2.9:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB Body Cond
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal OA *
H1 : is_expr Cond
H2 : is_stmt Body
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < Sec: case Sec (keep).

Subgoal 2.9.1:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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' (ScopeA::EE_A) EE_B'
 < EvB: case EvB (keep).

Subgoal 2.9.1.1:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 O1 Scope1 EE1 O2 O3 O12
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 O1
EvB2 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope1::EE1) O2
EvB3 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB4 : O1 ++ O2 = O12
EvB5 : O12 ++ O3 = OB
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < assert L = public -> false.

Subgoal 2.9.1.1.1:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 O1 Scope1 EE1 O2 O3 O12
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 O1
EvB2 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope1::EE1) O2
EvB3 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB4 : O1 ++ O2 = O12
EvB5 : O12 ++ O3 = OB
============================
 L = public -> false
 < intros E.

Subgoal 2.9.1.1.1:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 O1 Scope1 EE1 O2 O3 O12
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 O1
EvB2 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope1::EE1) O2
EvB3 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB4 : O1 ++ O2 = O12
EvB5 : O12 ++ O3 = OB
E : L = public
============================
 false
 < case E.

Subgoal 2.9.1.1.1:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB Body Cond Scope SG2 O1 Scope1 EE1 O2 O3 O12
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 O1
EvB2 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope1::EE1) O2
EvB3 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB4 : O1 ++ O2 = O12
EvB5 : O12 ++ O3 = OB
============================
 false
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB1.

Subgoal 2.9.1.1:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 O1 Scope1 EE1 O2 O3 O12
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 O1
EvB2 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope1::EE1) O2
EvB3 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB4 : O1 ++ O2 = O12
EvB5 : O12 ++ O3 = OB
H3 : L = public -> false
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < PEB: apply while_no_public_change to _ _ _ _ _ _ _ _ Sec Sec1 _ EvB.

Subgoal 2.9.1.1:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 O1 Scope1 EE1 O2 O3 O12
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 O1
EvB2 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope1::EE1) O2
EvB3 : evalStmt FE EE1 (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' (ScopeA::EE_A) EE_B'
 < apply public_equiv_trans to PE PEB.

Subgoal 2.9.1.1:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 O1 Scope1 EE1 O2 O3 O12
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 O1
EvB2 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope1::EE1) O2
EvB3 : evalStmt FE EE1 (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'
H4 : public_equiv SG' (ScopeA::EE_A) EE_B'
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < search.

Subgoal 2.9.1.2:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB Body Cond L Scope SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) (ScopeB::EE_B) OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.9.2:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB Body Cond Scope SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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' (ScopeA::EE_A) EE_B'
 < EvB: case EvB.

Subgoal 2.9.2.1:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB Body Cond Scope SG2 O1 Scope1 EE1 O2 O3 O12
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 O1
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope1::EE1) O2
EvB2 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB3 : O1 ++ O2 = O12
EvB4 : O12 ++ O3 = OB
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB.

Subgoal 2.9.2.2:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB Body Cond Scope SG2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.10:

Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 2.10:

Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 2.10:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.10:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.10:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.10:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.10:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 to _ _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB.

Subgoal 2.10:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.10:

Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.11:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB I O1 E
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = OA
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < case IsS.

Subgoal 2.11:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB I O1 E
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = OA
H1 : is_expr E
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < Sec: case Sec.

Subgoal 2.11:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB I O1 E
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = OA
H1 : is_expr E
Sec : level SF SG' public E public
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < EvB: case EvB.

Subgoal 2.11.1:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB I O1 E I1 O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) 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) O2
EvB1 : O2 ++ [intVal I1] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.11.2:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB I O1 E O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) 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 O2
EvB1 : O2 ++ [trueVal] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.11.3:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB I O1 E O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) 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 O2
EvB1 : O2 ++ [falseVal] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.11.4:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB I O1 E S1 O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) 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) O2
EvB1 : O2 ++ [stringVal S1] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.12:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB O1 E
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = OA
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < case IsS.

Subgoal 2.12:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB O1 E
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < Sec: case Sec.

Subgoal 2.12:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB O1 E
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
Sec : level SF SG' public E public
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < EvB: case EvB.

Subgoal 2.12.1:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB O1 E I O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal 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) O2
EvB1 : O2 ++ [intVal I] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.12.2:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB O1 E O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
Sec : level SF SG' public E public
EvB : evalExpr FE (ScopeB::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.12.3:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB O1 E O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
Sec : level SF SG' public E public
EvB : evalExpr FE (ScopeB::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.12.4:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB O1 E S1 O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal 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) O2
EvB1 : O2 ++ [stringVal S1] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.13:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB O1 E
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = OA
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < case IsS.

Subgoal 2.13:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB O1 E
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < Sec: case Sec.

Subgoal 2.13:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB O1 E
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
Sec : level SF SG' public E public
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < EvB: case EvB.

Subgoal 2.13.1:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB O1 E I O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal 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) O2
EvB1 : O2 ++ [intVal I] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.13.2:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB O1 E O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
Sec : level SF SG' public E public
EvB : evalExpr FE (ScopeB::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.13.3:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB O1 E O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
Sec : level SF SG' public E public
EvB : evalExpr FE (ScopeB::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.13.4:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB O1 E S1 O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal 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) O2
EvB1 : O2 ++ [stringVal S1] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.14:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB S1 O1 E
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < case IsS.

Subgoal 2.14:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB S1 O1 E
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
H1 : is_expr E
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < Sec: case Sec.

Subgoal 2.14:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB S1 O1 E
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
H1 : is_expr E
Sec : level SF SG' public E public
============================
 public_equiv SG' (ScopeA::EE_A) EE_B'
 < EvB: case EvB.

Subgoal 2.14.1:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB S1 O1 E I O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) 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) O2
EvB1 : O2 ++ [intVal I] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.14.2:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB S1 O1 E O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) 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 O2
EvB1 : O2 ++ [trueVal] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.14.3:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB S1 O1 E O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) 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 O2
EvB1 : O2 ++ [falseVal] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.14.4:

Variables: SF SG' FE ScopeA EE_A OA ScopeB EE_B OB S1 O1 E S2 O2
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) 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) O2
EvB1 : O2 ++ [stringVal S2] = OB
============================
 public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
 < search.

Subgoal 2.15:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB V X E Ty L
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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)::ScopeA)::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (secdecl L Ty X E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E V OA *
============================
 public_equiv SG' (((X, V)::ScopeA)::EE_A) EE_B'
 < case IsS.

Subgoal 2.15:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB V X E Ty L
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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)::ScopeA)::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (secdecl L Ty X E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E V OA *
H1 : is_slev L
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
============================
 public_equiv SG' (((X, V)::ScopeA)::EE_A) EE_B'
 < EvB: case EvB.

Subgoal 2.15:

Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B OB V X E Ty L V1
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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)::ScopeA)::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E V 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 OB
============================
 public_equiv SG' (((X, V)::ScopeA)::EE_A) (((X, V1)::ScopeB)::EE_B)
 < Sec: case Sec.

Subgoal 2.15.1:

Variables: SF PC FE ScopeA EE_A OA ScopeB EE_B OB V X E Ty V1 L1 SG1 Scope
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (secdecl private Ty X E) (((X, V)::ScopeA)::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E V 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 OB
Sec : level SF (Scope::SG1) PC E L1
Sec1 : no_lookup Scope X
============================
 public_equiv (((X, private)::Scope)::SG1) (((X, V)::ScopeA)::EE_A) (((X, V1)::ScopeB)::EE_B)
 < backchain public_equiv_add_other.

Subgoal 2.15.2:

Variables: SF FE ScopeA EE_A OA ScopeB EE_B OB V X E Ty V1 SG1 Scope
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (secdecl public Ty X E) (((X, V)::ScopeA)::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E V 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 OB
Sec : level SF (Scope::SG1) public E public
Sec1 : no_lookup Scope X
============================
 public_equiv (((X, public)::Scope)::SG1) (((X, V)::ScopeA)::EE_A) (((X, V1)::ScopeB)::EE_B)
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB.

Subgoal 2.15.2:

Variables: SF FE ScopeA EE_A ScopeB EE_B OB X E Ty V1 SG1 Scope
IH : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (secdecl public Ty X E) (((X, V1)::ScopeA)::EE_A) OB @
EvA1 : evalExpr FE (ScopeA::EE_A) E V1 OB *
H1 : is_slev public
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
Sec : level SF (Scope::SG1) public E public
Sec1 : no_lookup Scope X
============================
 public_equiv (((X, public)::Scope)::SG1) (((X, V1)::ScopeA)::EE_A) (((X, V1)::ScopeB)::EE_B)
 < backchain public_equiv_add_public.

Subgoal 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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_exists to PrB NamesB _ _ _ EvB.

Subgoal 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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
============================
 public_equiv (Scope'::BRest) EE_A' EE_B'
 < SSB: apply proj_evalStmt_rel to PrB NamesB _ _ _ EvB EvB'.

Subgoal 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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
SSB : scopes_same EE_B' EE''
============================
 public_equiv (Scope'::BRest) EE_A' EE_B'
 < EvA': apply proj_evalStmt_exists to EvA2 EvA1 _ _ _ EvA.

Subgoal 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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
SSB : scopes_same EE_B' EE''
EvA' : evalStmt FE (ScopeA::EE_A) S'' EE''1 OA
============================
 public_equiv (Scope'::BRest) EE_A' EE_B'
 < SSA: apply proj_evalStmt_rel to EvA2 EvA1 _ _ _ EvA EvA'.

Subgoal 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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
SSB : scopes_same EE_B' EE''
EvA' : evalStmt FE (ScopeA::EE_A) S'' EE''1 OA
SSA : scopes_same EE_A' EE''1
============================
 public_equiv (Scope'::BRest) EE_A' EE_B'
 < apply evalStmt_unique to _ _ _ EvA' EvA3.

Subgoal 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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
SSB : scopes_same EE_B' EE''
EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P
SSA : scopes_same EE_A' EE_P
============================
 public_equiv (Scope'::BRest) EE_A' EE_B'
 < apply proj_stmt_is to PrB _ _.

Subgoal 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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
SSB : scopes_same EE_B' EE''
EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P
SSA : scopes_same EE_A' EE_P
H10 : is_stmt S''
============================
 public_equiv (Scope'::BRest) EE_A' EE_B'
 < PE_Pr: apply IH to _ _ _ _ _ _ _ _ _ _ _ _ Sec2 EvA3 EvB'.

Subgoal 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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
SSB : scopes_same EE_B' EE''
EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P
SSA : 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 SSB.

Subgoal 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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
SSB : scopes_same EE_B' EE''
EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P
SSA : 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' SSA.

Subgoal 2.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 : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
       is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
       is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
       secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
       public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
       evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
       public_equiv SG' EE_A' EE_B'
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)
SecFuns : secFuns SF
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
SSB : scopes_same EE_B' EE''
EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P
SSA : 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.

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) ->
         SecFuns : secFuns SF ->
         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 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 ->
         SecFuns : secFuns SF ->
         SFC : secFunCtxs SF FE ->
         NS : names_same EE SG ->
         Ev : evalExpr FE EE E V 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 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 ->
         SecFuns : secFuns SF ->
         SFC : secFunCtxs SF FE ->
         NS : names_same EE SG ->
         Ev : evalArgs FE EE A V 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 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 ->
         SecFuns : secFuns SF ->
         SFC : secFunCtxs SF FE ->
         NS : names_same EE SG ->
         Ev : evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE E V 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 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalArgs FE EE A V 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 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalRecFields FE EE RF V 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (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)
SecFuns : secFuns SF
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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG
Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) O @
Sec : secure SF SG PC (declare Ty X E) SG'
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE) E V O *
============================
 O = []
 < case IsS.

Subgoal 5.1.3:

Variables: SF SG PC SG' FE Scope EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG
Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) O @
Sec : secure SF SG PC (declare Ty X E) SG'
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE) E V 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 V X E Ty SG1 Scope1
IH_S : forall S SF SG PC SG' FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (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 : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) (Scope1::SG1)
Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) O @
NEq : public = public -> false
Ev1 : evalExpr FE (Scope::EE) E V O *
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
============================
 O = []
 < apply IH_E to _ _ _ _ _ _ _ _ _ Ev1 Sec _.

Subgoal 5.1.3:

Variables: SF FE Scope EE V X E Ty SG1 Scope1
IH_S : forall S SF SG PC SG' FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (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 : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) (Scope1::SG1)
Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) [] @
NEq : public = public -> false
Ev1 : evalExpr FE (Scope::EE) E V [] *
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
============================
 [] = []
 < search.

Subgoal 5.1.4:

Variables: SF SG PC SG' FE Scope EE EE' O V 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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 O *
Ev2 : replaceScopes X V (Scope::EE) EE'
============================
 O = []
 < case IsS.

Subgoal 5.1.4:

Variables: SF SG PC SG' FE Scope EE EE' O V 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 O *
Ev2 : replaceScopes X V (Scope::EE) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 O *
Ev2 : replaceScopes X V (Scope::EE) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : replaceScopes X V (Scope::EE) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 O *
Ev2 : replaceScopes X V (Scope::EE) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 [] *
Ev2 : replaceScopes X V (Scope::EE) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) EE'
============================
 O = []
 < case IsS.

Subgoal 5.1.5:

Variables: SF SG PC SG' FE Scope EE EE' O V 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 [] *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 level_is to _ _ _ Sec.

Subgoal 5.1.6:

Variables: SF PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
============================
 O = []
 < apply join_is to _ _ Sec1.

Subgoal 5.1.6:

Variables: SF PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
H5 : is_slev Sl1
============================
 O = []
 < apply names_same_add_scope to NS.

Subgoal 5.1.6:

Variables: SF PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
H5 : is_slev Sl1
H6 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 O = []
 < assert Sl1 = public -> false.

Subgoal 5.1.6.1:

Variables: SF PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
H5 : is_slev Sl1
H6 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 Sl1 = public -> false
 < intros E.

Subgoal 5.1.6.1:

Variables: SF PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
H5 : is_slev Sl1
H6 : names_same ([]::(Scope::EE)) ([]::SG')
E : Sl1 = public
============================
 false
 < case E.

Subgoal 5.1.6.1:

Variables: SF PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
H5 : is_slev public
H6 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 false
 < apply join_public to _ _ Sec1.

Subgoal 5.1.6.1:

Variables: SF SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev public
H5 : is_slev public
H6 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 false
 < backchain NEq.

Subgoal 5.1.6:

Variables: SF PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
H5 : is_slev Sl1
H6 : names_same ([]::(Scope::EE)) ([]::SG')
H7 : Sl1 = public -> false
============================
 O = []
 < apply IH_S to _ _ _ _ _ _ _ _ _ Ev2 Sec2 _.

Subgoal 5.1.6:

Variables: SF PC SG' FE Scope EE EE' 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
H5 : is_slev Sl1
H6 : names_same ([]::(Scope::EE)) ([]::SG')
H7 : Sl1 = public -> false
============================
 [] = []
 < search.

Subgoal 5.1.7:

Variables: SF SG PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 level_is to _ _ _ Sec.

Subgoal 5.1.7:

Variables: SF PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
============================
 O = []
 < apply join_is to _ _ Sec1.

Subgoal 5.1.7:

Variables: SF PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
H5 : is_slev Sl1
============================
 O = []
 < apply names_same_add_scope to NS.

Subgoal 5.1.7:

Variables: SF PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
H5 : is_slev Sl1
H6 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 O = []
 < assert Sl1 = public -> false.

Subgoal 5.1.7.1:

Variables: SF PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
H5 : is_slev Sl1
H6 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 Sl1 = public -> false
 < intros E.

Subgoal 5.1.7.1:

Variables: SF PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
H5 : is_slev Sl1
H6 : names_same ([]::(Scope::EE)) ([]::SG')
E : Sl1 = public
============================
 false
 < case E.

Subgoal 5.1.7.1:

Variables: SF PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
H5 : is_slev public
H6 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 false
 < apply join_public to _ _ Sec1.

Subgoal 5.1.7.1:

Variables: SF SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev public
H5 : is_slev public
H6 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 false
 < backchain NEq.

Subgoal 5.1.7:

Variables: SF PC SG' FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
H5 : is_slev Sl1
H6 : names_same ([]::(Scope::EE)) ([]::SG')
H7 : Sl1 = public -> false
============================
 O = []
 < apply IH_S to _ _ _ _ _ _ _ _ _ Ev2 Sec3 _.

Subgoal 5.1.7:

Variables: SF PC SG' FE Scope EE EE' 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_slev L
H5 : is_slev Sl1
H6 : names_same ([]::(Scope::EE)) ([]::SG')
H7 : Sl1 = public -> false
============================
 [] = []
 < search.

Subgoal 5.1.8:

Variables: SF SG PC SG' FE Scope EE EE' O O2 Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 O2 Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 O2 Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O12 *
Ev3 : evalStmt FE EE3 (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 names_same_add_scope to NS.

Subgoal 5.1.8.1:

Variables: SF SG' FE Scope EE EE' O Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O12 *
Ev3 : evalStmt FE EE3 (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 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 O = []
 < apply IH_S to _ _ _ _ _ _ _ _ _ Ev2 Sec2 _.

Subgoal 5.1.8.1:

Variables: SF SG' FE Scope EE EE' O Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) [] *
Ev3 : evalStmt FE EE3 (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 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 O = []
 < case Ev5.

Subgoal 5.1.8.1:

Variables: SF SG' FE Scope EE EE' O Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) [] *
Ev3 : evalStmt FE EE3 (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 : names_same ([]::(Scope::EE)) ([]::SG')
============================
 O = []
 < IsEE4+: apply evalStmt_isCtx to _ _ _ Ev2.

Subgoal 5.1.8.1:

Variables: SF SG' FE Scope EE EE' O Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) [] *
Ev3 : evalStmt FE EE3 (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 : names_same ([]::(Scope::EE)) ([]::SG')
IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE3)
============================
 O = []
 < case IsEE4+.

Subgoal 5.1.8.1:

Variables: SF SG' FE Scope EE EE' O Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) [] *
Ev3 : evalStmt FE EE3 (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 : names_same ([]::(Scope::EE)) ([]::SG')
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 O = []
 < NS+: apply secure_eval_names_same to _ _ _ _ _ _ Ev2 Sec2.

Subgoal 5.1.8.1:

Variables: SF SG' FE Scope EE EE' O Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) [] *
Ev3 : evalStmt FE EE3 (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 : names_same ([]::(Scope::EE)) ([]::SG')
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
NS+ : names_same (Scope1::EE3) (Scope2::SG2)
============================
 O = []
 < apply secure_older_scopes to _ _ _ Sec2.

Subgoal 5.1.8.1:

Variables: SF SG' FE Scope EE EE' O Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) [] *
Ev3 : evalStmt FE EE3 (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 : names_same ([]::(Scope::EE)) ([]::SG')
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
NS+ : names_same (Scope1::EE3) (Scope'::SG')
H6 : 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 Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) [] *
Ev3 : evalStmt FE EE3 (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 : names_same ([]::(Scope::EE)) ([]::SG')
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : 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 EE3 SG'
============================
 O = []
 < case NS.

Subgoal 5.1.8.1:

Variables: SF FE Scope EE EE' O Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) [] *
Ev3 : evalStmt FE EE3 (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 : names_same ([]::(Scope::EE)) ([]::(B::BRest))
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : 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 EE3 (B::BRest)
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
============================
 O = []
 < case NS-2 (keep).

Subgoal 5.1.8.1:

Variables: SF FE Scope EE EE' O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 : names_same ([]::(Scope::EE)) ([]::(B::BRest))
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) (A::ARest)
H6 : 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)
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
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
============================
 O = []
 < apply IH_S to _ _ _ _ _ _ _ _ _ Ev3 Sec _.

Subgoal 5.1.8.1:

Variables: SF FE Scope EE EE' 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (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)
SecFuns : secFuns SF
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 [] *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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 : names_same ([]::(Scope::EE)) ([]::(B::BRest))
H4 : is_list (is_pair is_string is_value) Scope1
H5 : is_list (is_list (is_pair is_string is_value)) (A::ARest)
H6 : 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)
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
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
============================
 [] = []
 < search.

Subgoal 5.1.8.2:

Variables: SF SG' FE Scope EE EE' O O2 Scope1 EE3 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG
Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope::EE) O @
Sec : secure SF SG PC (while Cond Body) SG'
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE) Cond falseVal O *
============================
 O = []
 < case IsS.

Subgoal 5.1.9:

Variables: SF SG PC SG' FE Scope 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG
Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope::EE) O @
Sec : secure SF SG PC (while Cond Body) SG'
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE) Cond falseVal O *
H1 : is_expr Cond
H2 : is_stmt Body
============================
 O = []
 < Sec: case Sec.

Subgoal 5.1.9.1:

Variables: SF SG' FE Scope 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG'
Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope::EE) O @
NEq : private = public -> false
Ev1 : evalExpr FE (Scope::EE) Cond falseVal 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG'
Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope::EE) [] @
NEq : private = public -> false
Ev1 : evalExpr FE (Scope::EE) Cond falseVal [] *
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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG'
Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope::EE) O @
NEq : public = public -> false
Ev1 : evalExpr FE (Scope::EE) Cond falseVal 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG
Ev : evalStmt FE (Scope::EE) (printVal E) (Scope::EE) O @
Sec : secure SF SG PC (printVal E) SG'
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE) E (intVal I) O2 *
Ev2 : O2 ++ [intVal I] = O
============================
 O = []
 < case Sec.

Subgoal 5.1.11:

Variables: SF SG' FE Scope 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG'
Ev : evalStmt FE (Scope::EE) (printVal E) (Scope::EE) O @
NEq : public = public -> false
Ev1 : evalExpr FE (Scope::EE) E (intVal I) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG
Ev : evalStmt FE (Scope::EE) (printVal E) (Scope::EE) O @
Sec : secure SF SG PC (printVal E) SG'
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE) E trueVal O2 *
Ev2 : O2 ++ [trueVal] = O
============================
 O = []
 < case Sec.

Subgoal 5.1.12:

Variables: SF SG' FE Scope 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG'
Ev : evalStmt FE (Scope::EE) (printVal E) (Scope::EE) O @
NEq : public = public -> false
Ev1 : evalExpr FE (Scope::EE) E trueVal 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG
Ev : evalStmt FE (Scope::EE) (printVal E) (Scope::EE) O @
Sec : secure SF SG PC (printVal E) SG'
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE) E falseVal O2 *
Ev2 : O2 ++ [falseVal] = O
============================
 O = []
 < case Sec.

Subgoal 5.1.13:

Variables: SF SG' FE Scope 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG'
Ev : evalStmt FE (Scope::EE) (printVal E) (Scope::EE) O @
NEq : public = public -> false
Ev1 : evalExpr FE (Scope::EE) E falseVal 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG
Ev : evalStmt FE (Scope::EE) (printVal E) (Scope::EE) O @
Sec : secure SF SG PC (printVal E) SG'
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) O2 *
Ev2 : O2 ++ [stringVal S1] = O
============================
 O = []
 < case Sec.

Subgoal 5.1.14:

Variables: SF SG' FE Scope 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG'
Ev : evalStmt FE (Scope::EE) (printVal E) (Scope::EE) O @
NEq : public = public -> false
Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG
Ev : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) O @
Sec : secure SF SG PC (secdecl L Ty X E) SG'
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE) E V O *
============================
 O = []
 < case IsS.

Subgoal 5.1.15:

Variables: SF SG PC SG' FE Scope EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) SG
Ev : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope)::EE) O @
Sec : secure SF SG PC (secdecl L Ty X E) SG'
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE) E V 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 V X E Ty L1 SG1 Scope1
IH_S : forall S SF SG PC SG' FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (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 : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) (Scope1::SG1)
Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope)::EE) O @
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE) E V O *
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
============================
 O = []
 < apply IH_E to _ _ _ _ _ _ _ _ _ Ev1 Sec _.

Subgoal 5.1.15.1:

Variables: SF PC FE Scope EE V X E Ty L1 SG1 Scope1
IH_S : forall S SF SG PC SG' FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (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 : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) (Scope1::SG1)
Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope)::EE) [] @
NEq : PC = public -> false
Ev1 : evalExpr FE (Scope::EE) E V [] *
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
============================
 [] = []
 < search.

Subgoal 5.1.15.2:

Variables: SF FE Scope EE O V X E Ty SG1 Scope1
IH_S : forall S SF SG PC SG' FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (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 : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same (Scope::EE) (Scope1::SG1)
Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope)::EE) O @
NEq : public = public -> false
Ev1 : evalExpr FE (Scope::EE) E V O *
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
============================
 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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 = []
 < Ev': apply proj_evalStmt_exists 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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
Ev' : evalStmt FE (Scope::EE) S_P EE'' O
============================
 O = []
 < apply evalStmt_unique to _ _ _ Ev' 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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)
SecFuns : secFuns SF
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
Ev' : evalStmt FE (Scope::EE) S_P (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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (num I) (intVal I) [] @
Lev : level SF SG PC (num I) L
NEq : PC = public -> false
============================
 [] = []
 < search.

Subgoal 5.2.2:

Variables: SF SG PC L FE EE O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (plus E1 E2) (intVal I) O @
Lev : level SF SG PC (plus E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 + I2 = I
Ev4 : O2 ++ O3 = O
============================
 O = []
 < case IsE.

Subgoal 5.2.2:

Variables: SF SG PC L FE EE O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (plus E1 E2) (intVal I) O @
Lev : level SF SG PC (plus E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (plus E1 E2) (intVal I) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (plus E1 E2) (intVal I) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (plus E1 E2) (intVal I) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ _ _ _ _ _ _ Ev2 Lev1 _.

Subgoal 5.2.2:

Variables: SF SG PC L FE EE I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (plus E1 E2) (intVal I) [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) [] *
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
============================
 [] = []
 < search.

Subgoal 5.2.3:

Variables: SF SG PC L FE EE O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (minus E1 E2) (intVal I) O @
Lev : level SF SG PC (minus E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 - I2 = I
Ev4 : O2 ++ O3 = O
============================
 O = []
 < case IsE.

Subgoal 5.2.3:

Variables: SF SG PC L FE EE O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (minus E1 E2) (intVal I) O @
Lev : level SF SG PC (minus E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (minus E1 E2) (intVal I) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (minus E1 E2) (intVal I) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (minus E1 E2) (intVal I) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ _ _ _ _ _ _ Ev2 Lev1 _.

Subgoal 5.2.3:

Variables: SF SG PC L FE EE I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (minus E1 E2) (intVal I) [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) [] *
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
============================
 [] = []
 < search.

Subgoal 5.2.4:

Variables: SF SG PC L FE EE O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (mult E1 E2) (intVal I) O @
Lev : level SF SG PC (mult E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 * I2 = I
Ev4 : O2 ++ O3 = O
============================
 O = []
 < case IsE.

Subgoal 5.2.4:

Variables: SF SG PC L FE EE O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (mult E1 E2) (intVal I) O @
Lev : level SF SG PC (mult E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (mult E1 E2) (intVal I) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (mult E1 E2) (intVal I) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (mult E1 E2) (intVal I) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ _ _ _ _ _ _ Ev2 Lev1 _.

Subgoal 5.2.4:

Variables: SF SG PC L FE EE I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (mult E1 E2) (intVal I) [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) [] *
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
============================
 [] = []
 < search.

Subgoal 5.2.5:

Variables: SF SG PC L FE EE O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (div E1 E2) (intVal I) O @
Lev : level SF SG PC (div E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 / I2 = I
Ev4 : O2 ++ O3 = O
============================
 O = []
 < case IsE.

Subgoal 5.2.5:

Variables: SF SG PC L FE EE O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (div E1 E2) (intVal I) O @
Lev : level SF SG PC (div E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (div E1 E2) (intVal I) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (div E1 E2) (intVal I) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (div E1 E2) (intVal I) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ _ _ _ _ _ _ Ev2 Lev1 _.

Subgoal 5.2.5:

Variables: SF SG PC L FE EE I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (div E1 E2) (intVal I) [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) [] *
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
============================
 [] = []
 < 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE true trueVal [] @
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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE false falseVal [] @
Lev : level SF SG PC false L
NEq : PC = public -> false
============================
 [] = []
 < search.

Subgoal 5.2.8:

Variables: SF SG PC L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) trueVal O @
Lev : level SF SG PC (and E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
============================
 O = []
 < case IsE.

Subgoal 5.2.8:

Variables: SF SG PC L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) trueVal O @
Lev : level SF SG PC (and E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 trueVal 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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 trueVal 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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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_is to _ _ _ Lev.

Subgoal 5.2.8:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 : is_slev L2
============================
 O = []
 < apply join_is to _ _ Lev1.

Subgoal 5.2.8:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 : is_slev L2
H4 : is_slev Sl1
============================
 O = []
 < assert Sl1 = public -> false.

Subgoal 5.2.8.1:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 : is_slev L2
H4 : is_slev Sl1
============================
 Sl1 = public -> false
 < intros E.

Subgoal 5.2.8.1:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 : is_slev L2
H4 : is_slev Sl1
E : Sl1 = public
============================
 false
 < case E.

Subgoal 5.2.8.1:

Variables: SF SG PC L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 : is_slev L2
H4 : is_slev public
============================
 false
 < apply join_public to _ _ Lev1.

Subgoal 5.2.8.1:

Variables: SF SG L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) trueVal O @
NEq : public = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 : is_slev public
H4 : is_slev public
============================
 false
 < backchain NEq.

Subgoal 5.2.8:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 O = []
 < apply IH_E to _ _ _ _ _ _ _ _ _ Ev2 Lev2 _.

Subgoal 5.2.8:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) trueVal [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 trueVal [] *
H1 : is_expr E1
H2 : is_expr E2
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 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 [] = []
 < search.

Subgoal 5.2.9:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
Lev : level SF SG PC (and E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal O *
============================
 O = []
 < case IsE.

Subgoal 5.2.9:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
Lev : level SF SG PC (and E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal O *
H1 : is_expr E1
H2 : is_expr E2
============================
 O = []
 < Lev: case Lev.

Subgoal 5.2.9:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
H1 : is_expr E1
H2 : is_expr E2
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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
Lev : level SF SG PC (and E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
============================
 O = []
 < case IsE.

Subgoal 5.2.10:

Variables: SF SG PC L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
Lev : level SF SG PC (and E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 falseVal 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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 falseVal 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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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_is to _ _ _ Lev.

Subgoal 5.2.10:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 : is_slev L2
============================
 O = []
 < apply join_is to _ _ Lev1.

Subgoal 5.2.10:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 : is_slev L2
H4 : is_slev Sl1
============================
 O = []
 < assert Sl1 = public -> false.

Subgoal 5.2.10.1:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 : is_slev L2
H4 : is_slev Sl1
============================
 Sl1 = public -> false
 < intros E.

Subgoal 5.2.10.1:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 : is_slev L2
H4 : is_slev Sl1
E : Sl1 = public
============================
 false
 < case E.

Subgoal 5.2.10.1:

Variables: SF SG PC L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 : is_slev L2
H4 : is_slev public
============================
 false
 < apply join_public to _ _ Lev1.

Subgoal 5.2.10.1:

Variables: SF SG L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
NEq : public = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 : is_slev public
H4 : is_slev public
============================
 false
 < backchain NEq.

Subgoal 5.2.10:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 O = []
 < apply IH_E to _ _ _ _ _ _ _ _ _ Ev2 Lev2 _.

Subgoal 5.2.10:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (and E1 E2) falseVal [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
Ev2 : evalExpr FE EE E2 falseVal [] *
H1 : is_expr E1
H2 : is_expr E2
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 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 [] = []
 < search.

Subgoal 5.2.11:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
Lev : level SF SG PC (or E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal O *
============================
 O = []
 < case IsE.

Subgoal 5.2.11:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
Lev : level SF SG PC (or E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal O *
H1 : is_expr E1
H2 : is_expr E2
============================
 O = []
 < Lev: case Lev.

Subgoal 5.2.11:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
H1 : is_expr E1
H2 : is_expr E2
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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
Lev : level SF SG PC (or E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
============================
 O = []
 < case IsE.

Subgoal 5.2.12:

Variables: SF SG PC L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
Lev : level SF SG PC (or E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 trueVal 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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 trueVal 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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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_is to _ _ _ Lev.

Subgoal 5.2.12:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 : is_slev L2
============================
 O = []
 < apply join_is to _ _ Lev1.

Subgoal 5.2.12:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 : is_slev L2
H4 : is_slev Sl1
============================
 O = []
 < assert Sl1 = public -> false.

Subgoal 5.2.12.1:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 : is_slev L2
H4 : is_slev Sl1
============================
 Sl1 = public -> false
 < intros E.

Subgoal 5.2.12.1:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 : is_slev L2
H4 : is_slev Sl1
E : Sl1 = public
============================
 false
 < case E.

Subgoal 5.2.12.1:

Variables: SF SG PC L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 : is_slev L2
H4 : is_slev public
============================
 false
 < apply join_public to _ _ Lev1.

Subgoal 5.2.12.1:

Variables: SF SG L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
NEq : public = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 : is_slev public
H4 : is_slev public
============================
 false
 < backchain NEq.

Subgoal 5.2.12:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 trueVal 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 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 O = []
 < apply IH_E to _ _ _ _ _ _ _ _ _ Ev2 Lev2 _.

Subgoal 5.2.12:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) trueVal [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 trueVal [] *
H1 : is_expr E1
H2 : is_expr E2
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 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 [] = []
 < search.

Subgoal 5.2.13:

Variables: SF SG PC L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) falseVal O @
Lev : level SF SG PC (or E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
============================
 O = []
 < case IsE.

Subgoal 5.2.13:

Variables: SF SG PC L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) falseVal O @
Lev : level SF SG PC (or E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 falseVal 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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 falseVal 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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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_is to _ _ _ Lev.

Subgoal 5.2.13:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 : is_slev L2
============================
 O = []
 < apply join_is to _ _ Lev1.

Subgoal 5.2.13:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 : is_slev L2
H4 : is_slev Sl1
============================
 O = []
 < assert Sl1 = public -> false.

Subgoal 5.2.13.1:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 : is_slev L2
H4 : is_slev Sl1
============================
 Sl1 = public -> false
 < intros E.

Subgoal 5.2.13.1:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 : is_slev L2
H4 : is_slev Sl1
E : Sl1 = public
============================
 false
 < case E.

Subgoal 5.2.13.1:

Variables: SF SG PC L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 : is_slev L2
H4 : is_slev public
============================
 false
 < apply join_public to _ _ Lev1.

Subgoal 5.2.13.1:

Variables: SF SG L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) falseVal O @
NEq : public = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 : is_slev public
H4 : is_slev public
============================
 false
 < backchain NEq.

Subgoal 5.2.13:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 falseVal 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 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 O = []
 < apply IH_E to _ _ _ _ _ _ _ _ _ Ev2 Lev2 _.

Subgoal 5.2.13:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (or E1 E2) falseVal [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
Ev2 : evalExpr FE EE E2 falseVal [] *
H1 : is_expr E1
H2 : is_expr E2
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 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 [] = []
 < search.

Subgoal 5.2.14:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (not E1) trueVal O @
Lev : level SF SG PC (not E1) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal O *
============================
 O = []
 < case IsE.

Subgoal 5.2.14:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (not E1) trueVal O @
Lev : level SF SG PC (not E1) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal O *
H1 : is_expr E1
============================
 O = []
 < Lev: case Lev.

Subgoal 5.2.14:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (not E1) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (not E1) trueVal [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 falseVal [] *
H1 : is_expr E1
Lev : level SF SG PC E1 L
============================
 [] = []
 < search.

Subgoal 5.2.15:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (not E1) falseVal O @
Lev : level SF SG PC (not E1) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal O *
============================
 O = []
 < case IsE.

Subgoal 5.2.15:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (not E1) falseVal O @
Lev : level SF SG PC (not E1) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal O *
H1 : is_expr E1
============================
 O = []
 < Lev: case Lev.

Subgoal 5.2.15:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (not E1) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (not E1) falseVal [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 trueVal [] *
H1 : is_expr E1
Lev : level SF SG PC E1 L
============================
 [] = []
 < search.

Subgoal 5.2.16:

Variables: SF SG PC L FE EE O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (greater E1 E2) trueVal O @
Lev : level SF SG PC (greater E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 > I2
Ev4 : O2 ++ O3 = O
============================
 O = []
 < case IsE.

Subgoal 5.2.16:

Variables: SF SG PC L FE EE O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (greater E1 E2) trueVal O @
Lev : level SF SG PC (greater E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (greater E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (greater E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (greater E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ _ _ _ _ _ _ Ev2 Lev1 _.

Subgoal 5.2.16:

Variables: SF SG PC L FE EE I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (greater E1 E2) trueVal [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) [] *
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
============================
 [] = []
 < search.

Subgoal 5.2.17:

Variables: SF SG PC L FE EE O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (greater E1 E2) falseVal O @
Lev : level SF SG PC (greater E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 <= I2
Ev4 : O2 ++ O3 = O
============================
 O = []
 < case IsE.

Subgoal 5.2.17:

Variables: SF SG PC L FE EE O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (greater E1 E2) falseVal O @
Lev : level SF SG PC (greater E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (greater E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (greater E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (greater E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ _ _ _ _ _ _ Ev2 Lev1 _.

Subgoal 5.2.17:

Variables: SF SG PC L FE EE I1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (greater E1 E2) falseVal [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (intVal I1) [] *
Ev2 : evalExpr FE EE E2 (intVal I2) [] *
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
============================
 [] = []
 < search.

Subgoal 5.2.18:

Variables: SF SG PC L FE EE O V1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (eq E1 E2) trueVal O @
Lev : level SF SG PC (eq E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V1 O3 *
Ev3 : O2 ++ O3 = O
============================
 O = []
 < case IsE.

Subgoal 5.2.18:

Variables: SF SG PC L FE EE O V1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (eq E1 E2) trueVal O @
Lev : level SF SG PC (eq E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V1 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 O V1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (eq E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V1 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 O V1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (eq E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 V1 [] *
Ev2 : evalExpr FE EE E2 V1 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 O V1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (eq E1 E2) trueVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 V1 [] *
Ev2 : evalExpr FE EE E2 V1 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 _ _ _ _ _ _ _ _ _ Ev2 Lev1 _.

Subgoal 5.2.18:

Variables: SF SG PC L FE EE V1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (eq E1 E2) trueVal [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 V1 [] *
Ev2 : evalExpr FE EE E2 V1 [] *
H1 : is_expr E1
H2 : is_expr E2
Lev : level SF SG PC E1 L2
Lev1 : level SF SG PC E2 L3
Lev2 : join L2 L3 L
============================
 [] = []
 < search.

Subgoal 5.2.19:

Variables: SF SG PC L FE EE O V1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (eq E1 E2) falseVal O @
Lev : level SF SG PC (eq E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : V1 = V2 -> false
Ev4 : O2 ++ O3 = O
============================
 O = []
 < case IsE.

Subgoal 5.2.19:

Variables: SF SG PC L FE EE O V1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (eq E1 E2) falseVal O @
Lev : level SF SG PC (eq E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 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 O V1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (eq E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 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 O V1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (eq E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 V1 [] *
Ev2 : evalExpr FE EE E2 V2 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 O V1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (eq E1 E2) falseVal O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 V1 [] *
Ev2 : evalExpr FE EE E2 V2 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 IH_E to _ _ _ _ _ _ _ _ _ Ev2 Lev1 _.

Subgoal 5.2.19:

Variables: SF SG PC L FE EE V1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (eq E1 E2) falseVal [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 V1 [] *
Ev2 : evalExpr FE EE E2 V2 [] *
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
============================
 [] = []
 < 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (stringLit S) (stringVal S) [] @
Lev : level SF SG PC (stringLit S) L
NEq : PC = public -> false
============================
 [] = []
 < search.

Subgoal 5.2.21:

Variables: SF SG PC L FE EE O S1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (appString E1 E2) (stringVal S) O @
Lev : level SF SG PC (appString E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) O3 *
Ev3 : S1 ++ S2 = S
Ev4 : O2 ++ O3 = O
============================
 O = []
 < case IsE.

Subgoal 5.2.21:

Variables: SF SG PC L FE EE O S1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (appString E1 E2) (stringVal S) O @
Lev : level SF SG PC (appString E1 E2) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) 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 O S1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (appString E1 E2) (stringVal S) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) 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 O S1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (appString E1 E2) (stringVal S) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (stringVal S1) [] *
Ev2 : evalExpr FE EE E2 (stringVal S2) 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 O S1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (appString E1 E2) (stringVal S) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (stringVal S1) [] *
Ev2 : evalExpr FE EE E2 (stringVal S2) 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 IH_E to _ _ _ _ _ _ _ _ _ Ev2 Lev1 _.

Subgoal 5.2.21:

Variables: SF SG PC L FE EE S1 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (appString E1 E2) (stringVal S) [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E1 (stringVal S1) [] *
Ev2 : evalExpr FE EE E2 (stringVal S2) [] *
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
============================
 [] = []
 < search.

Subgoal 5.2.22:

Variables: SF SG PC L FE EE V 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (name X) V [] @
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 O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V 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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 V
============================
 O = []
 < case IsE.

Subgoal 5.2.23:

Variables: SF SG PC L FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V 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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 V
H1 : is_string Fun
H2 : is_args Args
============================
 O = []
 < Lev: case Lev.

Subgoal 5.2.23.1:

Variables: SF SG FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals [] *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : [] ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals [] *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O *
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals [] *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O *
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals [] *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O *
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals [] *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O *
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals [] *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O *
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals [] *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O *
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals [] *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O *
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals [] *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O *
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals [] *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O *
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals [] *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O *
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals [] *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O *
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals [] *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O *
Ev6 : lookupScopes RetVar EE2 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 RetVar RVVal ArgNames Body ArgVals InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V [] @
NEq : private = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals [] *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 [] *
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (call Fun Args) V O @
NEq : public = public -> false
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (recBuild RF) (recVal VF) O @
Lev : level SF SG PC (recBuild RF) L
NEq : PC = public -> false
Ev1 : evalRecFields FE EE RF VF O *
============================
 O = []
 < case IsE.

Subgoal 5.2.24:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (recBuild RF) (recVal VF) O @
Lev : level SF SG PC (recBuild RF) L
NEq : PC = public -> false
Ev1 : evalRecFields FE EE RF VF O *
H1 : is_recFieldExprs RF
============================
 O = []
 < Lev: case Lev.

Subgoal 5.2.24:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (recBuild RF) (recVal VF) O @
NEq : PC = public -> false
Ev1 : evalRecFields FE EE RF VF O *
H1 : is_recFieldExprs RF
Lev : levelRecFields SF SG PC RF L
============================
 O = []
 < apply IH_RF to _ _ _ _ _ _ _ _ _ Ev1 Lev _.

Subgoal 5.2.24:

Variables: SF SG PC L FE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (recBuild RF) (recVal VF) [] @
NEq : PC = public -> false
Ev1 : evalRecFields FE EE RF VF [] *
H1 : is_recFieldExprs RF
Lev : levelRecFields SF SG PC RF L
============================
 [] = []
 < search.

Subgoal 5.2.25:

Variables: SF SG PC L FE EE V 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (recFieldAccess Rec F) V O @
Lev : level SF SG PC (recFieldAccess Rec F) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE Rec (recVal Fields) O *
Ev2 : lookupRecFieldVal Fields F V
============================
 O = []
 < case IsE.

Subgoal 5.2.25:

Variables: SF SG PC L FE EE V 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (recFieldAccess Rec F) V O @
Lev : level SF SG PC (recFieldAccess Rec F) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE Rec (recVal Fields) O *
Ev2 : lookupRecFieldVal Fields F V
H1 : is_expr Rec
H2 : is_string F
============================
 O = []
 < Lev: case Lev.

Subgoal 5.2.25:

Variables: SF SG PC L FE EE V 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (recFieldAccess Rec F) V O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE Rec (recVal Fields) O *
Ev2 : lookupRecFieldVal 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.25:

Variables: SF SG PC L FE EE V 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE (recFieldAccess Rec F) V [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE Rec (recVal Fields) [] *
Ev2 : lookupRecFieldVal Fields F V
H1 : is_expr Rec
H2 : is_string F
Lev : level SF SG PC Rec L
============================
 [] = []
 < search.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE V O E_P V_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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE <unknown K evalExpr> V O @
Lev : level SF SG PC <unknown K evalExpr> L
NEq : PC = public -> false
Ev1 : |{expr}- <unknown K evalExpr> ~~> E_P
Ev2 : evalExpr FE EE E_P V_P O_P *
============================
 O = []
 < Lev: case Lev.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE V O E_P V_P O_P 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE <unknown K evalExpr> V O @
NEq : PC = public -> false
Ev1 : |{expr}- <unknown K evalExpr> ~~> E_P
Ev2 : evalExpr FE EE E_P V_P O_P *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P1
Lev1 : level SF SG PC E_P1 L
============================
 O = []
 < apply proj_expr_unique to Lev Ev1 _.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE V O E_P V_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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE <unknown K evalExpr> V O @
NEq : PC = public -> false
Ev1 : |{expr}- <unknown K evalExpr> ~~> E_P
Ev2 : evalExpr FE EE E_P V_P O_P *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P
Lev1 : level SF SG PC E_P L
============================
 O = []
 < apply proj_expr_is to Lev _.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE V O E_P V_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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE <unknown K evalExpr> V O @
NEq : PC = public -> false
Ev1 : |{expr}- <unknown K evalExpr> ~~> E_P
Ev2 : evalExpr FE EE E_P V_P O_P *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P
Lev1 : level SF SG PC E_P L
H1 : is_expr E_P
============================
 O = []
 < apply IH_E to _ _ _ _ _ _ _ _ _ Ev2 Lev1 _.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE V O E_P V_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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE <unknown K evalExpr> V O @
NEq : PC = public -> false
Ev1 : |{expr}- <unknown K evalExpr> ~~> E_P
Ev2 : evalExpr FE EE E_P V_P [] *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P
Lev1 : level SF SG PC E_P L
H1 : is_expr E_P
============================
 O = []
 < Ev': apply proj_evalExpr_exists to Ev1 _ _ _ Ev.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE V O E_P V_P V'
IH_S : forall S SF SG PC SG' FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE <unknown K evalExpr> V O @
NEq : PC = public -> false
Ev1 : |{expr}- <unknown K evalExpr> ~~> E_P
Ev2 : evalExpr FE EE E_P V_P [] *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P
Lev1 : level SF SG PC E_P L
H1 : is_expr E_P
Ev' : evalExpr FE EE E_P V' O
============================
 O = []
 < apply evalExpr_unique to _ _ _ Ev' Ev2.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE V E_P V_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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalExpr FE EE <unknown K evalExpr> V [] @
NEq : PC = public -> false
Ev1 : |{expr}- <unknown K evalExpr> ~~> E_P
Ev2 : evalExpr FE EE E_P V_P [] *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P
Lev1 : level SF SG PC E_P L
H1 : is_expr E_P
Ev' : evalExpr FE EE E_P V_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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalArgs FE EE nilArgs [] [] @
Lev : levelArgs SF SG PC nilArgs L
NEq : PC = public -> false
============================
 [] = []
 < search.

Subgoal 5.3.2:

Variables: SF SG PC L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) O @
Lev : levelArgs SF SG PC (consArgs E Rest) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalArgs FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
============================
 O = []
 < case IsA.

Subgoal 5.3.2:

Variables: SF SG PC L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) O @
Lev : levelArgs SF SG PC (consArgs E Rest) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalArgs FE EE Rest VRest 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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalArgs FE EE Rest VRest 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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E V1 [] *
Ev2 : evalArgs FE EE Rest VRest 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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E V1 [] *
Ev2 : evalArgs FE EE Rest VRest 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_A to _ _ _ _ _ _ _ _ _ Ev2 Lev1 _.

Subgoal 5.3.2:

Variables: SF SG PC FE EE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E V1 [] *
Ev2 : evalArgs FE EE Rest VRest [] *
H1 : is_expr E
H2 : is_args Rest
Lev : level SF SG PC E L1
Lev1 : levelArgs SF SG PC Rest Rest1
============================
 [] = []
 < search.

Subgoal 5.3.3:

Variables: SF SG PC L FE EE V 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalArgs FE EE <unknown K evalArgs> V 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalRecFields FE EE nilRecFieldExprs nilRecFieldVals [] @
Lev : levelRecFields SF SG PC nilRecFieldExprs L
NEq : PC = public -> false
============================
 [] = []
 < search.

Subgoal 5.4.2:

Variables: SF SG PC L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O @
Lev : levelRecFields SF SG PC (consRecFieldExprs F E Rest) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalRecFields FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
============================
 O = []
 < case IsRF.

Subgoal 5.4.2:

Variables: SF SG PC L FE EE O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O @
Lev : levelRecFields SF SG PC (consRecFieldExprs F E Rest) L
NEq : PC = public -> false
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalRecFields FE EE Rest VRest 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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalRecFields FE EE Rest VRest 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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E V1 [] *
Ev2 : evalRecFields FE EE Rest VRest 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 O 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E V1 [] *
Ev2 : evalRecFields FE EE Rest VRest 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_RF to _ _ _ _ _ _ _ _ _ Ev2 Lev1 _.

Subgoal 5.4.2:

Variables: SF SG PC L FE EE 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V O * -> levelRecFields SF SG PC RF L ->
          (PC = public -> false) -> O = []
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) [] @
NEq : PC = public -> false
Ev1 : evalExpr FE EE E V1 [] *
Ev2 : evalRecFields FE EE Rest VRest [] *
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
============================
 [] = []
 < search.

Subgoal 5.4.3:

Variables: SF SG PC L FE EE V 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) -> secFuns SF ->
         secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * ->
         secure SF SG PC S SG' -> (PC = public -> false) -> O = []
IH_E : forall E SF SG PC L FE EE V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalExpr FE EE E V O * -> level SF SG PC E L -> (PC = public ->
         false) -> O = []
IH_A : forall A SF SG PC L FE EE V O,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
         names_same EE SG -> evalArgs FE EE A V O * -> levelArgs SF SG PC A L ->
         (PC = public -> false) -> O = []
IH_RF : forall RF SF SG PC L FE EE V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> secFuns SF -> secFunCtxs SF FE ->
          names_same EE SG -> evalRecFields FE EE RF V 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NS : names_same EE SG
Ev : evalRecFields FE EE <unknown K evalRecFields> V 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) ->
         SecFuns : secFuns SF ->
         SFC : secFunCtxs SF FE ->
         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 VA OA 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 ->
         SecFuns : secFuns SF ->
         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 OA ->
         EvB : evalExpr FE EE_B E VB OB ->
         OA = OB
      on EvA as IH_E,
      args_secure_output : forall A SF SG PC L FE EE_A VA OA 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 ->
         SecFuns : secFuns SF ->
         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 OA ->
         EvB : evalArgs FE EE_B A VB OB ->
         OA = OB
      on EvA as IH_A,
      recFields_secure_output : forall RF SF SG PC L FE EE_A VA OA 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 ->
         SecFuns : secFuns SF ->
         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 OA ->
         EvB : evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 VA OA 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
SecFuns : secFuns SF
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 OA
EvB : evalExpr FE EE_B E VB 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 VA OA 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
SecFuns : secFuns SF
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 OA
EvB : evalArgs FE EE_B A VB 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 VA OA 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
SecFuns : secFuns SF
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 OA
EvB : evalRecFields FE EE_B RF VB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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)
SecFuns : secFuns SF
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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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)::ScopeA)::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (declare Ty X E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E V 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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)::ScopeA)::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (declare Ty X E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E V 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 V X E Ty SG1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V)::ScopeA)::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (declare Ty X E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E V OA *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
Sec : level SF (Scope::SG1) public E public
Sec1 : no_lookup Scope X
============================
 OA = OB
 < EvB: case EvB.

Subgoal 5.1.3:

Variables: SF FE ScopeA EE_A OA ScopeB EE_B OB V X E Ty SG1 Scope 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V)::ScopeA)::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E V OA *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
Sec : level SF (Scope::SG1) public E public
Sec1 : no_lookup Scope X
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
============================
 OA = OB
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ PE Sec EvA1 EvB.

Subgoal 5.1.3:

Variables: SF FE ScopeA EE_A ScopeB EE_B OB X E Ty SG1 Scope 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V1)::ScopeA)::EE_A) OB @
EvA1 : evalExpr FE (ScopeA::EE_A) E V1 OB *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
Sec : level SF (Scope::SG1) public E public
Sec1 : no_lookup Scope X
EvB : evalExpr FE (ScopeB::EE_B) E V1 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 OA *
EvA2 : replaceScopes X V (ScopeA::EE_A) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 OA *
EvA2 : replaceScopes X V (ScopeA::EE_A) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : replaceScopes X V (ScopeA::EE_A) 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 E X L 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : replaceScopes X V (ScopeA::EE_A) 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 OB
EvB1 : replaceScopes X V1 (ScopeB::EE_B) 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 E X L 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OB *
EvA2 : replaceScopes X V (ScopeA::EE_A) 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 OB
EvB1 : replaceScopes X V1 (ScopeB::EE_B) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : replaceScopes X V (ScopeA::EE_A) 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 E X 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : replaceScopes X V (ScopeA::EE_A) 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 OB
EvB1 : replaceScopes X V1 (ScopeB::EE_B) 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 E X 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OB *
EvA2 : replaceScopes X V (ScopeA::EE_A) 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 OB
EvB1 : replaceScopes X V1 (ScopeB::EE_B) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 OA *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 OA *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) 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 FieldVals NewVals E Fields Rec L V1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) 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 OB
EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (ScopeB::EE_B) 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 FieldVals NewVals E Fields Rec L V1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OB *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) 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 OB
EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (ScopeB::EE_B) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) 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 FieldVals NewVals E Fields Rec V1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) 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 OB
EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (ScopeB::EE_B) 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 FieldVals NewVals E Fields Rec V1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OB *
EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (ScopeA::EE_A) 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 OB
EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (ScopeB::EE_B) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O1 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
============================
 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
============================
 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H7 : 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H7 : is_slev L
H8 : 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 Scope El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H7 : is_slev L
H8 : 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 Scope El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H7 : is_slev L
H8 : 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 O1 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : is_slev L
H5 : is_slev Sl1
H6 : Sl1 = public -> false
============================
 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : is_slev L
H5 : is_slev Sl1
H6 : Sl1 = public -> false
H7 : names_same ([]::(ScopeA::EE_A)) ([]::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 Scope El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : is_slev L
H5 : is_slev Sl1
H6 : Sl1 = public -> false
H7 : names_same ([]::(ScopeA::EE_A)) ([]::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 Scope El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 OA
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : OA ++ O4 = OB
H4 : is_slev L
H5 : is_slev Sl1
H6 : Sl1 = public -> false
H7 : names_same ([]::(ScopeA::EE_A)) ([]::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 Scope El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 OA
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : OA ++ O4 = OB
H4 : is_slev L
H5 : is_slev Sl1
H6 : Sl1 = public -> false
H7 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H8 : names_same ([]::(ScopeB::EE_B)) ([]::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 Scope El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 OA
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') []
EvB2 : OA ++ [] = OB
H4 : is_slev L
H5 : is_slev Sl1
H6 : Sl1 = public -> false
H7 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H8 : names_same ([]::(ScopeB::EE_B)) ([]::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 Scope El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OB *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 OB
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') []
EvB2 : OB ++ [] = OB
H4 : is_slev L
H5 : is_slev Sl1
H6 : Sl1 = public -> false
H7 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H8 : names_same ([]::(ScopeB::EE_B)) ([]::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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O1 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : is_slev L
H5 : is_slev Sl1
H6 : Sl1 = public -> false
============================
 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : is_slev L
H5 : is_slev Sl1
H6 : Sl1 = public -> false
H7 : names_same ([]::(ScopeA::EE_A)) ([]::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 Scope El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : is_slev L
H5 : is_slev Sl1
H6 : Sl1 = public -> false
H7 : names_same ([]::(ScopeA::EE_A)) ([]::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 Scope El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 OA
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : OA ++ O4 = OB
H4 : is_slev L
H5 : is_slev Sl1
H6 : Sl1 = public -> false
H7 : names_same ([]::(ScopeA::EE_A)) ([]::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 Scope El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 OA
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') O4
EvB2 : OA ++ O4 = OB
H4 : is_slev L
H5 : is_slev Sl1
H6 : Sl1 = public -> false
H7 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H8 : names_same ([]::(ScopeB::EE_B)) ([]::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 Scope El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OA *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 OA
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') []
EvB2 : OA ++ [] = OB
H4 : is_slev L
H5 : is_slev Sl1
H6 : Sl1 = public -> false
H7 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H8 : names_same ([]::(ScopeB::EE_B)) ([]::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 Scope El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 OB *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 OB
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Th (Scope1::EE_B') []
EvB2 : OB ++ [] = OB
H4 : is_slev L
H5 : is_slev Sl1
H6 : Sl1 = public -> false
H7 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H8 : names_same ([]::(ScopeB::EE_B)) ([]::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 O1 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
============================
 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
============================
 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H7 : 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 Scope O2 El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H7 : is_slev L
H8 : 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 Scope El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H7 : is_slev L
H8 : 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 Scope El Th Cond L Sl1 SGT SGF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 O3 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O3
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H5 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H6 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H7 : is_slev L
H8 : 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 O1 Scope EE1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O1 Scope EE1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O1 Scope EE1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O1 Scope EE1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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' O1 Scope EE1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O1 Scope EE1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O1 Scope EE1 O2 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (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 Scope EE1 O2 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
============================
 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 Scope EE1 O2 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::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 Scope EE1 O2 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
============================
 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 Scope EE1 O2 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
============================
 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 Scope EE1 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
============================
 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 Scope EE1 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
 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 Scope EE1 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 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 Scope EE1 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope2::EE2)
============================
 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 Scope EE1 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope2
H9 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 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 Scope EE1 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope2
H9 : is_list (is_list (is_pair is_string is_value)) EE2
NSA'' : names_same (Scope::EE1) (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 Scope EE1 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope2
H9 : is_list (is_list (is_pair is_string is_value)) EE2
NSA'' : names_same (Scope::EE1) (Scope1::SG2)
NSB'' : names_same (Scope2::EE2) (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 Scope EE1 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope2
H9 : is_list (is_list (is_pair is_string is_value)) EE2
NSA'' : names_same (Scope::EE1) (Scope1::SG2)
NSB'' : names_same (Scope2::EE2) (Scope1::SG2)
PE'' : public_equiv (Scope1::SG2) (Scope::EE1) (Scope2::EE2)
============================
 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 Scope EE1 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope2
H9 : is_list (is_list (is_pair is_string is_value)) EE2
NSB'' : names_same (Scope2::EE2) (Scope1::SG2)
PE'' : public_equiv (Scope1::SG2) (Scope::EE1) (Scope2::EE2)
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 EE1 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 Scope EE1 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope2
H9 : is_list (is_list (is_pair is_string is_value)) EE2
PE'' : public_equiv (Scope1::SG2) (Scope::EE1) (Scope2::EE2)
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 EE1 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 EE2 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 Scope EE1 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG')
H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG')
H5 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope2
H9 : is_list (is_list (is_pair is_string is_value)) EE2
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 EE1 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 EE2 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 EE1 EE2
============================
 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 Scope EE1 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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)
SecFuns : secFuns SF
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H4 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H5 : public_equiv ([]::(B::BRest)) ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope2
H9 : is_list (is_list (is_pair is_string is_value)) EE2
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 EE1 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 EE2 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 EE1 EE2
H10 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H11 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H12 : 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 Scope EE1 O3 O12 Body Cond Scope1 SG2 O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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)
SecFuns : secFuns SF
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H4 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H5 : public_equiv ([]::(B::BRest)) ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope2
H9 : is_list (is_list (is_pair is_string is_value)) EE2
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 EE1 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 EE2 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 EE1 EE2
H10 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H11 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H12 : names_same EE_A 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
============================
 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 Scope EE1 O3 O12 Body Cond O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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)
SecFuns : secFuns SF
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H4 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H5 : public_equiv ([]::(B::BRest)) ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope2
H9 : is_list (is_list (is_pair is_string is_value)) EE2
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 EE1 (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 EE2 (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) EE1 EE2
H10 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H11 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H12 : names_same EE_A 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 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 Scope O3 O12 Body Cond O4 Scope2 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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)
SecFuns : secFuns SF
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H4 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H5 : public_equiv ([]::(B::BRest)) ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) (A::ARest)
H8 : is_list (is_pair is_string is_value) Scope2
H9 : is_list (is_list (is_pair is_string is_value)) EE2
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 EE2 (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) EE2
H10 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H11 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H12 : names_same EE_A 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 L, lookup [] X L -> lookup Scope' X L
H17 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H18 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H19 : 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 Scope O3 O12 Body Cond 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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)
SecFuns : secFuns SF
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H4 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H5 : public_equiv ([]::(B::BRest)) ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) (A::ARest)
H8 : is_list (is_pair is_string is_value) Scope2
H9 : 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)
H10 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H11 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H12 : names_same EE_A 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 L, lookup [] X L -> lookup Scope' X L
H17 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H18 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H19 : names_same ARest BRest
H20 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B
H21 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1
H22 : 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 Scope O12 Body Cond 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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)
SecFuns : secFuns SF
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H4 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H5 : public_equiv ([]::(B::BRest)) ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) (A::ARest)
H8 : is_list (is_pair is_string is_value) Scope2
H9 : 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)
H10 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H11 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H12 : names_same EE_A 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 L, lookup [] X L -> lookup Scope' X L
H17 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H18 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H19 : names_same ARest BRest
H20 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B
H21 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1
H22 : 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 Scope Body Cond 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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)
SecFuns : secFuns SF
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H4 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H5 : public_equiv ([]::(B::BRest)) ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) (A::ARest)
H8 : is_list (is_pair is_string is_value) Scope2
H9 : 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)
H10 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H11 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H12 : names_same EE_A 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 L, lookup [] X L -> lookup Scope' X L
H17 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H18 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H19 : names_same ARest BRest
H20 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B
H21 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1
H22 : 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 Scope Body Cond 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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)
SecFuns : secFuns SF
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 O4 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) 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 O4
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) 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 : names_same ([]::(ScopeA::EE_A)) ([]::(B::BRest))
H4 : names_same ([]::(ScopeB::EE_B)) ([]::(B::BRest))
H5 : public_equiv ([]::(B::BRest)) ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B))
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) (A::ARest)
H8 : is_list (is_pair is_string is_value) Scope2
H9 : 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)
H10 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B
H11 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA
H12 : names_same EE_A 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 L, lookup [] X L -> lookup Scope' X L
H17 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B
H18 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A
H19 : names_same ARest BRest
H20 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B
H21 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1
H22 : 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 OB O1 Scope EE1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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 O1 *
EvA2 : evalStmt FE ([]::(ScopeA::EE_A)) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 OB
============================
 OA = OB
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB.

Subgoal 5.1.9:

Variables: SF SG PC SG' FE ScopeA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal OA *
============================
 OA = OB
 < case IsS.

Subgoal 5.1.9:

Variables: SF SG PC SG' FE ScopeA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) [] @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal [] *
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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) [] @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' []
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal [] *
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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 OA ScopeB EE_B EE_B' OB Body Cond Scope SG2 O1 Scope1 EE1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 O1
EvB1 : evalStmt FE ([]::(ScopeB::EE_B)) Body (Scope1::EE1) O2
EvB2 : evalStmt FE EE1 (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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB.

Subgoal 5.1.9.2.2:

Variables: SF SG' FE ScopeA EE_A ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OB @
EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG'
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = OA
============================
 OA = OB
 < case IsS.

Subgoal 5.1.11:

Variables: SF SG PC SG' FE ScopeA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) 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) 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) 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) 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I1) 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) 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 ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OB @
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I1) 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) O2
EvB1 : O2 ++ [intVal I1] = OB
============================
 OB = OB
 < search.

Subgoal 5.1.11.2:

Variables: SF SG' FE ScopeA EE_A OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) 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 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) 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 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) 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) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = OA
============================
 OA = OB
 < case IsS.

Subgoal 5.1.12:

Variables: SF SG PC SG' FE ScopeA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal 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) 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
Sec : level SF SG' public E public
EvB : evalExpr FE (ScopeB::EE_B) E trueVal 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal O2 *
EvA2 : O2 ++ [trueVal] = OA
H1 : is_expr E
Sec : level SF SG' public E public
EvB : evalExpr FE (ScopeB::EE_B) E trueVal 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal O2 *
EvA2 : O2 ++ [trueVal] = OA
H1 : is_expr E
Sec : level SF SG' public E public
EvB : evalExpr FE (ScopeB::EE_B) E trueVal 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 ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OB @
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal O2 *
EvA2 : O2 ++ [trueVal] = OB
H1 : is_expr E
Sec : level SF SG' public E public
EvB : evalExpr FE (ScopeB::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = OB
============================
 OB = OB
 < search.

Subgoal 5.1.12.3:

Variables: SF SG' FE ScopeA EE_A OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
Sec : level SF SG' public E public
EvB : evalExpr FE (ScopeB::EE_B) E falseVal 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal 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) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = OA
============================
 OA = OB
 < case IsS.

Subgoal 5.1.13:

Variables: SF SG PC SG' FE ScopeA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal 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) 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
Sec : level SF SG' public E public
EvB : evalExpr FE (ScopeB::EE_B) E trueVal 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
Sec : level SF SG' public E public
EvB : evalExpr FE (ScopeB::EE_B) E falseVal 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal O2 *
EvA2 : O2 ++ [falseVal] = OA
H1 : is_expr E
Sec : level SF SG' public E public
EvB : evalExpr FE (ScopeB::EE_B) E falseVal 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal O2 *
EvA2 : O2 ++ [falseVal] = OA
H1 : is_expr E
Sec : level SF SG' public E public
EvB : evalExpr FE (ScopeB::EE_B) E falseVal 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 ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OB @
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal O2 *
EvA2 : O2 ++ [falseVal] = OB
H1 : is_expr E
Sec : level SF SG' public E public
EvB : evalExpr FE (ScopeB::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = OB
============================
 OB = OB
 < search.

Subgoal 5.1.13.4:

Variables: SF SG' FE ScopeA EE_A OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal 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) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
============================
 OA = OB
 < case IsS.

Subgoal 5.1.14:

Variables: SF SG PC SG' FE ScopeA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) 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) 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) 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 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) 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 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) 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) 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) 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) 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 OA ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S2) 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) 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 ScopeB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) (ScopeA::EE_A) OB @
EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S2) 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) 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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)::ScopeA)::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (secdecl L Ty X E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E V 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 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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)::ScopeA)::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (secdecl L Ty X E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E V 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 V X E Ty L1 SG1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (secdecl private Ty X E) (((X, V)::ScopeA)::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (secdecl private Ty X E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E V OA *
H1 : is_slev private
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
Sec : level SF (Scope::SG1) PC E L1
Sec1 : no_lookup Scope X
============================
 OA = OB
 < EvB: case EvB.

Subgoal 5.1.15.1:

Variables: SF PC FE ScopeA EE_A OA ScopeB EE_B OB V X E Ty L1 SG1 Scope 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (secdecl private Ty X E) (((X, V)::ScopeA)::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E V OA *
H1 : is_slev private
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
Sec : level SF (Scope::SG1) PC E L1
Sec1 : no_lookup Scope X
EvB : evalExpr FE (ScopeB::EE_B) E V1 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 V X E Ty L1 SG1 Scope 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (secdecl private Ty X E) (((X, V)::ScopeA)::EE_A) OB @
EvA1 : evalExpr FE (ScopeA::EE_A) E V OB *
H1 : is_slev private
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
Sec : level SF (Scope::SG1) PC E L1
Sec1 : no_lookup Scope X
EvB : evalExpr FE (ScopeB::EE_B) E V1 OB
============================
 OB = OB
 < search.

Subgoal 5.1.15.2:

Variables: SF FE ScopeA EE_A OA ScopeB EE_B EE_B' OB V X E Ty SG1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (secdecl public Ty X E) (((X, V)::ScopeA)::EE_A) OA @
EvB : evalStmt FE (ScopeB::EE_B) (secdecl public Ty X E) EE_B' OB
EvA1 : evalExpr FE (ScopeA::EE_A) E V OA *
H1 : is_slev public
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
Sec : level SF (Scope::SG1) public E public
Sec1 : no_lookup Scope X
============================
 OA = OB
 < EvB: case EvB.

Subgoal 5.1.15.2:

Variables: SF FE ScopeA EE_A OA ScopeB EE_B OB V X E Ty SG1 Scope 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (secdecl public Ty X E) (((X, V)::ScopeA)::EE_A) OA @
EvA1 : evalExpr FE (ScopeA::EE_A) E V OA *
H1 : is_slev public
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
Sec : level SF (Scope::SG1) public E public
Sec1 : no_lookup Scope X
EvB : evalExpr FE (ScopeB::EE_B) E V1 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 V X E Ty SG1 Scope 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (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
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A)
IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) (Scope::SG1)
NSB : names_same (ScopeB::EE_B) (Scope::SG1)
PE : public_equiv (Scope::SG1) (ScopeA::EE_A) (ScopeB::EE_B)
EvA : evalStmt FE (ScopeA::EE_A) (secdecl public Ty X E) (((X, V)::ScopeA)::EE_A) OB @
EvA1 : evalExpr FE (ScopeA::EE_A) E V OB *
H1 : is_slev public
H2 : is_typ Ty
H3 : is_string X
H4 : is_expr E
Sec : level SF (Scope::SG1) public E public
Sec1 : no_lookup Scope X
EvB : evalExpr FE (ScopeB::EE_B) E V1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same (ScopeA::EE_A) 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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_exists 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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
============================
 OA = OB
 < EvA': apply proj_evalStmt_exists 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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
EvA' : evalStmt FE (ScopeA::EE_A) S'' EE''1 OA
============================
 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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
EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P O_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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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
EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P O_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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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)
SecFuns : secFuns SF
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
EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P OB
H10 : is_stmt S''
============================
 OB = OB
 < search.

Subgoal 5.2.1:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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) [] @
EvB : evalExpr FE EE_B (num I) VB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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) [] @
============================
 [] = []
 < search.

Subgoal 5.2.2:

Variables: SF SG PC L FE EE_A OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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) OA @
EvB : evalExpr FE EE_B (plus E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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) OA @
EvB : evalExpr FE EE_B (plus E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvB : evalExpr FE EE_B (plus E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B OB I1 O1 I2 O2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) 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 OA EE_B OB I1 I2 O2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.2:

Variables: SF SG PC L FE EE_A OA EE_B OB I1 I2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA4 EvB3.

Subgoal 5.2.2:

Variables: SF SG PC L FE EE_A EE_B OB I1 I2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OB @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.2.3:

Variables: SF SG PC L FE EE_A OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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) OA @
EvB : evalExpr FE EE_B (minus E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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) OA @
EvB : evalExpr FE EE_B (minus E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvB : evalExpr FE EE_B (minus E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B OB I1 O1 I2 O2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) 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 OA EE_B OB I1 I2 O2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.3:

Variables: SF SG PC L FE EE_A OA EE_B OB I1 I2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA4 EvB3.

Subgoal 5.2.3:

Variables: SF SG PC L FE EE_A EE_B OB I1 I2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OB @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.2.4:

Variables: SF SG PC L FE EE_A OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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) OA @
EvB : evalExpr FE EE_B (mult E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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) OA @
EvB : evalExpr FE EE_B (mult E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvB : evalExpr FE EE_B (mult E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B OB I1 O1 I2 O2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) 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 OA EE_B OB I1 I2 O2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.4:

Variables: SF SG PC L FE EE_A OA EE_B OB I1 I2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA4 EvB3.

Subgoal 5.2.4:

Variables: SF SG PC L FE EE_A EE_B OB I1 I2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OB @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.2.5:

Variables: SF SG PC L FE EE_A OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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) OA @
EvB : evalExpr FE EE_B (div E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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) OA @
EvB : evalExpr FE EE_B (div E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvB : evalExpr FE EE_B (div E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B OB I1 O1 I2 O2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) 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 OA EE_B OB I1 I2 O2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.5:

Variables: SF SG PC L FE EE_A OA EE_B OB I1 I2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA4 EvB3.

Subgoal 5.2.5:

Variables: SF SG PC L FE EE_A EE_B OB I1 I2 I E2 E1 L2 L3 I4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OB @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.2.6:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 [] @
EvB : evalExpr FE EE_B true VB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 [] @
============================
 [] = []
 < search.

Subgoal 5.2.7:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 [] @
EvB : evalExpr FE EE_B false VB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 [] @
============================
 [] = []
 < search.

Subgoal 5.2.8:

Variables: SF SG PC L FE EE_A OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsE.

Subgoal 5.2.8:

Variables: SF SG PC L FE EE_A OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OA EE_B OB O1 O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal 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 OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply level_is to _ _ _ Lev.

Subgoal 5.2.8.1:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
============================
 OA = OB
 < apply join_is to _ _ Lev1.

Subgoal 5.2.8.1:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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 OA EE_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OB @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : is_slev Sl1
============================
 OB = OB
 < search.

Subgoal 5.2.8.2:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.8.2:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OB
============================
 OA = OB
 < NEq: assert L2 = public -> false.

Subgoal 5.2.8.2.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OB
============================
 L2 = public -> false
 < intros E.

Subgoal 5.2.8.2.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OB
E : L2 = public
============================
 false
 < case E.

Subgoal 5.2.8.2.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OB
============================
 false
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.8.2:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OA = OB
 < apply expr_not_public_no_output to _ _ _ _ _ _ _ _ _ EvA2 Lev2 _.

Subgoal 5.2.8.2:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal [] *
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 OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OA = OB
 < apply append_nil_right to EvA3.

Subgoal 5.2.8.2:

Variables: SF SG PC L FE EE_A OA EE_B 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OA *
EvA2 : evalExpr FE EE_A E2 trueVal [] *
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 OA
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OA = OA
 < search.

Subgoal 5.2.8.3:

Variables: SF SG PC L FE EE_A OA EE_B OB O1 O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal 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 OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply level_is to _ _ _ Lev.

Subgoal 5.2.8.3:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
============================
 OA = OB
 < apply join_is to _ _ Lev1.

Subgoal 5.2.8.3:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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 OA EE_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OB @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : is_slev Sl1
============================
 OB = OB
 < search.

Subgoal 5.2.9:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal OA *
============================
 OA = OB
 < case IsE.

Subgoal 5.2.9:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal 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 OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal OA *
H1 : is_expr E1
H2 : is_expr E2
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 OA EE_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OA *
H1 : is_expr E1
H2 : is_expr E2
Lev : level SF SG PC E1 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal O2
EvB2 : O1 ++ O2 = OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal []
EvB2 : O1 ++ [] = OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 O1 = OB
 < apply append_nil_right to EvB2.

Subgoal 5.2.9.1:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OB @
EvA1 : evalExpr FE EE_A E1 falseVal 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 OB
EvB1 : evalExpr FE EE_B E2 trueVal []
EvB2 : OB ++ [] = OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OB = OB
 < search.

Subgoal 5.2.9.2:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OA *
H1 : is_expr E1
H2 : is_expr E2
Lev : level SF SG PC E1 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 OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.9.2:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OB @
EvA1 : evalExpr FE EE_A E1 falseVal 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 OB
============================
 OB = OB
 < search.

Subgoal 5.2.9.3:

Variables: SF SG PC L FE EE_A OA EE_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OA *
H1 : is_expr E1
H2 : is_expr E2
Lev : level SF SG PC E1 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal O2
EvB2 : O1 ++ O2 = OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 falseVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal []
EvB2 : O1 ++ [] = OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 O1 = OB
 < apply append_nil_right to EvB2.

Subgoal 5.2.9.3:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OB @
EvA1 : evalExpr FE EE_A E1 falseVal 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 OB
EvB1 : evalExpr FE EE_B E2 falseVal []
EvB2 : OB ++ [] = OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OB = OB
 < search.

Subgoal 5.2.10:

Variables: SF SG PC L FE EE_A OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsE.

Subgoal 5.2.10:

Variables: SF SG PC L FE EE_A OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OA EE_B OB O1 O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal 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 OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply level_is to _ _ _ Lev.

Subgoal 5.2.10.1:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
============================
 OA = OB
 < apply join_is to _ _ Lev1.

Subgoal 5.2.10.1:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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 OA EE_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OB @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : is_slev Sl1
============================
 OB = OB
 < search.

Subgoal 5.2.10.2:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.10.2:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OB
============================
 OA = OB
 < NEq: assert L2 = public -> false.

Subgoal 5.2.10.2.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OB
============================
 L2 = public -> false
 < intros E.

Subgoal 5.2.10.2.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OB
E : L2 = public
============================
 false
 < case E.

Subgoal 5.2.10.2.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OB
============================
 false
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.10.2:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OA = OB
 < apply expr_not_public_no_output to _ _ _ _ _ _ _ _ _ EvA2 Lev2 _.

Subgoal 5.2.10.2:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal [] *
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 OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OA = OB
 < apply append_nil_right to EvA3.

Subgoal 5.2.10.2:

Variables: SF SG PC L FE EE_A OA EE_B 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OA *
EvA2 : evalExpr FE EE_A E2 falseVal [] *
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 OA
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OA = OA
 < search.

Subgoal 5.2.10.3:

Variables: SF SG PC L FE EE_A OA EE_B OB O1 O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal 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 OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply level_is to _ _ _ Lev.

Subgoal 5.2.10.3:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
============================
 OA = OB
 < apply join_is to _ _ Lev1.

Subgoal 5.2.10.3:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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 OA EE_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OB @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : is_slev Sl1
============================
 OB = OB
 < search.

Subgoal 5.2.11:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal OA *
============================
 OA = OB
 < case IsE.

Subgoal 5.2.11:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal 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 OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal OA *
H1 : is_expr E1
H2 : is_expr E2
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 OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OA *
H1 : is_expr E1
H2 : is_expr E2
Lev : level SF SG PC E1 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 OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.11.1:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OB @
EvA1 : evalExpr FE EE_A E1 trueVal 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 OB
============================
 OB = OB
 < search.

Subgoal 5.2.11.2:

Variables: SF SG PC L FE EE_A OA EE_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OA *
H1 : is_expr E1
H2 : is_expr E2
Lev : level SF SG PC E1 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal O2
EvB2 : O1 ++ O2 = OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 trueVal []
EvB2 : O1 ++ [] = OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 O1 = OB
 < apply append_nil_right to EvB2.

Subgoal 5.2.11.2:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OB @
EvA1 : evalExpr FE EE_A E1 trueVal 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 OB
EvB1 : evalExpr FE EE_B E2 trueVal []
EvB2 : OB ++ [] = OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OB = OB
 < search.

Subgoal 5.2.11.3:

Variables: SF SG PC L FE EE_A OA EE_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OA *
H1 : is_expr E1
H2 : is_expr E2
Lev : level SF SG PC E1 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal O2
EvB2 : O1 ++ O2 = OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 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_B OB E2 E1 L2 Sl1 L3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 O1 @
EvA1 : evalExpr FE EE_A E1 trueVal 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 O1
EvB1 : evalExpr FE EE_B E2 falseVal []
EvB2 : O1 ++ [] = OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 O1 = OB
 < apply append_nil_right to EvB2.

Subgoal 5.2.11.3:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OB @
EvA1 : evalExpr FE EE_A E1 trueVal 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 OB
EvB1 : evalExpr FE EE_B E2 falseVal []
EvB2 : OB ++ [] = OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OB = OB
 < search.

Subgoal 5.2.12:

Variables: SF SG PC L FE EE_A OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsE.

Subgoal 5.2.12:

Variables: SF SG PC L FE EE_A OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.12.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OB
============================
 OA = OB
 < NEq: assert L2 = public -> false.

Subgoal 5.2.12.1.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OB
============================
 L2 = public -> false
 < intros E.

Subgoal 5.2.12.1.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OB
E : L2 = public
============================
 false
 < case E.

Subgoal 5.2.12.1.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OB
============================
 false
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.12.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OA = OB
 < apply expr_not_public_no_output to _ _ _ _ _ _ _ _ _ EvA2 Lev2 _.

Subgoal 5.2.12.1:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 trueVal [] *
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 OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OA = OB
 < apply append_nil_right to EvA3.

Subgoal 5.2.12.1:

Variables: SF SG PC L FE EE_A OA EE_B 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OA *
EvA2 : evalExpr FE EE_A E2 trueVal [] *
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 OA
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OA = OA
 < search.

Subgoal 5.2.12.2:

Variables: SF SG PC L FE EE_A OA EE_B OB O1 O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal 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 OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply level_is to _ _ _ Lev.

Subgoal 5.2.12.2:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
============================
 OA = OB
 < apply join_is to _ _ Lev1.

Subgoal 5.2.12.2:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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 OA EE_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OB @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : is_slev Sl1
============================
 OB = OB
 < search.

Subgoal 5.2.12.3:

Variables: SF SG PC L FE EE_A OA EE_B OB O1 O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal 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 OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply level_is to _ _ _ Lev.

Subgoal 5.2.12.3:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
============================
 OA = OB
 < apply join_is to _ _ Lev1.

Subgoal 5.2.12.3:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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 OA EE_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OB @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : is_slev Sl1
============================
 OB = OB
 < search.

Subgoal 5.2.13:

Variables: SF SG PC L FE EE_A OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsE.

Subgoal 5.2.13:

Variables: SF SG PC L FE EE_A OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.13.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OB
============================
 OA = OB
 < NEq: assert L2 = public -> false.

Subgoal 5.2.13.1.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OB
============================
 L2 = public -> false
 < intros E.

Subgoal 5.2.13.1.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OB
E : L2 = public
============================
 false
 < case E.

Subgoal 5.2.13.1.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OB
============================
 false
 < apply expr_level to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.13.1:

Variables: SF SG PC L FE EE_A OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 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 OA EE_B OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OA = OB
 < apply expr_not_public_no_output to _ _ _ _ _ _ _ _ _ EvA2 Lev2 _.

Subgoal 5.2.13.1:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
EvA2 : evalExpr FE EE_A E2 falseVal [] *
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 OB
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OA = OB
 < apply append_nil_right to EvA3.

Subgoal 5.2.13.1:

Variables: SF SG PC L FE EE_A OA EE_B 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OA *
EvA2 : evalExpr FE EE_A E2 falseVal [] *
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 OA
NEq : L2 = public -> false
H3 : is_slev L2
H4 : is_slev Sl1
H5 : Sl1 = public -> false
============================
 OA = OA
 < search.

Subgoal 5.2.13.2:

Variables: SF SG PC L FE EE_A OA EE_B OB O1 O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal 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 OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply level_is to _ _ _ Lev.

Subgoal 5.2.13.2:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
============================
 OA = OB
 < apply join_is to _ _ Lev1.

Subgoal 5.2.13.2:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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 OA EE_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OB @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : is_slev Sl1
============================
 OB = OB
 < search.

Subgoal 5.2.13.3:

Variables: SF SG PC L FE EE_A OA EE_B OB O1 O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal 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 OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply level_is to _ _ _ Lev.

Subgoal 5.2.13.3:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
============================
 OA = OB
 < apply join_is to _ _ Lev1.

Subgoal 5.2.13.3:

Variables: SF SG PC L FE EE_A OA EE_B OB O2 E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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 OA EE_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : 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_B OB E2 E1 L2 Sl1 L3 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : names_same EE_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 OB @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
H3 : is_slev L2
H4 : is_slev Sl1
============================
 OB = OB
 < search.

Subgoal 5.2.14:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (not E1) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal OA *
============================
 OA = OB
 < case IsE.

Subgoal 5.2.14:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (not E1) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal OA *
H1 : is_expr E1
============================
 OA = OB
 < Lev: case Lev.

Subgoal 5.2.14:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvB : evalExpr FE EE_B (not E1) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal 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 OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OA *
H1 : is_expr E1
Lev : level SF SG PC E1 L
EvB : evalExpr FE EE_B E1 falseVal OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.14.1:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
H1 : is_expr E1
Lev : level SF SG PC E1 L
EvB : evalExpr FE EE_B E1 falseVal OB
============================
 OB = OB
 < search.

Subgoal 5.2.14.2:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OA *
H1 : is_expr E1
Lev : level SF SG PC E1 L
EvB : evalExpr FE EE_B E1 trueVal OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.14.2:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
H1 : is_expr E1
Lev : level SF SG PC E1 L
EvB : evalExpr FE EE_B E1 trueVal OB
============================
 OB = OB
 < search.

Subgoal 5.2.15:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (not E1) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal OA *
============================
 OA = OB
 < case IsE.

Subgoal 5.2.15:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (not E1) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal OA *
H1 : is_expr E1
============================
 OA = OB
 < Lev: case Lev.

Subgoal 5.2.15:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvB : evalExpr FE EE_B (not E1) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal 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 OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OA *
H1 : is_expr E1
Lev : level SF SG PC E1 L
EvB : evalExpr FE EE_B E1 falseVal OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.15.1:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
H1 : is_expr E1
Lev : level SF SG PC E1 L
EvB : evalExpr FE EE_B E1 falseVal OB
============================
 OB = OB
 < search.

Subgoal 5.2.15.2:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OA *
H1 : is_expr E1
Lev : level SF SG PC E1 L
EvB : evalExpr FE EE_B E1 trueVal OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.15.2:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
H1 : is_expr E1
Lev : level SF SG PC E1 L
EvB : evalExpr FE EE_B E1 trueVal OB
============================
 OB = OB
 < search.

Subgoal 5.2.16:

Variables: SF SG PC L FE EE_A OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (greater E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsE.

Subgoal 5.2.16:

Variables: SF SG PC L FE EE_A OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (greater E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvB : evalExpr FE EE_B (greater E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B OB I1 O1 I2 O2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) 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 OA EE_B OB I1 I2 O2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.16.1:

Variables: SF SG PC L FE EE_A OA EE_B OB I1 I2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA4 EvB3.

Subgoal 5.2.16.1:

Variables: SF SG PC L FE EE_A EE_B OB I1 I2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.2.16.2:

Variables: SF SG PC L FE EE_A OA EE_B OB I1 O1 I2 O2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) 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 OA EE_B OB I1 I2 O2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.16.2:

Variables: SF SG PC L FE EE_A OA EE_B OB I1 I2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA4 EvB3.

Subgoal 5.2.16.2:

Variables: SF SG PC L FE EE_A EE_B OB I1 I2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.2.17:

Variables: SF SG PC L FE EE_A OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (greater E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsE.

Subgoal 5.2.17:

Variables: SF SG PC L FE EE_A OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (greater E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B VB OB I1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvB : evalExpr FE EE_B (greater E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B OB I1 O1 I2 O2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) 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 OA EE_B OB I1 I2 O2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.17.1:

Variables: SF SG PC L FE EE_A OA EE_B OB I1 I2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA4 EvB3.

Subgoal 5.2.17.1:

Variables: SF SG PC L FE EE_A EE_B OB I1 I2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.2.17.2:

Variables: SF SG PC L FE EE_A OA EE_B OB I1 O1 I2 O2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) 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 OA EE_B OB I1 I2 O2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.17.2:

Variables: SF SG PC L FE EE_A OA EE_B OB I1 I2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA4 EvB3.

Subgoal 5.2.17.2:

Variables: SF SG PC L FE EE_A EE_B OB I1 I2 E2 E1 L2 L3 I3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.2.18:

Variables: SF SG PC L FE EE_A OA EE_B VB OB V 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (eq E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsE.

Subgoal 5.2.18:

Variables: SF SG PC L FE EE_A OA EE_B VB OB V 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (eq E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V 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 OA EE_B VB OB V 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvB : evalExpr FE EE_B (eq E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V 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 OA EE_B OB V O1 O2 E2 E1 L2 L3 V1 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V 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 O3
EvB1 : evalExpr FE EE_B E2 V1 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 OA EE_B OB V O2 E2 E1 L2 L3 V1 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 V O3 *
EvA2 : evalExpr FE EE_A E2 V 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 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.18.1:

Variables: SF SG PC L FE EE_A OA EE_B OB V E2 E1 L2 L3 V1 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 V O3 *
EvA2 : evalExpr FE EE_A E2 V 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 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA3 EvB2.

Subgoal 5.2.18.1:

Variables: SF SG PC L FE EE_A EE_B OB V E2 E1 L2 L3 V1 O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : evalExpr FE EE_A E1 V O3 *
EvA2 : evalExpr FE EE_A E2 V 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 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.2.18.2:

Variables: SF SG PC L FE EE_A OA EE_B OB V O1 O2 E2 E1 L2 L3 V1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V 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 O3
EvB1 : evalExpr FE EE_B E2 V2 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 OA EE_B OB V O2 E2 E1 L2 L3 V1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 V O3 *
EvA2 : evalExpr FE EE_A E2 V 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 O3
EvB1 : evalExpr FE EE_B E2 V2 O4
EvB2 : V1 = V2 -> false
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.18.2:

Variables: SF SG PC L FE EE_A OA EE_B OB V E2 E1 L2 L3 V1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 V O3 *
EvA2 : evalExpr FE EE_A E2 V 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 O3
EvB1 : evalExpr FE EE_B E2 V2 O4
EvB2 : V1 = V2 -> false
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA3 EvB3.

Subgoal 5.2.18.2:

Variables: SF SG PC L FE EE_A EE_B OB V E2 E1 L2 L3 V1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : evalExpr FE EE_A E1 V O3 *
EvA2 : evalExpr FE EE_A E2 V 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 O3
EvB1 : evalExpr FE EE_B E2 V2 O4
EvB2 : V1 = V2 -> false
EvB3 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.2.19:

Variables: SF SG PC L FE EE_A OA EE_B VB OB V1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (eq E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 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 OA EE_B VB OB V1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (eq E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 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 OA EE_B VB OB V1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvB : evalExpr FE EE_B (eq E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 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 OA EE_B OB V1 O1 V2 O2 E2 E1 L2 L3 V O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 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 O3
EvB1 : evalExpr FE EE_B E2 V 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 OA EE_B OB V1 V2 O2 E2 E1 L2 L3 V O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V2 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 O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.19.1:

Variables: SF SG PC L FE EE_A OA EE_B OB V1 V2 E2 E1 L2 L3 V O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V2 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 O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA4 EvB2.

Subgoal 5.2.19.1:

Variables: SF SG PC L FE EE_A EE_B OB V1 V2 E2 E1 L2 L3 V O3 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V2 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 O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.2.19.2:

Variables: SF SG PC L FE EE_A OA EE_B OB V1 O1 V2 O2 E2 E1 L2 L3 V3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 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 O3
EvB1 : evalExpr FE EE_B E2 V4 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 OA EE_B OB V1 V2 O2 E2 E1 L2 L3 V3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V2 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 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V3 = V4 -> false
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.19.2:

Variables: SF SG PC L FE EE_A OA EE_B OB V1 V2 E2 E1 L2 L3 V3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V2 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 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V3 = V4 -> false
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA4 EvB3.

Subgoal 5.2.19.2:

Variables: SF SG PC L FE EE_A EE_B OB V1 V2 E2 E1 L2 L3 V3 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V2 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 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V3 = V4 -> false
EvB3 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.2.20:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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) [] @
EvB : evalExpr FE EE_B (stringLit S) VB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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) [] @
============================
 [] = []
 < search.

Subgoal 5.2.21:

Variables: SF SG PC L FE EE_A OA EE_B VB OB S1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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) OA @
EvB : evalExpr FE EE_B (appString E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) 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 OA EE_B VB OB S1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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) OA @
EvB : evalExpr FE EE_B (appString E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) 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 OA EE_B VB OB S1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvB : evalExpr FE EE_B (appString E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) 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 OA EE_B OB S1 O1 S2 O2 S E2 E1 L2 L3 S4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) 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) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) 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 OA EE_B OB S1 S2 O2 S E2 E1 L2 L3 S4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) 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) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.21:

Variables: SF SG PC L FE EE_A OA EE_B OB S1 S2 S E2 E1 L2 L3 S4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) 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) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA4 EvB3.

Subgoal 5.2.21:

Variables: SF SG PC L FE EE_A EE_B OB S1 S2 S E2 E1 L2 L3 S4 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OB @
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) 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) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.2.22:

Variables: SF SG PC L FE EE_A VA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 [] @
EvB : evalExpr FE EE_B (name X) VB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 [] @
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (call Fun Args) VB OB
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O1 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O1 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
============================
 OA = OB
 < case IsE.

Subgoal 5.2.23:

Variables: SF SG PC L FE EE_A VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (call Fun Args) VB OB
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O1 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O1 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O1 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O1 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar1 EE2 VB
============================
 OA = OB
 < Lev: case Lev.

Subgoal 5.2.23.1:

Variables: SF SG FE EE_A VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O1 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O1 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar1 EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar1 EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar1 EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar1 EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
 < SF: case SecFuns (keep).

Subgoal 5.2.23.1:

Variables: SF SG FE EE_A VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
============================
 OA = OB
 < LAV: apply level_args_vals to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.23.1:

Variables: SF SG FE EE_A VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O4 *
EvA5 : O3 ++ O4 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O4 *
EvA5 : O3 ++ O4 = OB
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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
SF : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O1 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O1 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar1 EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar1 EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar1 EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar1 EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 level_args_vals to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.2.23.2:

Variables: SF SG L FE EE_A VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O4 *
EvA5 : O3 ++ O4 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 VA EE_B VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE1 Args Fun ArgVals1 O3 InitEnv1 EE2 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O3 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O4 *
EvA5 : O3 ++ O4 = OB
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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) OA @
EvB : evalExpr FE EE_B (recBuild RF) VB OB
EvA1 : evalRecFields FE EE_A RF VF OA *
============================
 OA = OB
 < case IsE.

Subgoal 5.2.24:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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) OA @
EvB : evalExpr FE EE_B (recBuild RF) VB OB
EvA1 : evalRecFields FE EE_A RF VF OA *
H1 : is_recFieldExprs RF
============================
 OA = OB
 < Lev: case Lev.

Subgoal 5.2.24:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvB : evalExpr FE EE_B (recBuild RF) VB OB
EvA1 : evalRecFields FE EE_A RF VF OA *
H1 : is_recFieldExprs RF
Lev : levelRecFields SF SG PC RF L
============================
 OA = OB
 < EvB: case EvB.

Subgoal 5.2.24:

Variables: SF SG PC L FE EE_A OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OA @
EvA1 : evalRecFields FE EE_A RF VF OA *
H1 : is_recFieldExprs RF
Lev : levelRecFields SF SG PC RF L
EvB : evalRecFields FE EE_B RF VF1 OB
============================
 OA = OB
 < apply IH_RF to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.24:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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) OB @
EvA1 : evalRecFields FE EE_A RF VF OB *
H1 : is_recFieldExprs RF
Lev : levelRecFields SF SG PC RF L
EvB : evalRecFields FE EE_B RF VF1 OB
============================
 OB = OB
 < search.

Subgoal 5.2.25:

Variables: SF SG PC L FE EE_A VA OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB OB
EvA1 : evalExpr FE EE_A Rec (recVal Fields) OA *
EvA2 : lookupRecFieldVal Fields F VA
============================
 OA = OB
 < case IsE.

Subgoal 5.2.25:

Variables: SF SG PC L FE EE_A VA OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB OB
EvA1 : evalExpr FE EE_A Rec (recVal Fields) OA *
EvA2 : lookupRecFieldVal Fields F VA
H1 : is_expr Rec
H2 : is_string F
============================
 OA = OB
 < Lev: case Lev.

Subgoal 5.2.25:

Variables: SF SG PC L FE EE_A VA OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB OB
EvA1 : evalExpr FE EE_A Rec (recVal Fields) OA *
EvA2 : lookupRecFieldVal 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.25:

Variables: SF SG PC L FE EE_A VA OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvA1 : evalExpr FE EE_A Rec (recVal Fields) OA *
EvA2 : lookupRecFieldVal 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) OB
EvB1 : lookupRecFieldVal Fields1 F VB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB.

Subgoal 5.2.25:

Variables: SF SG PC L FE EE_A VA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvA1 : evalExpr FE EE_A Rec (recVal Fields) OB *
EvA2 : lookupRecFieldVal 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) OB
EvB1 : lookupRecFieldVal Fields1 F VB
============================
 OB = OB
 < search.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE_A VA OA EE_B VB OB E_P V_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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalExpr FE EE_B <unknown K evalExpr> VB OB
EvA1 : |{expr}- <unknown K evalExpr> ~~> E_P
EvA2 : evalExpr FE EE_A E_P V_P O_P *
============================
 OA = OB
 < Lev: case Lev.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE_A VA OA EE_B VB OB E_P V_P O_P 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvB : evalExpr FE EE_B <unknown K evalExpr> VB OB
EvA1 : |{expr}- <unknown K evalExpr> ~~> E_P
EvA2 : evalExpr FE EE_A E_P V_P O_P *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P1
Lev1 : level SF SG PC E_P1 L
============================
 OA = OB
 < apply proj_expr_unique to Lev EvA1 _.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE_A VA OA EE_B VB OB E_P V_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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvB : evalExpr FE EE_B <unknown K evalExpr> VB OB
EvA1 : |{expr}- <unknown K evalExpr> ~~> E_P
EvA2 : evalExpr FE EE_A E_P V_P O_P *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P
Lev1 : level SF SG PC E_P L
============================
 OA = OB
 < apply proj_expr_is to Lev _.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE_A VA OA EE_B VB OB E_P V_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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvB : evalExpr FE EE_B <unknown K evalExpr> VB OB
EvA1 : |{expr}- <unknown K evalExpr> ~~> E_P
EvA2 : evalExpr FE EE_A E_P V_P O_P *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P
Lev1 : level SF SG PC E_P L
H1 : is_expr E_P
============================
 OA = OB
 < NSB-: apply names_same_symmetric to NSB.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE_A VA OA EE_B VB OB E_P V_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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvB : evalExpr FE EE_B <unknown K evalExpr> VB OB
EvA1 : |{expr}- <unknown K evalExpr> ~~> E_P
EvA2 : evalExpr FE EE_A E_P V_P O_P *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P
Lev1 : level SF SG PC E_P L
H1 : is_expr E_P
NSB- : names_same SG EE_B
============================
 OA = OB
 < NSAB: apply names_same_transitive to NSA NSB-.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE_A VA OA EE_B VB OB E_P V_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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvB : evalExpr FE EE_B <unknown K evalExpr> VB OB
EvA1 : |{expr}- <unknown K evalExpr> ~~> E_P
EvA2 : evalExpr FE EE_A E_P V_P O_P *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P
Lev1 : level SF SG PC E_P L
H1 : is_expr E_P
NSB- : names_same SG EE_B
NSAB : names_same EE_A EE_B
============================
 OA = OB
 < EvB': apply proj_evalExpr_exists to Lev _ _ _ EvB.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE_A VA OA EE_B VB OB E_P V_P O_P V'
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvB : evalExpr FE EE_B <unknown K evalExpr> VB OB
EvA1 : |{expr}- <unknown K evalExpr> ~~> E_P
EvA2 : evalExpr FE EE_A E_P V_P O_P *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P
Lev1 : level SF SG PC E_P L
H1 : is_expr E_P
NSB- : names_same SG EE_B
NSAB : names_same EE_A EE_B
EvB' : evalExpr FE EE_B E_P V' OB
============================
 OA = OB
 < EvA': apply proj_evalExpr_exists to EvA1 _ _ _ EvA.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE_A VA OA EE_B VB OB E_P V_P O_P V' V'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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OA @
EvB : evalExpr FE EE_B <unknown K evalExpr> VB OB
EvA1 : |{expr}- <unknown K evalExpr> ~~> E_P
EvA2 : evalExpr FE EE_A E_P V_P O_P *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P
Lev1 : level SF SG PC E_P L
H1 : is_expr E_P
NSB- : names_same SG EE_B
NSAB : names_same EE_A EE_B
EvB' : evalExpr FE EE_B E_P V' OB
EvA' : evalExpr FE EE_A E_P V'1 OA
============================
 OA = OB
 < apply evalExpr_unique to _ _ _ EvA' EvA2.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE_A VA EE_B VB OB E_P V_P O_P V'
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 O_P @
EvB : evalExpr FE EE_B <unknown K evalExpr> VB OB
EvA1 : |{expr}- <unknown K evalExpr> ~~> E_P
EvA2 : evalExpr FE EE_A E_P V_P O_P *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P
Lev1 : level SF SG PC E_P L
H1 : is_expr E_P
NSB- : names_same SG EE_B
NSAB : names_same EE_A EE_B
EvB' : evalExpr FE EE_B E_P V' OB
EvA' : evalExpr FE EE_A E_P V_P O_P
============================
 O_P = OB
 < PE_Pr: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB'.

Subgoal 5.2.26:

Variables: SF SG PC L FE EE_A VA EE_B VB OB E_P V_P V'
IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
SFC : secFunCtxs SF FE
NSA : 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 OB @
EvB : evalExpr FE EE_B <unknown K evalExpr> VB OB
EvA1 : |{expr}- <unknown K evalExpr> ~~> E_P
EvA2 : evalExpr FE EE_A E_P V_P OB *
Lev : |{expr}- <unknown K evalExpr> ~~> E_P
Lev1 : level SF SG PC E_P L
H1 : is_expr E_P
NSB- : names_same SG EE_B
NSAB : names_same EE_A EE_B
EvB' : evalExpr FE EE_B E_P V' OB
EvA' : evalExpr FE EE_A E_P V_P OB
============================
 OB = OB
 < search.

Subgoal 5.3.1:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 [] [] @
EvB : evalArgs FE EE_B nilArgs VB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 [] [] @
============================
 [] = []
 < search.

Subgoal 5.3.2:

Variables: SF SG PC L FE EE_A OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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) OA @
EvB : evalArgs FE EE_B (consArgs E Rest) VB OB
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsA.

Subgoal 5.3.2:

Variables: SF SG PC L FE EE_A OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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) OA @
EvB : evalArgs FE EE_B (consArgs E Rest) VB OB
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest 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 OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) OA @
EvB : evalArgs FE EE_B (consArgs E Rest) VB OB
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest 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 OA EE_B OB O1 O2 VRest V Rest E Rest1 L1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) OA @
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest 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 O3
EvB1 : evalArgs FE EE_B Rest VRest1 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 OA EE_B OB O2 VRest V Rest E Rest1 L1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) OA @
EvA1 : evalExpr FE EE_A E V O3 *
EvA2 : evalArgs FE EE_A Rest VRest 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 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_A to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.3.2:

Variables: SF SG PC FE EE_A OA EE_B OB VRest V Rest E Rest1 L1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) OA @
EvA1 : evalExpr FE EE_A E V O3 *
EvA2 : evalArgs FE EE_A Rest VRest 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 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA3 EvB2.

Subgoal 5.3.2:

Variables: SF SG PC FE EE_A EE_B OB VRest V Rest E Rest1 L1 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) OB @
EvA1 : evalExpr FE EE_A E V O3 *
EvA2 : evalArgs FE EE_A Rest VRest 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 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.3.3:

Variables: SF SG PC L FE EE_A VA OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalArgs FE EE_B <unknown K evalArgs> VB OB
============================
 OA = OB
 < case Lev.

Subgoal 5.4.1:

Variables: SF SG PC L FE EE_A 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 nilRecFieldVals [] @
EvB : evalRecFields FE EE_B nilRecFieldExprs VB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 nilRecFieldVals [] @
============================
 [] = []
 < search.

Subgoal 5.4.2:

Variables: SF SG PC L FE EE_A OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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) (consRecFieldVals F V VRest) OA @
EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB OB
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsRF.

Subgoal 5.4.2:

Variables: SF SG PC L FE EE_A OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
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) (consRecFieldVals F V VRest) OA @
EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB OB
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest 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 OA EE_B VB OB 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) (consRecFieldVals F V VRest) OA @
EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB OB
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest 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 OA EE_B OB O1 O2 VRest V F Rest E LE LRF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) (consRecFieldVals F V VRest) OA @
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest 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 O3
EvB1 : evalRecFields FE EE_B Rest VRest1 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 OA EE_B OB O2 VRest V F Rest E LE LRF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) (consRecFieldVals F V VRest) OA @
EvA1 : evalExpr FE EE_A E V O3 *
EvA2 : evalRecFields FE EE_A Rest VRest 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 O3
EvB1 : evalRecFields FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_RF to _ _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1.

Subgoal 5.4.2:

Variables: SF SG PC L FE EE_A OA EE_B OB VRest V F Rest E LE LRF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) (consRecFieldVals F V VRest) OA @
EvA1 : evalExpr FE EE_A E V O3 *
EvA2 : evalRecFields FE EE_A Rest VRest 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 O3
EvB1 : evalRecFields FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA3 EvB2.

Subgoal 5.4.2:

Variables: SF SG PC L FE EE_A EE_B OB VRest V F Rest E LE LRF 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB OB -> OA = OB
IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
IsSG : is_list (is_list (is_pair is_string is_slev)) SG
IsPC : is_slev PC
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A
IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B
SecFuns : secFuns SF
SFC : 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) (consRecFieldVals F V VRest) OB @
EvA1 : evalExpr FE EE_A E V O3 *
EvA2 : evalRecFields FE EE_A Rest VRest 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 O3
EvB1 : evalRecFields FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 5.4.3:

Variables: SF SG PC L FE EE_A VA OA 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) ->
         secFuns SF -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG ->
         public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' ->
         evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB ->
         OA = OB
IH_E : forall E SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA OA * ->
         evalExpr FE EE_B E VB OB -> OA = OB
IH_A : forall A SF SG PC L FE EE_A VA OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
         is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
         public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA OA * ->
         evalArgs FE EE_B A VB OB -> OA = OB
IH_RF : forall RF SF SG PC L FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ->
          is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          secFuns SF -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG ->
          public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA OA * ->
          evalRecFields FE EE_B RF VB 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
SecFuns : secFuns SF
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 OA @
EvB : evalRecFields FE EE_B <unknown K evalRecFields> VB 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
FS4 : allPublic 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
FS4 : allPublic 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
FS4 : allPublic 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
FS4 : allPublic 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
FS4 : allPublic 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.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 (secfun FName RetTy public 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_slev public
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, public)::ParamSecs1] public Body SG
FS2 : lookup SF FName (public, PSecs1)
FS3 : values ParamSecs1 PSecs1
FS4 : allPublic 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 2.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 (secfun FName RetTy public 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_slev public
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, public)::ParamSecs1] public Body SG
FS2 : lookup SF FName (public, PSecs1)
FS3 : values ParamSecs1 PSecs1
FS4 : allPublic 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 2.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 (secfun FName RetTy public 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_slev public
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, public)::ParamSecs1] public Body SG
FS2 : lookup SF FName (public, PSecs1)
FS3 : values ParamSecs1 PSecs1
FS4 : allPublic 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 2.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 (secfun FName RetTy public 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_slev public
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, public)::ParamSecs] public Body SG
FS2 : lookup SF FName (public, PSecs1)
FS3 : values ParamSecs PSecs1
FS4 : allPublic 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 2.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 (secfun FName RetTy public 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_slev public
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, public)::ParamSecs] public Body SG
FS2 : lookup SF FName (public, PSecs)
FS3 : values ParamSecs PSecs
FS4 : allPublic 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.2:

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 (secfun FName RetTy private RetVar RVVal Params Body) FName private PSecs @
GFS1 : paramSecs Params ParamSecs
GFS2 : values ParamSecs PSecs
H1 : is_string FName
H2 : is_typ RetTy
H3 : is_slev private
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, private)::ParamSecs1] private Body SG
FS2 : lookup SF FName (private, PSecs1)
FS3 : values ParamSecs1 PSecs1
============================
 exists ZP SG,
   (FName = FName /\ zip PNames PSecs ZP) /\
   secure SF [(RetVar, private)::ZP] private Body SG
 < Dmn: apply paramNames_paramSecs to _ GFEI FS.

Subgoal 2.2:

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 (secfun FName RetTy private RetVar RVVal Params Body) FName private PSecs @
GFS1 : paramSecs Params ParamSecs
GFS2 : values ParamSecs PSecs
H1 : is_string FName
H2 : is_typ RetTy
H3 : is_slev private
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, private)::ParamSecs1] private Body SG
FS2 : lookup SF FName (private, PSecs1)
FS3 : values ParamSecs1 PSecs1
Dmn : domain ParamSecs1 PNames
============================
 exists ZP SG,
   (FName = FName /\ zip PNames PSecs ZP) /\
   secure SF [(RetVar, private)::ZP] private Body SG
 < Z: apply domain_values_zip to Dmn FS3.

Subgoal 2.2:

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 (secfun FName RetTy private RetVar RVVal Params Body) FName private PSecs @
GFS1 : paramSecs Params ParamSecs
GFS2 : values ParamSecs PSecs
H1 : is_string FName
H2 : is_typ RetTy
H3 : is_slev private
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, private)::ParamSecs1] private Body SG
FS2 : lookup SF FName (private, 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, private)::ZP] private Body SG
 < apply paramSecs_unique to _ FS GFS1.

Subgoal 2.2:

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 (secfun FName RetTy private RetVar RVVal Params Body) FName private PSecs @
GFS1 : paramSecs Params ParamSecs
GFS2 : values ParamSecs PSecs
H1 : is_string FName
H2 : is_typ RetTy
H3 : is_slev private
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, private)::ParamSecs] private Body SG
FS2 : lookup SF FName (private, 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, private)::ZP] private Body SG
 < apply values_unique to FS3 GFS2.

Subgoal 2.2:

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 (secfun FName RetTy private RetVar RVVal Params Body) FName private PSecs @
GFS1 : paramSecs Params ParamSecs
GFS2 : values ParamSecs PSecs
H1 : is_string FName
H2 : is_typ RetTy
H3 : is_slev private
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, private)::ParamSecs] private Body SG
FS2 : lookup SF FName (private, 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, private)::ZP] private 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
      getFunSec_allPublic : forall F SF Name PSecs,
         IsF : is_fun F ->
         FS : funSecure SF F ->
         GFS : getFunSec F Name public PSecs ->
         allPublic PSecs
      on FS.

Subgoal 1:

Variables: SF Name PSecs ParamSecs SG PSecs1 Body Params RVVal RetVar RetTy FunName
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
IsF : is_fun (fun FunName RetTy RetVar RVVal Params Body)
FS : funSecure SF (fun FunName RetTy RetVar RVVal Params Body) @
GFS : getFunSec (fun FunName RetTy RetVar RVVal Params Body) Name public PSecs
FS1 : paramSecs Params ParamSecs
FS2 : secure SF [(RetVar, public)::ParamSecs] public Body SG
FS3 : lookup SF FunName (public, PSecs1)
FS4 : values ParamSecs PSecs1
FS5 : allPublic PSecs1
============================
 allPublic PSecs
 < case IsF.

Subgoal 1:

Variables: SF Name PSecs ParamSecs SG PSecs1 Body Params RVVal RetVar RetTy FunName
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
FS : funSecure SF (fun FunName RetTy RetVar RVVal Params Body) @
GFS : getFunSec (fun FunName RetTy RetVar RVVal Params Body) Name public PSecs
FS1 : paramSecs Params ParamSecs
FS2 : secure SF [(RetVar, public)::ParamSecs] public Body SG
FS3 : lookup SF FunName (public, PSecs1)
FS4 : values ParamSecs PSecs1
FS5 : allPublic PSecs1
H1 : is_string FunName
H2 : is_typ RetTy
H3 : is_string RetVar
H4 : is_value RVVal
H5 : is_list is_param Params
H6 : is_stmt Body
============================
 allPublic PSecs
 < GFS: case GFS.

Subgoal 1:

Variables: SF Name PSecs ParamSecs SG PSecs1 Body Params RVVal RetVar RetTy ParamSecs1
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
FS : funSecure SF (fun Name RetTy RetVar RVVal Params Body) @
FS1 : paramSecs Params ParamSecs
FS2 : secure SF [(RetVar, public)::ParamSecs] public Body SG
FS3 : lookup SF Name (public, PSecs1)
FS4 : values ParamSecs PSecs1
FS5 : allPublic PSecs1
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
GFS : paramSecs Params ParamSecs1
GFS1 : values ParamSecs1 PSecs
============================
 allPublic PSecs
 < apply paramSecs_unique to _ GFS FS1.

Subgoal 1:

Variables: SF Name PSecs ParamSecs SG PSecs1 Body Params RVVal RetVar RetTy
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
FS : funSecure SF (fun Name RetTy RetVar RVVal Params Body) @
FS1 : paramSecs Params ParamSecs
FS2 : secure SF [(RetVar, public)::ParamSecs] public Body SG
FS3 : lookup SF Name (public, PSecs1)
FS4 : values ParamSecs PSecs1
FS5 : allPublic PSecs1
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
GFS : paramSecs Params ParamSecs
GFS1 : values ParamSecs PSecs
============================
 allPublic PSecs
 < apply values_unique to FS4 GFS1.

Subgoal 1:

Variables: SF Name PSecs ParamSecs SG Body Params RVVal RetVar RetTy
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
FS : funSecure SF (fun Name RetTy RetVar RVVal Params Body) @
FS1 : paramSecs Params ParamSecs
FS2 : secure SF [(RetVar, public)::ParamSecs] public Body SG
FS3 : lookup SF Name (public, PSecs)
FS4 : values ParamSecs PSecs
FS5 : allPublic 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
GFS : paramSecs Params ParamSecs
GFS1 : values ParamSecs PSecs
============================
 allPublic PSecs
 < search.

Subgoal 2:

Variables: SF Name PSecs ParamSecs SG PSecs1 Body Params RVVal RetVar RetTy FunName
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
IsF : is_fun (secfun FunName RetTy public RetVar RVVal Params Body)
FS : funSecure SF (secfun FunName RetTy public RetVar RVVal Params Body) @
GFS : getFunSec (secfun FunName RetTy public RetVar RVVal Params Body) Name public PSecs
FS1 : paramSecs Params ParamSecs
FS2 : secure SF [(RetVar, public)::ParamSecs] public Body SG
FS3 : lookup SF FunName (public, PSecs1)
FS4 : values ParamSecs PSecs1
FS5 : allPublic PSecs1
============================
 allPublic PSecs
 < case IsF.

Subgoal 2:

Variables: SF Name PSecs ParamSecs SG PSecs1 Body Params RVVal RetVar RetTy FunName
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
FS : funSecure SF (secfun FunName RetTy public RetVar RVVal Params Body) @
GFS : getFunSec (secfun FunName RetTy public RetVar RVVal Params Body) Name public PSecs
FS1 : paramSecs Params ParamSecs
FS2 : secure SF [(RetVar, public)::ParamSecs] public Body SG
FS3 : lookup SF FunName (public, PSecs1)
FS4 : values ParamSecs PSecs1
FS5 : allPublic PSecs1
H1 : is_string FunName
H2 : is_typ RetTy
H3 : is_slev public
H4 : is_string RetVar
H5 : is_value RVVal
H6 : is_list is_param Params
H7 : is_stmt Body
============================
 allPublic PSecs
 < GFS: case GFS.

Subgoal 2:

Variables: SF Name PSecs ParamSecs SG PSecs1 Body Params RVVal RetVar RetTy ParamSecs1
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
FS : funSecure SF (secfun Name RetTy public RetVar RVVal Params Body) @
FS1 : paramSecs Params ParamSecs
FS2 : secure SF [(RetVar, public)::ParamSecs] public Body SG
FS3 : lookup SF Name (public, PSecs1)
FS4 : values ParamSecs PSecs1
FS5 : allPublic PSecs1
H1 : is_string Name
H2 : is_typ RetTy
H3 : is_slev public
H4 : is_string RetVar
H5 : is_value RVVal
H6 : is_list is_param Params
H7 : is_stmt Body
GFS : paramSecs Params ParamSecs1
GFS1 : values ParamSecs1 PSecs
============================
 allPublic PSecs
 < apply paramSecs_unique to _ GFS FS1.

Subgoal 2:

Variables: SF Name PSecs ParamSecs SG PSecs1 Body Params RVVal RetVar RetTy
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
FS : funSecure SF (secfun Name RetTy public RetVar RVVal Params Body) @
FS1 : paramSecs Params ParamSecs
FS2 : secure SF [(RetVar, public)::ParamSecs] public Body SG
FS3 : lookup SF Name (public, PSecs1)
FS4 : values ParamSecs PSecs1
FS5 : allPublic PSecs1
H1 : is_string Name
H2 : is_typ RetTy
H3 : is_slev public
H4 : is_string RetVar
H5 : is_value RVVal
H6 : is_list is_param Params
H7 : is_stmt Body
GFS : paramSecs Params ParamSecs
GFS1 : values ParamSecs PSecs
============================
 allPublic PSecs
 < apply values_unique to FS4 GFS1.

Subgoal 2:

Variables: SF Name PSecs ParamSecs SG Body Params RVVal RetVar RetTy
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
FS : funSecure SF (secfun Name RetTy public RetVar RVVal Params Body) @
FS1 : paramSecs Params ParamSecs
FS2 : secure SF [(RetVar, public)::ParamSecs] public Body SG
FS3 : lookup SF Name (public, PSecs)
FS4 : values ParamSecs PSecs
FS5 : allPublic PSecs
H1 : is_string Name
H2 : is_typ RetTy
H3 : is_slev public
H4 : is_string RetVar
H5 : is_value RVVal
H6 : is_list is_param Params
H7 : is_stmt Body
GFS : paramSecs Params ParamSecs
GFS1 : values ParamSecs PSecs
============================
 allPublic PSecs
 < search.

Subgoal 3:

Variables: SF Name PSecs ParamSecs SG PSecs1 Body Params RVVal RetVar RetTy FunName
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
IsF : is_fun (secfun FunName RetTy private RetVar RVVal Params Body)
FS : funSecure SF (secfun FunName RetTy private RetVar RVVal Params Body) @
GFS : getFunSec (secfun FunName RetTy private RetVar RVVal Params Body) Name public PSecs
FS1 : paramSecs Params ParamSecs
FS2 : secure SF [(RetVar, private)::ParamSecs] private Body SG
FS3 : lookup SF FunName (private, PSecs1)
FS4 : values ParamSecs PSecs1
============================
 allPublic PSecs
 < case GFS.

Subgoal 4:

Variables: SF Name PSecs F_P
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
IsF : is_fun <unknown I fun>
FS : funSecure SF <unknown I fun> @
GFS : getFunSec <unknown I fun> Name public PSecs
FS1 : |{fun}- <unknown I fun> ~~> F_P
FS2 : funSecure SF F_P *
============================
 allPublic PSecs
 < apply proj_fun_is to FS1 _.

Subgoal 4:

Variables: SF Name PSecs F_P
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
IsF : is_fun <unknown I fun>
FS : funSecure SF <unknown I fun> @
GFS : getFunSec <unknown I fun> Name public PSecs
FS1 : |{fun}- <unknown I fun> ~~> F_P
FS2 : funSecure SF F_P *
H1 : is_fun F_P
============================
 allPublic PSecs
 < GFS: case GFS.

Subgoal 4:

Variables: SF Name PSecs F_P F_P1
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
IsF : is_fun <unknown I fun>
FS : funSecure SF <unknown I fun> @
FS1 : |{fun}- <unknown I fun> ~~> F_P
FS2 : funSecure SF F_P *
H1 : is_fun F_P
GFS : |{fun}- <unknown I fun> ~~> F_P1
GFS1 : getFunSec F_P1 Name public PSecs
============================
 allPublic PSecs
 < apply proj_fun_unique to GFS FS1 _.

Subgoal 4:

Variables: SF Name PSecs F_P
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
IsF : is_fun <unknown I fun>
FS : funSecure SF <unknown I fun> @
FS1 : |{fun}- <unknown I fun> ~~> F_P
FS2 : funSecure SF F_P *
H1 : is_fun F_P
GFS : |{fun}- <unknown I fun> ~~> F_P
GFS1 : getFunSec F_P Name public PSecs
============================
 allPublic PSecs
 < apply IH to _ FS2 GFS1.

Subgoal 4:

Variables: SF Name PSecs F_P
IH : forall F SF Name PSecs,
       is_fun F -> funSecure SF F * -> getFunSec F Name public PSecs -> allPublic PSecs
IsF : is_fun <unknown I fun>
FS : funSecure SF <unknown I fun> @
FS1 : |{fun}- <unknown I fun> ~~> F_P
FS2 : funSecure SF F_P *
H1 : is_fun F_P
GFS : |{fun}- <unknown I fun> ~~> F_P
GFS1 : getFunSec F_P Name public PSecs
H2 : allPublic PSecs
============================
 allPublic PSecs
 < search.

Proof completed.
 < Theorem gatherFunSecCtx_secFuns :
     forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs -> gatherFunSecCtx Fs L -> secFuns L.

============================
 forall Fs SF L,
   is_list is_fun Fs -> funsSecure SF Fs -> gatherFunSecCtx Fs L -> secFuns L
 < induction on 2.

IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
============================
 forall Fs SF L,
   is_list is_fun Fs -> funsSecure SF Fs @ -> gatherFunSecCtx Fs L -> secFuns L
 < intros IsFs FSs GFSC.

Variables: Fs SF L
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
IsFs : is_list is_fun Fs
FSs : funsSecure SF Fs @
GFSC : gatherFunSecCtx Fs L
============================
 secFuns L
 < FSs: case FSs.

Subgoal 1:

Variables: SF L
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
IsFs : is_list is_fun []
GFSC : gatherFunSecCtx [] L
============================
 secFuns L
 < case GFSC.

Subgoal 1:

Variables: SF
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
IsFs : is_list is_fun []
============================
 secFuns []
 < unfold .

Subgoal 1:

Variables: SF
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
IsFs : is_list is_fun []
============================
 forall F ArgLevs, lookup [] F (public, ArgLevs) -> allPublic ArgLevs
 < intros L.

Subgoal 1:

Variables: SF F ArgLevs
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
IsFs : is_list is_fun []
L : lookup [] F (public, ArgLevs)
============================
 allPublic ArgLevs
 < case L.

Subgoal 2:

Variables: SF L Rest F
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
IsFs : is_list is_fun (F::Rest)
GFSC : gatherFunSecCtx (F::Rest) L
FSs : funSecure SF F
FSs1 : funsSecure SF Rest *
============================
 secFuns L
 < case IsFs.

Subgoal 2:

Variables: SF L Rest F
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
GFSC : gatherFunSecCtx (F::Rest) L
FSs : funSecure SF F
FSs1 : funsSecure SF Rest *
H1 : is_fun F
H2 : is_list is_fun Rest
============================
 secFuns L
 < G: case GFSC.

Subgoal 2:

Variables: SF Rest F SRest PSecs Lev Name
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
FSs : funSecure SF F
FSs1 : funsSecure SF Rest *
H1 : is_fun F
H2 : is_list is_fun Rest
G : getFunSec F Name Lev PSecs
G1 : gatherFunSecCtx Rest SRest
============================
 secFuns ((Name, (Lev, PSecs))::SRest)
 < SF: apply IH to _ FSs1 G1.

Subgoal 2:

Variables: SF Rest F SRest PSecs Lev Name
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
FSs : funSecure SF F
FSs1 : funsSecure SF Rest *
H1 : is_fun F
H2 : is_list is_fun Rest
G : getFunSec F Name Lev PSecs
G1 : gatherFunSecCtx Rest SRest
SF : secFuns SRest
============================
 secFuns ((Name, (Lev, PSecs))::SRest)
 < R: case SF.

Subgoal 2:

Variables: SF Rest F SRest PSecs Lev Name
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
FSs : funSecure SF F
FSs1 : funsSecure SF Rest *
H1 : is_fun F
H2 : is_list is_fun Rest
G : getFunSec F Name Lev PSecs
G1 : gatherFunSecCtx Rest SRest
R : forall F ArgLevs, lookup SRest F (public, ArgLevs) -> allPublic ArgLevs
============================
 secFuns ((Name, (Lev, PSecs))::SRest)
 < unfold .

Subgoal 2:

Variables: SF Rest F SRest PSecs Lev Name
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
FSs : funSecure SF F
FSs1 : funsSecure SF Rest *
H1 : is_fun F
H2 : is_list is_fun Rest
G : getFunSec F Name Lev PSecs
G1 : gatherFunSecCtx Rest SRest
R : forall F ArgLevs, lookup SRest F (public, ArgLevs) -> allPublic ArgLevs
============================
 forall F ArgLevs,
   lookup ((Name, (Lev, PSecs))::SRest) F (public, ArgLevs) -> allPublic ArgLevs
 < intros L.

Subgoal 2:

Variables: SF Rest F SRest PSecs Lev Name F1 ArgLevs
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
FSs : funSecure SF F
FSs1 : funsSecure SF Rest *
H1 : is_fun F
H2 : is_list is_fun Rest
G : getFunSec F Name Lev PSecs
G1 : gatherFunSecCtx Rest SRest
R : forall F ArgLevs, lookup SRest F (public, ArgLevs) -> allPublic ArgLevs
L : lookup ((Name, (Lev, PSecs))::SRest) F1 (public, ArgLevs)
============================
 allPublic ArgLevs
 < L: case L.

Subgoal 2.1:

Variables: SF Rest F SRest F1 ArgLevs
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
FSs : funSecure SF F
FSs1 : funsSecure SF Rest *
H1 : is_fun F
H2 : is_list is_fun Rest
G : getFunSec F F1 public ArgLevs
G1 : gatherFunSecCtx Rest SRest
R : forall F ArgLevs, lookup SRest F (public, ArgLevs) -> allPublic ArgLevs
============================
 allPublic ArgLevs
 < apply getFunSec_allPublic to _ FSs G.

Subgoal 2.1:

Variables: SF Rest F SRest F1 ArgLevs
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
FSs : funSecure SF F
FSs1 : funsSecure SF Rest *
H1 : is_fun F
H2 : is_list is_fun Rest
G : getFunSec F F1 public ArgLevs
G1 : gatherFunSecCtx Rest SRest
R : forall F ArgLevs, lookup SRest F (public, ArgLevs) -> allPublic ArgLevs
H3 : allPublic ArgLevs
============================
 allPublic ArgLevs
 < search.

Subgoal 2.2:

Variables: SF Rest F SRest PSecs Lev Name F1 ArgLevs
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
FSs : funSecure SF F
FSs1 : funsSecure SF Rest *
H1 : is_fun F
H2 : is_list is_fun Rest
G : getFunSec F Name Lev PSecs
G1 : gatherFunSecCtx Rest SRest
R : forall F ArgLevs, lookup SRest F (public, ArgLevs) -> allPublic ArgLevs
L : Name = F1 -> false
L1 : lookup SRest F1 (public, ArgLevs)
============================
 allPublic ArgLevs
 < apply R to L1.

Subgoal 2.2:

Variables: SF Rest F SRest PSecs Lev Name F1 ArgLevs
IH : forall Fs SF L,
       is_list is_fun Fs -> funsSecure SF Fs * -> gatherFunSecCtx Fs L -> secFuns L
FSs : funSecure SF F
FSs1 : funsSecure SF Rest *
H1 : is_fun F
H2 : is_list is_fun Rest
G : getFunSec F Name Lev PSecs
G1 : gatherFunSecCtx Rest SRest
R : forall F ArgLevs, lookup SRest F (public, ArgLevs) -> allPublic ArgLevs
L : Name = F1 -> false
L1 : lookup SRest F1 (public, ArgLevs)
H3 : allPublic ArgLevs
============================
 allPublic ArgLevs
 < 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
 < assert secFuns ((Name, (RetLev, A_S))::SF).

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)
============================
 secFuns ((Name, (RetLev, A_S))::SF)
 < unfold .

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)
============================
 forall F ArgLevs,
   lookup ((Name, (RetLev, A_S))::SF) F (public, ArgLevs) -> allPublic ArgLevs
 < intros L.

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 F ArgLevs
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)
L : lookup ((Name, (RetLev, A_S))::SF) F (public, ArgLevs)
============================
 allPublic ArgLevs
 < L: case L.

Subgoal 1.2.1:

Variables: A_A A_B O_A O_B SF Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG F ArgLevs
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) ArgLevs @
Rel : level_arg_vals ArgLevs A_A A_B
Sec1 : gatherFunSecCtx Funs SF
Sec2 : getFunSec Main F public ArgLevs
Sec3 : funsSecure ((F, (public, ArgLevs))::SF) Funs
Sec4 : funSecure ((F, (public, ArgLevs))::SF) Main
H1 : is_list is_fun Funs
H2 : is_fun Main
EvA : getFunEvalCtx Funs FCtx
EvA1 : getFunEvalInfo Main F RetVar RetVal PNames Body
EvA2 : zip PNames A_A InitEnv
EvA3 : evalStmt ((F, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A
EvB : getFunEvalCtx Funs FCtx
EvB1 : getFunEvalInfo Main F RetVar RetVal PNames Body
EvB2 : zip PNames A_B InitEnv1
EvB3 : evalStmt ((F, (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 F
H5 : is_slev public
H6 : is_list is_slev ArgLevs
MainS : zip PNames ArgLevs ZP
MainS1 : secure ((F, (public, ArgLevs))::SF) [(RetVar, public)::ZP] public Body SG
H7 : secFunCtxs ((F, (public, ArgLevs))::SF) ((F, (RetVar, (RetVal, (PNames, Body))))::FCtx)
============================
 allPublic ArgLevs
 < apply getFunSec_allPublic to _ Sec4 Sec2.

Subgoal 1.2.1:

Variables: A_A A_B O_A O_B SF Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG F ArgLevs
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) ArgLevs @
Rel : level_arg_vals ArgLevs A_A A_B
Sec1 : gatherFunSecCtx Funs SF
Sec2 : getFunSec Main F public ArgLevs
Sec3 : funsSecure ((F, (public, ArgLevs))::SF) Funs
Sec4 : funSecure ((F, (public, ArgLevs))::SF) Main
H1 : is_list is_fun Funs
H2 : is_fun Main
EvA : getFunEvalCtx Funs FCtx
EvA1 : getFunEvalInfo Main F RetVar RetVal PNames Body
EvA2 : zip PNames A_A InitEnv
EvA3 : evalStmt ((F, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A
EvB : getFunEvalCtx Funs FCtx
EvB1 : getFunEvalInfo Main F RetVar RetVal PNames Body
EvB2 : zip PNames A_B InitEnv1
EvB3 : evalStmt ((F, (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 F
H5 : is_slev public
H6 : is_list is_slev ArgLevs
MainS : zip PNames ArgLevs ZP
MainS1 : secure ((F, (public, ArgLevs))::SF) [(RetVar, public)::ZP] public Body SG
H7 : secFunCtxs ((F, (public, ArgLevs))::SF) ((F, (RetVar, (RetVal, (PNames, Body))))::FCtx)
H8 : allPublic ArgLevs
============================
 allPublic ArgLevs
 < 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 F ArgLevs
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)
L : Name = F -> false
L1 : lookup SF F (public, ArgLevs)
============================
 allPublic ArgLevs
 < SF: apply gatherFunSecCtx_secFuns to _ Sec3 Sec1.

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 F ArgLevs
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)
L : Name = F -> false
L1 : lookup SF F (public, ArgLevs)
SF : secFuns SF
============================
 allPublic ArgLevs
 < R: case SF.

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 F ArgLevs
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)
L : Name = F -> false
L1 : lookup SF F (public, ArgLevs)
R : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
============================
 allPublic ArgLevs
 < apply R to L1.

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 F ArgLevs
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)
L : Name = F -> false
L1 : lookup SF F (public, ArgLevs)
R : forall F ArgLevs, lookup SF F (public, ArgLevs) -> allPublic ArgLevs
H8 : allPublic ArgLevs
============================
 allPublic ArgLevs
 < 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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
============================
 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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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.3:

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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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.3:

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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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.3.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)
H8 : secFuns ((Name, (public, A_S))::SF)
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.3.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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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)
H9 : 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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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)
H9 : 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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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)
H9 : 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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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)
H9 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B)
PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1]
H10 : 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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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)
H9 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B)
PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1]
H10 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP]
H11 : 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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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)
H9 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B)
PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1]
H10 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP]
H11 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP]
H12 : is_string Name
H13 : is_string RetVar
H14 : is_value RetVal
H15 : is_list is_string PNames
H16 : 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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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)
H9 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B)
PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1]
H10 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP]
H11 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP]
H12 : is_string Name
H13 : is_string RetVar
H14 : is_value RetVal
H15 : is_list is_string PNames
H16 : is_stmt Body
H17 : is_string Name
H18 : is_slev RetLev
H19 : 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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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)
H9 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B)
PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1]
H10 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP]
H11 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP]
H12 : is_string Name
H13 : is_string RetVar
H14 : is_value RetVal
H15 : is_list is_string PNames
H16 : is_stmt Body
H17 : is_string Name
H18 : is_slev RetLev
H19 : is_list is_slev A_S
H20 : 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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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)
H9 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B)
PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1]
H10 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP]
H11 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP]
H12 : is_string Name
H13 : is_string RetVar
H14 : is_value RetVal
H15 : is_list is_string PNames
H16 : is_stmt Body
H17 : is_string Name
H18 : is_slev RetLev
H19 : is_list is_slev A_S
H20 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv)
H21 : 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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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)
H9 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B)
PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1]
H10 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP]
H11 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP]
H12 : is_string Name
H13 : is_string RetVar
H14 : is_value RetVal
H15 : is_list is_string PNames
H16 : is_stmt Body
H17 : is_string Name
H18 : is_slev RetLev
H19 : is_list is_slev A_S
H20 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv)
H21 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv1)
H22 : 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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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)
H9 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B)
PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1]
H10 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP]
H11 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP]
H12 : is_string Name
H13 : is_string RetVar
H14 : is_value RetVal
H15 : is_list is_string PNames
H16 : is_stmt Body
H17 : is_string Name
H18 : is_slev RetLev
H19 : is_list is_slev A_S
H20 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv)
H21 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv1)
H22 : is_list (is_pair is_string is_slev) ((RetVar, RetLev)::ZP)
H23 : 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)
H8 : secFuns ((Name, (RetLev, A_S))::SF)
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)
H9 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B)
PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1]
H10 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP]
H11 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP]
H12 : is_string Name
H13 : is_string RetVar
H14 : is_value RetVal
H15 : is_list is_string PNames
H16 : is_stmt Body
H17 : is_string Name
H18 : is_slev RetLev
H19 : is_list is_slev A_S
H20 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv)
H21 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv1)
H22 : is_list (is_pair is_string is_slev) ((RetVar, RetLev)::ZP)
H23 : 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 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 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.
Back to example home