Reasoning Details

 < Module library:security.
 < Prove_Constraint library:host:proj_e_unique.

Proof completed.
 < Prove_Constraint library:host:proj_e_is.

Proof completed.
 < Prove_Constraint library:host:proj_s_unique.

Variables: S2 E Ty N Sl
Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E
Hyp1 : |{s}- secdecl N Ty Sl E ~~> S2
============================
 decl N Ty E = S2
 < case Hyp1.

Variables: E Ty N Sl
Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E
============================
 decl N Ty E = decl N Ty E
 < search.

Proof completed.
 < Prove_Constraint library:host:proj_s_is.

Variables: E Ty N Sl
Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E
Hyp1 : is_s (secdecl N Ty Sl E)
============================
 is_s (decl N Ty E)
 < case Hyp1.

Variables: E Ty N Sl
Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E
H1 : is_string N
H2 : is_ty Ty
H3 : is_sl Sl
H4 : is_e E
============================
 is_s (decl N Ty E)
 < search.

Proof completed.
 < Prove_Constraint library:host:proj_ty_unique.

Proof completed.
 < Prove_Constraint library:host:proj_ty_is.

Proof completed.
 < Add_Proj_Rel library:host:is_e.

Proof completed.
 < Prove_Ext_Ind library:host:is_e.

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

Proof completed.
 < Prove library:host:is_e_intlit_or_not.

Proof completed.
 < Prove library:host:is_e_trueE_or_not.

Proof completed.
 < Prove library:host:is_e_falseE_or_not.

Proof completed.
 < Prove library:host:is_e_add_or_not.

Proof completed.
 < Prove library:host:is_e_eqC_or_not.

Proof completed.
 < Prove library:host:is_e_gt_or_not.

Proof completed.
 < Prove library:host:is_e_not_or_not.

Proof completed.
 < Prove library:host:is_e_eq_or_not.

Proof completed.
 < Prove library:host:vars_unique.

Proof completed.
 < Prove_Constraint library:host:proj_e_vars_exist.

Proof completed.
 < Prove_Constraint library:host:proj_e_vars.

Proof completed.
 < Prove library:host:vars_is.

Proof completed.
 < Prove library:host:vars_exist.

Proof completed.
 < Prove library:host:value_empty_typable.

Proof completed.
 < Prove library:host:eval_e_is.

Proof completed.
 < Prove library:host:type_preservation_e.

Proof completed.
 < Prove library:host:var_types_maintained.

Subgoal 7:

Variables: G X Ty Ty1 N E Sl
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G (secdecl N Ty1 Sl E) ((N, Ty1)::G) @
Lkp : lookup G X Ty
Ty1 : ty_e G E Ty1
Ty2 : no_lookup G N
============================
 lookup ((N, Ty1)::G) X Ty
 < assert N = X -> false.

Subgoal 7.1:

Variables: G X Ty Ty1 N E Sl
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G (secdecl N Ty1 Sl E) ((N, Ty1)::G) @
Lkp : lookup G X Ty
Ty1 : ty_e G E Ty1
Ty2 : no_lookup G N
============================
 N = X -> false
 < intros E.

Subgoal 7.1:

Variables: G X Ty Ty1 N E Sl
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G (secdecl N Ty1 Sl E) ((N, Ty1)::G) @
Lkp : lookup G X Ty
Ty1 : ty_e G E Ty1
Ty2 : no_lookup G N
E : N = X
============================
 false
 < case E.

Subgoal 7.1:

Variables: G X Ty Ty1 E Sl
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G (secdecl X Ty1 Sl E) ((X, Ty1)::G) @
Lkp : lookup G X Ty
Ty1 : ty_e G E Ty1
Ty2 : no_lookup G X
============================
 false
 < apply no_lookup to Ty2 Lkp.

Subgoal 7:

Variables: G X Ty Ty1 N E Sl
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G (secdecl N Ty1 Sl E) ((N, Ty1)::G) @
Lkp : lookup G X Ty
Ty1 : ty_e G E Ty1
Ty2 : no_lookup G N
H1 : N = X -> false
============================
 lookup ((N, Ty1)::G) X Ty
 < search.

Proof completed.
 < Prove library:host:type_preservation_s.

Subgoal 9:

Variables: TG EG TG' X Ty V V1 N E Sl Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ty : ty_s TG (secdecl N Ty1 Sl E) TG'
Ev : eval_s EG (secdecl N Ty1 Sl E) ((N, V1)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup ((N, V1)::EG) X V
Ev1 : eval_e EG E V1
============================
 ty_e [] V Ty
 < Ty: case Ty.

Subgoal 9:

Variables: TG EG X Ty V V1 N E Sl Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (secdecl N Ty1 Sl E) ((N, V1)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup ((N, Ty1)::TG) X Ty
LkpV : lookup ((N, V1)::EG) X V
Ev1 : eval_e EG E V1
Ty : ty_e TG E Ty1
Ty1 : no_lookup TG N
============================
 ty_e [] V Ty
 < apply type_preservation_e to Ty Ev1 Rel.

Subgoal 9:

Variables: TG EG X Ty V V1 N E Sl Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (secdecl N Ty1 Sl E) ((N, V1)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup ((N, Ty1)::TG) X Ty
LkpV : lookup ((N, V1)::EG) X V
Ev1 : eval_e EG E V1
Ty : ty_e TG E Ty1
Ty1 : no_lookup TG N
H1 : ty_e [] V1 Ty1
============================
 ty_e [] V Ty
 < LT: case LkpTy.

Subgoal 9.1:

Variables: TG EG X Ty V V1 E Sl
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (secdecl X Ty Sl E) ((X, V1)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpV : lookup ((X, V1)::EG) X V
Ev1 : eval_e EG E V1
Ty : ty_e TG E Ty
Ty1 : no_lookup TG X
H1 : ty_e [] V1 Ty
============================
 ty_e [] V Ty
 < LV: case LkpV.

Subgoal 9.1.1:

Variables: TG EG X Ty V E Sl
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (secdecl X Ty Sl E) ((X, V)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E V
Ty : ty_e TG E Ty
Ty1 : no_lookup TG X
H1 : ty_e [] V Ty
============================
 ty_e [] V Ty
 < search.

Subgoal 9.1.2:

Variables: TG EG X Ty V V1 E Sl
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (secdecl X Ty Sl E) ((X, V1)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E V1
Ty : ty_e TG E Ty
Ty1 : no_lookup TG X
H1 : ty_e [] V1 Ty
LV : X = X -> false
LV1 : lookup EG X V
============================
 ty_e [] V Ty
 < apply LV to _.

Subgoal 9.2:

Variables: TG EG X Ty V V1 N E Sl Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (secdecl N Ty1 Sl E) ((N, V1)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpV : lookup ((N, V1)::EG) X V
Ev1 : eval_e EG E V1
Ty : ty_e TG E Ty1
Ty1 : no_lookup TG N
H1 : ty_e [] V1 Ty1
LT : N = X -> false
LT1 : lookup TG X Ty
============================
 ty_e [] V Ty
 < LV: case LkpV.

Subgoal 9.2.1:

Variables: TG EG X Ty V E Sl Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (secdecl X Ty1 Sl E) ((X, V)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E V
Ty : ty_e TG E Ty1
Ty1 : no_lookup TG X
H1 : ty_e [] V Ty1
LT : X = X -> false
LT1 : lookup TG X Ty
============================
 ty_e [] V Ty
 < apply LT to _.

Subgoal 9.2.2:

Variables: TG EG X Ty V V1 N E Sl Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (secdecl N Ty1 Sl E) ((N, V1)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E V1
Ty : ty_e TG E Ty1
Ty1 : no_lookup TG N
H1 : ty_e [] V1 Ty1
LT : N = X -> false
LT1 : lookup TG X Ty
LV : N = X -> false
LV1 : lookup EG X V
============================
 ty_e [] V Ty
 < backchain Rel.

Proof completed.
 < Prove_Constraint library:host:proj_eval_e.

Proof completed.
 < Prove library:host:eval_e_unique.

Proof completed.
 < Prove_Constraint library:host:proj_s_eval.

Variables: G G2 E Ty N Sl
Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E
Hyp1 : eval_s G (secdecl N Ty Sl E) G2
============================
 exists G', eval_s G (decl N Ty E) G'
 < case Hyp1.

Variables: G E Ty N Sl V
Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E
H1 : eval_e G E V
============================
 exists G', eval_s G (decl N Ty E) G'
 < search.

Proof completed.
 < Add_Ext_Size library:host:eval_s.

Proof completed.
 < Add_Proj_Rel library:host:eval_s.

Proof completed.
 < Prove_Ext_Ind library:host:eval_s.

Subgoal 9:

Variables: G V N1 E Sl Ty
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (secdecl N1 Ty Sl E) ((N1, V)::G) 1 @@
Acc : acc 1 @
R1 : eval_e G E V
============================
 <eval_s {P}> G (secdecl N1 Ty Sl E) ((N1, V)::G)
 < search.

Proof completed.
 < Prove_Constraint library:host:proj_s_eval_results.

Variables: G G1 G2 X V E Ty N Sl
Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E
Hyp1 : eval_s G (secdecl N Ty Sl E) G1
Hyp2 : eval_s G (decl N Ty E) G2
Hyp3 : lookup G1 X V
============================
 lookup G2 X V
 < VS: case Hyp1.

Variables: G G2 X V E Ty N Sl V1
Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E
Hyp2 : eval_s G (decl N Ty E) G2
Hyp3 : lookup ((N, V1)::G) X V
VS : eval_e G E V1
============================
 lookup G2 X V
 < VD: case Hyp2.

Variables: G X V E Ty N Sl V1 V2
Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E
Hyp3 : lookup ((N, V1)::G) X V
VS : eval_e G E V1
VD : eval_e G E V2
============================
 lookup ((N, V2)::G) X V
 < apply eval_e_unique to VS VD.

Variables: G X V E Ty N Sl V2
Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E
Hyp3 : lookup ((N, V2)::G) X V
VS : eval_e G E V2
VD : eval_e G E V2
============================
 lookup ((N, V2)::G) X V
 < search.

Proof completed.
 < Prove_Constraint library:host:proj_s_eval_results_back.

Variables: G G1 G2 X V E Ty N Sl
Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E
Hyp1 : eval_s G (secdecl N Ty Sl E) G1
Hyp2 : eval_s G (decl N Ty E) G2
Hyp3 : lookup G2 X V
============================
 lookup G1 X V
 < VS: case Hyp1.

Variables: G G2 X V E Ty N Sl V1
Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E
Hyp2 : eval_s G (decl N Ty E) G2
Hyp3 : lookup G2 X V
VS : eval_e G E V1
============================
 lookup ((N, V1)::G) X V
 < VD: case Hyp2.

Variables: G X V E Ty N Sl V1 V2
Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E
Hyp3 : lookup ((N, V2)::G) X V
VS : eval_e G E V1
VD : eval_e G E V2
============================
 lookup ((N, V1)::G) X V
 < apply eval_e_unique to VS VD.

Variables: G X V E Ty N Sl V2
Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E
Hyp3 : lookup ((N, V2)::G) X V
VS : eval_e G E V2
VD : eval_e G E V2
============================
 lookup ((N, V2)::G) X V
 < search.

Proof completed.
 < Prove library:host:eval_e_value.

Proof completed.
 < Prove library:host:eval_s_value.

Subgoal 9:

Variables: G Y YV V N E Sl Ty
IH : forall G S G' Y YV,
       eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' ->
       value YV
Ev : eval_s G (secdecl N Ty Sl E) ((N, V)::G) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) ((N, V)::G)
Ev1 : eval_e G E V
============================
 value YV
 < apply eval_e_value to Ev1 _.

Subgoal 9:

Variables: G Y YV V N E Sl Ty
IH : forall G S G' Y YV,
       eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' ->
       value YV
Ev : eval_s G (secdecl N Ty Sl E) ((N, V)::G) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) ((N, V)::G)
Ev1 : eval_e G E V
H1 : value V
============================
 value YV
 < case Mem.

Subgoal 9.1:

Variables: G V N E Sl Ty
IH : forall G S G' Y YV,
       eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' ->
       value YV
Ev : eval_s G (secdecl N Ty Sl E) ((N, V)::G) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E V
H1 : value V
============================
 value V
 < search.

Subgoal 9.2:

Variables: G Y YV V N E Sl Ty
IH : forall G S G' Y YV,
       eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' ->
       value YV
Ev : eval_s G (secdecl N Ty Sl E) ((N, V)::G) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E V
H1 : value V
H2 : mem (Y, YV) G
============================
 value YV
 < backchain AllVal.

Proof completed.
 < Prove library:host:vars_eval_same_result.

Proof completed.
 < Extensible_Theorem
      sl_form : forall SL,
         Is : is_sl SL ->
         SL = public \/
         SL = private
      on Is.

Subgoal 1:

IH : forall SL, is_sl SL * -> SL = public \/ SL = private
Is : is_sl public @
============================
 public = public \/ public = private
 < search.

Subgoal 2:

IH : forall SL, is_sl SL * -> SL = public \/ SL = private
Is : is_sl private @
============================
 private = public \/ private = private
 < search.

Proof completed.
 < Theorem join_unique :
     forall A B S1 S2, join A B S1 -> join A B S2 -> S1 = S2.

============================
 forall A B S1 S2, join A B S1 -> join A B S2 -> S1 = S2
 < intros J1 J2.

Variables: A B S1 S2
J1 : join A B S1
J2 : join A B S2
============================
 S1 = S2
 < case J1.

Subgoal 1:

Variables: S2
J2 : join public public S2
============================
 public = S2
 < case J2.

Subgoal 1:

============================
 public = public
 < search.

Subgoal 2:

Variables: B S2
J2 : join private B S2
============================
 private = S2
 < case J2.

Subgoal 2.1:

Variables: B
============================
 private = private
 < search.

Subgoal 2.2:

============================
 private = private
 < search.

Subgoal 3:

Variables: A S2
J2 : join A private S2
============================
 private = S2
 < case J2.

Subgoal 3.1:

============================
 private = private
 < search.

Subgoal 3.2:

Variables: A
============================
 private = private
 < search.

Proof completed.
 < Theorem join_public :
     forall A B, join A B public -> A = public /\ B = public.

============================
 forall A B, join A B public -> A = public /\ B = public
 < intros J.

Variables: A B
J : join A B public
============================
 A = public /\ B = public
 < case J.

============================
 public = public /\ public = public
 < search.

Proof completed.
 < Extensible_Theorem
      level_public_vars : forall SG E V X,
         Lev : level SG E public ->
         Vars : vars E V ->
         Mem : mem X V ->
         lookup SG X public
      on Lev.

Subgoal 1:

Variables: SG V X I
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (intlit I) public @
Vars : vars (intlit I) V
Mem : mem X V
============================
 lookup SG X public
 < case Vars.

Subgoal 1:

Variables: SG X I
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (intlit I) public @
Mem : mem X []
============================
 lookup SG X public
 < case Mem.

Subgoal 2:

Variables: SG V X
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG trueE public @
Vars : vars trueE V
Mem : mem X V
============================
 lookup SG X public
 < case Vars.

Subgoal 2:

Variables: SG X
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG trueE public @
Mem : mem X []
============================
 lookup SG X public
 < case Mem.

Subgoal 3:

Variables: SG V X
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG falseE public @
Vars : vars falseE V
Mem : mem X V
============================
 lookup SG X public
 < case Vars.

Subgoal 3:

Variables: SG X
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG falseE public @
Mem : mem X []
============================
 lookup SG X public
 < case Mem.

Subgoal 4:

Variables: SG V X N
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (var N) public @
Vars : vars (var N) V
Mem : mem X V
Lev1 : lookup SG N public
============================
 lookup SG X public
 < case Vars.

Subgoal 4:

Variables: SG X N
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (var N) public @
Mem : mem X [N]
Lev1 : lookup SG N public
============================
 lookup SG X public
 < M: case Mem.

Subgoal 4.1:

Variables: SG N
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (var N) public @
Lev1 : lookup SG N public
============================
 lookup SG N public
 < search.

Subgoal 4.2:

Variables: SG X N
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (var N) public @
Lev1 : lookup SG N public
M : mem X []
============================
 lookup SG X public
 < case M.

Subgoal 5:

Variables: SG V X L1 L2 E2 E1
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (add E1 E2) public @
Vars : vars (add E1 E2) V
Mem : mem X V
Lev1 : level SG E1 L1 *
Lev2 : level SG E2 L2 *
Lev3 : join L1 L2 public
============================
 lookup SG X public
 < V: case Vars.

Subgoal 5:

Variables: SG V X L1 L2 E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (add E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 L1 *
Lev2 : level SG E2 L2 *
Lev3 : join L1 L2 public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
============================
 lookup SG X public
 < apply join_public to Lev3.

Subgoal 5:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (add E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
============================
 lookup SG X public
 < Or: apply mem_append to Mem V2.

Subgoal 5:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (add E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
Or : mem X Vr1 \/ mem X Vr2
============================
 lookup SG X public
 < M: case Or.

Subgoal 5.1:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (add E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
M : mem X Vr1
============================
 lookup SG X public
 < apply IH to Lev1 V M.

Subgoal 5.1:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (add E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
M : mem X Vr1
H1 : lookup SG X public
============================
 lookup SG X public
 < search.

Subgoal 5.2:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (add E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
M : mem X Vr2
============================
 lookup SG X public
 < apply IH to Lev2 V1 M.

Subgoal 5.2:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (add E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
M : mem X Vr2
H1 : lookup SG X public
============================
 lookup SG X public
 < search.

Subgoal 6:

Variables: SG V X L1 L2 E2 E1
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (eq E1 E2) public @
Vars : vars (eq E1 E2) V
Mem : mem X V
Lev1 : level SG E1 L1 *
Lev2 : level SG E2 L2 *
Lev3 : join L1 L2 public
============================
 lookup SG X public
 < V: case Vars.

Subgoal 6:

Variables: SG V X L1 L2 E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (eq E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 L1 *
Lev2 : level SG E2 L2 *
Lev3 : join L1 L2 public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
============================
 lookup SG X public
 < apply join_public to Lev3.

Subgoal 6:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (eq E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
============================
 lookup SG X public
 < Or: apply mem_append to Mem V2.

Subgoal 6:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (eq E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
Or : mem X Vr1 \/ mem X Vr2
============================
 lookup SG X public
 < M: case Or.

Subgoal 6.1:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (eq E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
M : mem X Vr1
============================
 lookup SG X public
 < apply IH to Lev1 V M.

Subgoal 6.1:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (eq E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
M : mem X Vr1
H1 : lookup SG X public
============================
 lookup SG X public
 < search.

Subgoal 6.2:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (eq E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
M : mem X Vr2
============================
 lookup SG X public
 < apply IH to Lev2 V1 M.

Subgoal 6.2:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (eq E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
M : mem X Vr2
H1 : lookup SG X public
============================
 lookup SG X public
 < search.

Subgoal 7:

Variables: SG V X L1 L2 E2 E1
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (gt E1 E2) public @
Vars : vars (gt E1 E2) V
Mem : mem X V
Lev1 : level SG E1 L1 *
Lev2 : level SG E2 L2 *
Lev3 : join L1 L2 public
============================
 lookup SG X public
 < V: case Vars.

Subgoal 7:

Variables: SG V X L1 L2 E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (gt E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 L1 *
Lev2 : level SG E2 L2 *
Lev3 : join L1 L2 public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
============================
 lookup SG X public
 < apply join_public to Lev3.

Subgoal 7:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (gt E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
============================
 lookup SG X public
 < Or: apply mem_append to Mem V2.

Subgoal 7:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (gt E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
Or : mem X Vr1 \/ mem X Vr2
============================
 lookup SG X public
 < M: case Or.

Subgoal 7.1:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (gt E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
M : mem X Vr1
============================
 lookup SG X public
 < apply IH to Lev1 V M.

Subgoal 7.1:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (gt E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
M : mem X Vr1
H1 : lookup SG X public
============================
 lookup SG X public
 < search.

Subgoal 7.2:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (gt E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
M : mem X Vr2
============================
 lookup SG X public
 < apply IH to Lev2 V1 M.

Subgoal 7.2:

Variables: SG V X E2 E1 Vr1 Vr2
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (gt E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
M : mem X Vr2
H1 : lookup SG X public
============================
 lookup SG X public
 < search.

Subgoal 8:

Variables: SG V X E1
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (not E1) public @
Vars : vars (not E1) V
Mem : mem X V
Lev1 : level SG E1 public *
============================
 lookup SG X public
 < V: case Vars.

Subgoal 8:

Variables: SG V X E1
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (not E1) public @
Mem : mem X V
Lev1 : level SG E1 public *
V : vars E1 V
============================
 lookup SG X public
 < apply IH to Lev1 V Mem.

Subgoal 8:

Variables: SG V X E1
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG (not E1) public @
Mem : mem X V
Lev1 : level SG E1 public *
V : vars E1 V
H1 : lookup SG X public
============================
 lookup SG X public
 < search.

Subgoal 9:

Variables: SG V X E1
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG <unknown I e> public @
Vars : vars <unknown I e> V
Mem : mem X V
Lev1 : |{e}- <unknown I e> ~~> E1
Lev2 : level SG E1 public *
============================
 lookup SG X public
 < V: apply proj_e_vars_exist to Lev1 Vars.

Subgoal 9:

Variables: SG V X E1 V'
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG <unknown I e> public @
Vars : vars <unknown I e> V
Mem : mem X V
Lev1 : |{e}- <unknown I e> ~~> E1
Lev2 : level SG E1 public *
V : vars E1 V'
============================
 lookup SG X public
 < M: apply proj_e_vars to Lev1 Vars V Mem.

Subgoal 9:

Variables: SG V X E1 V'
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG <unknown I e> public @
Vars : vars <unknown I e> V
Mem : mem X V
Lev1 : |{e}- <unknown I e> ~~> E1
Lev2 : level SG E1 public *
V : vars E1 V'
M : mem X V'
============================
 lookup SG X public
 < apply IH to Lev2 V M.

Subgoal 9:

Variables: SG V X E1 V'
IH : forall SG E V X,
       level SG E public * -> vars E V -> mem X V -> lookup SG X public
Lev : level SG <unknown I e> public @
Vars : vars <unknown I e> V
Mem : mem X V
Lev1 : |{e}- <unknown I e> ~~> E1
Lev2 : level SG E1 public *
V : vars E1 V'
M : mem X V'
H1 : lookup SG X public
============================
 lookup SG X public
 < search.

Proof completed.
 < Define public_equiv :
             (list (pair (string) sl)) ->
             (list (pair (string) e)) ->
             (list (pair (string) e)) ->
             prop by
   public_equiv S G1 G2 :=
     (forall X V, lookup S X public -> lookup G1 X V -> lookup G2 X V) /\
     (forall X V, lookup S X public -> lookup G2 X V -> lookup G1 X V).


 < 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
 < intros PEAB PEBC.

Variables: SG GA GB GC
PEAB : public_equiv SG GA GB
PEBC : public_equiv SG GB GC
============================
 public_equiv SG GA GC
 < PEAB: case PEAB.

Variables: SG GA GB GC
PEBC : public_equiv SG GB GC
PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
 public_equiv SG GA GC
 < PEBC: case PEBC.

Variables: SG GA GB GC
PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V
============================
 public_equiv SG GA GC
 < unfold .

Subgoal 1:

Variables: SG GA GB GC
PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V
============================
 forall X V, lookup SG X public -> lookup GA X V -> lookup GC X V
 < intros LkpSec LkpA.

Subgoal 1:

Variables: SG GA GB GC X V
PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V
LkpSec : lookup SG X public
LkpA : lookup GA X V
============================
 lookup GC X V
 < LkpB: apply PEAB to LkpSec LkpA.

Subgoal 1:

Variables: SG GA GB GC X V
PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V
LkpSec : lookup SG X public
LkpA : lookup GA X V
LkpB : lookup GB X V
============================
 lookup GC X V
 < apply PEBC to LkpSec LkpB.

Subgoal 1:

Variables: SG GA GB GC X V
PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V
LkpSec : lookup SG X public
LkpA : lookup GA X V
LkpB : lookup GB X V
H1 : lookup GC X V
============================
 lookup GC X V
 < search.

Subgoal 2:

Variables: SG GA GB GC
PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V
============================
 forall X V, lookup SG X public -> lookup GC X V -> lookup GA X V
 < intros LkpSec LkpC.

Subgoal 2:

Variables: SG GA GB GC X V
PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V
LkpSec : lookup SG X public
LkpC : lookup GC X V
============================
 lookup GA X V
 < LkpB: apply PEBC1 to LkpSec LkpC.

Subgoal 2:

Variables: SG GA GB GC X V
PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V
LkpSec : lookup SG X public
LkpC : lookup GC X V
LkpB : lookup GB X V
============================
 lookup GA X V
 < apply PEAB1 to LkpSec LkpB.

Subgoal 2:

Variables: SG GA GB GC X V
PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V
LkpSec : lookup SG X public
LkpC : lookup GC X V
LkpB : lookup GB X V
H1 : lookup GA X V
============================
 lookup GA X V
 < 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
 < intros Rel.

Variables: SG GA GB
Rel : public_equiv SG GA GB
============================
 public_equiv SG GB GA
 < Rel: case Rel.

Variables: SG GA GB
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
 public_equiv SG GB GA
 < unfold .

Subgoal 1:

Variables: SG GA GB
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
 forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
 < intros LkpSec LkpB.

Subgoal 1:

Variables: SG GA GB X V
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpB : lookup GB X V
============================
 lookup GA X V
 < apply Rel1 to LkpSec LkpB.

Subgoal 1:

Variables: SG GA GB X V
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpB : lookup GB X V
H1 : lookup GA X V
============================
 lookup GA X V
 < search.

Subgoal 2:

Variables: SG GA GB
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
 forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
 < intros LkpSec LkpA.

Subgoal 2:

Variables: SG GA GB X V
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpA : lookup GA X V
============================
 lookup GB X V
 < apply Rel to LkpSec LkpA.

Subgoal 2:

Variables: SG GA GB X V
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpA : lookup GA X V
H1 : lookup GB X V
============================
 lookup GB X V
 < search.

Proof completed.
 < Theorem public_equiv_refl :
     forall SG G, public_equiv SG G G.

============================
 forall SG G, public_equiv SG G G
 < intros.

Variables: SG G
============================
 public_equiv SG G G
 < unfold .

Subgoal 1:

Variables: SG G
============================
 forall X V, lookup SG X public -> lookup G X V -> lookup G X V
 < intros.

Subgoal 1:

Variables: SG G X V
H1 : lookup SG X public
H2 : lookup G X V
============================
 lookup G X V
 < search.

Subgoal 2:

Variables: SG G
============================
 forall X V, lookup SG X public -> lookup G X V -> lookup G X V
 < intros.

Subgoal 2:

Variables: SG G X V
H1 : lookup SG X public
H2 : lookup G X V
============================
 lookup G X V
 < search.

Proof completed.
 < Theorem level_secure :
     forall SG G1 G2 E V1 V2,
       is_e E -> level SG E public -> public_equiv SG G1 G2 -> eval_e G1 E V1 ->
       eval_e G2 E V2 -> V1 = V2.

============================
 forall SG G1 G2 E V1 V2,
   is_e E -> level SG E public -> public_equiv SG G1 G2 -> eval_e G1 E V1 -> eval_e G2 E V2 ->
   V1 = V2
 < intros IsE Lev Equiv Ev1 Ev2.

Variables: SG G1 G2 E V1 V2
IsE : is_e E
Lev : level SG E public
Equiv : public_equiv SG G1 G2
Ev1 : eval_e G1 E V1
Ev2 : eval_e G2 E V2
============================
 V1 = V2
 < Vars: apply vars_exist to IsE.

Variables: SG G1 G2 E V1 V2 V
IsE : is_e E
Lev : level SG E public
Equiv : public_equiv SG G1 G2
Ev1 : eval_e G1 E V1
Ev2 : eval_e G2 E V2
Vars : vars E V
============================
 V1 = V2
 < Equiv: case Equiv.

Variables: SG G1 G2 E V1 V2 V
IsE : is_e E
Lev : level SG E public
Ev1 : eval_e G1 E V1
Ev2 : eval_e G2 E V2
Vars : vars E V
Equiv : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V
Equiv1 : forall X V, lookup SG X public -> lookup G2 X V -> lookup G1 X V
============================
 V1 = V2
 < apply vars_eval_same_result to _ Vars Ev1 Ev2.

Subgoal 1:

Variables: SG G1 G2 E V1 V2 V
IsE : is_e E
Lev : level SG E public
Ev1 : eval_e G1 E V1
Ev2 : eval_e G2 E V2
Vars : vars E V
Equiv : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V
Equiv1 : forall X V, lookup SG X public -> lookup G2 X V -> lookup G1 X V
============================
 forall X U1 U2, mem X V -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
 < intros Mem Lkp1 Lkp2.

Subgoal 1:

Variables: SG G1 G2 E V1 V2 V X U1 U2
IsE : is_e E
Lev : level SG E public
Ev1 : eval_e G1 E V1
Ev2 : eval_e G2 E V2
Vars : vars E V
Equiv : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V
Equiv1 : forall X V, lookup SG X public -> lookup G2 X V -> lookup G1 X V
Mem : mem X V
Lkp1 : lookup G1 X U1
Lkp2 : lookup G2 X U2
============================
 U1 = U2
 < LkpS: apply level_public_vars to Lev Vars Mem.

Subgoal 1:

Variables: SG G1 G2 E V1 V2 V X U1 U2
IsE : is_e E
Lev : level SG E public
Ev1 : eval_e G1 E V1
Ev2 : eval_e G2 E V2
Vars : vars E V
Equiv : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V
Equiv1 : forall X V, lookup SG X public -> lookup G2 X V -> lookup G1 X V
Mem : mem X V
Lkp1 : lookup G1 X U1
Lkp2 : lookup G2 X U2
LkpS : lookup SG X public
============================
 U1 = U2
 < L: apply Equiv to LkpS Lkp1.

Subgoal 1:

Variables: SG G1 G2 E V1 V2 V X U1 U2
IsE : is_e E
Lev : level SG E public
Ev1 : eval_e G1 E V1
Ev2 : eval_e G2 E V2
Vars : vars E V
Equiv : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V
Equiv1 : forall X V, lookup SG X public -> lookup G2 X V -> lookup G1 X V
Mem : mem X V
Lkp1 : lookup G1 X U1
Lkp2 : lookup G2 X U2
LkpS : lookup SG X public
L : lookup G2 X U1
============================
 U1 = U2
 < apply lookup_unique to L Lkp2.

Subgoal 1:

Variables: SG G1 G2 E V1 V2 V X U2
IsE : is_e E
Lev : level SG E public
Ev1 : eval_e G1 E V1
Ev2 : eval_e G2 E V2
Vars : vars E V
Equiv : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V
Equiv1 : forall X V, lookup SG X public -> lookup G2 X V -> lookup G1 X V
Mem : mem X V
Lkp1 : lookup G1 X U2
Lkp2 : lookup G2 X U2
LkpS : lookup SG X public
L : lookup G2 X U2
============================
 U2 = U2
 < search.

Variables: SG G1 G2 E V2 V
IsE : is_e E
Lev : level SG E public
Ev1 : eval_e G1 E V2
Ev2 : eval_e G2 E V2
Vars : vars E V
Equiv : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V
Equiv1 : forall X V, lookup SG X public -> lookup G2 X V -> lookup G1 X V
============================
 V2 = V2
 < search.

Proof completed.
 < Extensible_Theorem
      level_unique : forall SG E S1 S2,
         LevA : level SG E S1 ->
         LevB : level SG E S2 ->
         S1 = S2
      on LevA.

Subgoal 1:

Variables: SG S2 I
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (intlit I) public @
LevB : level SG (intlit I) S2
============================
 public = S2
 < case LevB.

Subgoal 1:

Variables: SG I
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (intlit I) public @
============================
 public = public
 < search.

Subgoal 2:

Variables: SG S2
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG trueE public @
LevB : level SG trueE S2
============================
 public = S2
 < case LevB.

Subgoal 2:

Variables: SG
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG trueE public @
============================
 public = public
 < search.

Subgoal 3:

Variables: SG S2
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG falseE public @
LevB : level SG falseE S2
============================
 public = S2
 < case LevB.

Subgoal 3:

Variables: SG
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG falseE public @
============================
 public = public
 < search.

Subgoal 4:

Variables: SG S1 S2 N
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (var N) S1 @
LevB : level SG (var N) S2
LevA1 : lookup SG N S1
============================
 S1 = S2
 < L: case LevB.

Subgoal 4:

Variables: SG S1 S2 N
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (var N) S1 @
LevA1 : lookup SG N S1
L : lookup SG N S2
============================
 S1 = S2
 < apply lookup_unique to LevA1 L.

Subgoal 4:

Variables: SG S2 N
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (var N) S2 @
LevA1 : lookup SG N S2
L : lookup SG N S2
============================
 S2 = S2
 < search.

Subgoal 5:

Variables: SG S1 S2 L1 L2 E2 E1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (add E1 E2) S1 @
LevB : level SG (add E1 E2) S2
LevA1 : level SG E1 L1 *
LevA2 : level SG E2 L2 *
LevA3 : join L1 L2 S1
============================
 S1 = S2
 < L: case LevB.

Subgoal 5:

Variables: SG S1 S2 L1 L2 E2 E1 L3 L4
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (add E1 E2) S1 @
LevA1 : level SG E1 L1 *
LevA2 : level SG E2 L2 *
LevA3 : join L1 L2 S1
L : level SG E1 L3
L1 : level SG E2 L4
L2 : join L3 L4 S2
============================
 S1 = S2
 < apply IH to LevA1 L.

Subgoal 5:

Variables: SG S1 S2 L2 E2 E1 L3 L4
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (add E1 E2) S1 @
LevA1 : level SG E1 L3 *
LevA2 : level SG E2 L2 *
LevA3 : join L3 L2 S1
L : level SG E1 L3
L1 : level SG E2 L4
L2 : join L3 L4 S2
============================
 S1 = S2
 < apply IH to LevA2 L1.

Subgoal 5:

Variables: SG S1 S2 E2 E1 L3 L4
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (add E1 E2) S1 @
LevA1 : level SG E1 L3 *
LevA2 : level SG E2 L4 *
LevA3 : join L3 L4 S1
L : level SG E1 L3
L1 : level SG E2 L4
L2 : join L3 L4 S2
============================
 S1 = S2
 < apply join_unique to LevA3 L2.

Subgoal 5:

Variables: SG S2 E2 E1 L3 L4
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (add E1 E2) S2 @
LevA1 : level SG E1 L3 *
LevA2 : level SG E2 L4 *
LevA3 : join L3 L4 S2
L : level SG E1 L3
L1 : level SG E2 L4
L2 : join L3 L4 S2
============================
 S2 = S2
 < search.

Subgoal 6:

Variables: SG S1 S2 L1 L2 E2 E1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (eq E1 E2) S1 @
LevB : level SG (eq E1 E2) S2
LevA1 : level SG E1 L1 *
LevA2 : level SG E2 L2 *
LevA3 : join L1 L2 S1
============================
 S1 = S2
 < L: case LevB.

Subgoal 6:

Variables: SG S1 S2 L1 L2 E2 E1 L3 L4
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (eq E1 E2) S1 @
LevA1 : level SG E1 L1 *
LevA2 : level SG E2 L2 *
LevA3 : join L1 L2 S1
L : level SG E1 L3
L1 : level SG E2 L4
L2 : join L3 L4 S2
============================
 S1 = S2
 < apply IH to LevA1 L.

Subgoal 6:

Variables: SG S1 S2 L2 E2 E1 L3 L4
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (eq E1 E2) S1 @
LevA1 : level SG E1 L3 *
LevA2 : level SG E2 L2 *
LevA3 : join L3 L2 S1
L : level SG E1 L3
L1 : level SG E2 L4
L2 : join L3 L4 S2
============================
 S1 = S2
 < apply IH to LevA2 L1.

Subgoal 6:

Variables: SG S1 S2 E2 E1 L3 L4
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (eq E1 E2) S1 @
LevA1 : level SG E1 L3 *
LevA2 : level SG E2 L4 *
LevA3 : join L3 L4 S1
L : level SG E1 L3
L1 : level SG E2 L4
L2 : join L3 L4 S2
============================
 S1 = S2
 < apply join_unique to LevA3 L2.

Subgoal 6:

Variables: SG S2 E2 E1 L3 L4
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (eq E1 E2) S2 @
LevA1 : level SG E1 L3 *
LevA2 : level SG E2 L4 *
LevA3 : join L3 L4 S2
L : level SG E1 L3
L1 : level SG E2 L4
L2 : join L3 L4 S2
============================
 S2 = S2
 < search.

Subgoal 7:

Variables: SG S1 S2 L1 L2 E2 E1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (gt E1 E2) S1 @
LevB : level SG (gt E1 E2) S2
LevA1 : level SG E1 L1 *
LevA2 : level SG E2 L2 *
LevA3 : join L1 L2 S1
============================
 S1 = S2
 < L: case LevB.

Subgoal 7:

Variables: SG S1 S2 L1 L2 E2 E1 L3 L4
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (gt E1 E2) S1 @
LevA1 : level SG E1 L1 *
LevA2 : level SG E2 L2 *
LevA3 : join L1 L2 S1
L : level SG E1 L3
L1 : level SG E2 L4
L2 : join L3 L4 S2
============================
 S1 = S2
 < apply IH to LevA1 L.

Subgoal 7:

Variables: SG S1 S2 L2 E2 E1 L3 L4
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (gt E1 E2) S1 @
LevA1 : level SG E1 L3 *
LevA2 : level SG E2 L2 *
LevA3 : join L3 L2 S1
L : level SG E1 L3
L1 : level SG E2 L4
L2 : join L3 L4 S2
============================
 S1 = S2
 < apply IH to LevA2 L1.

Subgoal 7:

Variables: SG S1 S2 E2 E1 L3 L4
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (gt E1 E2) S1 @
LevA1 : level SG E1 L3 *
LevA2 : level SG E2 L4 *
LevA3 : join L3 L4 S1
L : level SG E1 L3
L1 : level SG E2 L4
L2 : join L3 L4 S2
============================
 S1 = S2
 < apply join_unique to LevA3 L2.

Subgoal 7:

Variables: SG S2 E2 E1 L3 L4
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (gt E1 E2) S2 @
LevA1 : level SG E1 L3 *
LevA2 : level SG E2 L4 *
LevA3 : join L3 L4 S2
L : level SG E1 L3
L1 : level SG E2 L4
L2 : join L3 L4 S2
============================
 S2 = S2
 < search.

Subgoal 8:

Variables: SG S1 S2 E1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (not E1) S1 @
LevB : level SG (not E1) S2
LevA1 : level SG E1 S1 *
============================
 S1 = S2
 < L: case LevB.

Subgoal 8:

Variables: SG S1 S2 E1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (not E1) S1 @
LevA1 : level SG E1 S1 *
L : level SG E1 S2
============================
 S1 = S2
 < apply IH to LevA1 L.

Subgoal 8:

Variables: SG S2 E1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG (not E1) S2 @
LevA1 : level SG E1 S2 *
L : level SG E1 S2
============================
 S2 = S2
 < search.

Subgoal 9:

Variables: SG S1 S2 E1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG <unknown I e> S1 @
LevB : level SG <unknown I e> S2
LevA1 : |{e}- <unknown I e> ~~> E1
LevA2 : level SG E1 S1 *
============================
 S1 = S2
 < L: case LevB.

Subgoal 9:

Variables: SG S1 S2 E1 E2
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG <unknown I e> S1 @
LevA1 : |{e}- <unknown I e> ~~> E1
LevA2 : level SG E1 S1 *
L : |{e}- <unknown I e> ~~> E2
L1 : level SG E2 S2
============================
 S1 = S2
 < apply proj_e_unique to LevA1 L.

Subgoal 9:

Variables: SG S1 S2 E2
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG <unknown I e> S1 @
LevA1 : |{e}- <unknown I e> ~~> E2
LevA2 : level SG E2 S1 *
L : |{e}- <unknown I e> ~~> E2
L1 : level SG E2 S2
============================
 S1 = S2
 < apply IH to LevA2 L1.

Subgoal 9:

Variables: SG S2 E2
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
LevA : level SG <unknown I e> S2 @
LevA1 : |{e}- <unknown I e> ~~> E2
LevA2 : level SG E2 S2 *
L : |{e}- <unknown I e> ~~> E2
L1 : level SG E2 S2
============================
 S2 = S2
 < search.

Proof completed.
 < Theorem level_not_public :
     forall SG G1 G2 E V1 V2,
       is_e E -> public_equiv SG G1 G2 -> level SG E public -> eval_e G1 E V1 ->
       eval_e G2 E V2 -> (V1 = V2 -> false) -> false.

============================
 forall SG G1 G2 E V1 V2,
   is_e E -> public_equiv SG G1 G2 -> level SG E public -> eval_e G1 E V1 -> eval_e G2 E V2 ->
   (V1 = V2 -> false) -> false
 < intros Is Equiv Lev Ev1 Ev2 NEq.

Variables: SG G1 G2 E V1 V2
Is : is_e E
Equiv : public_equiv SG G1 G2
Lev : level SG E public
Ev1 : eval_e G1 E V1
Ev2 : eval_e G2 E V2
NEq : V1 = V2 -> false
============================
 false
 < apply level_secure to Is Lev Equiv Ev1 Ev2.

Variables: SG G1 G2 E V2
Is : is_e E
Equiv : public_equiv SG G1 G2
Lev : level SG E public
Ev1 : eval_e G1 E V2
Ev2 : eval_e G2 E V2
NEq : V2 = V2 -> false
============================
 false
 < backchain NEq.

Proof completed.
 < Extensible_Theorem
      stmt_public_branch : forall SG SL SG2 S X,
         Sec : secure SG SL S SG2 ->
         LkpSec : lookup SG X public ->
         lookup SG2 X public
      on Sec.

Subgoal 1:

Variables: SL SG2 X
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG2 SL skipS SG2 @
LkpSec : lookup SG2 X public
============================
 lookup SG2 X public
 < search.

Subgoal 2:

Variables: SG SL SG2 X SG1 S2 S1
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG SL (seq S1 S2) SG2 @
LkpSec : lookup SG X public
Sec1 : secure SG SL S1 SG1 *
Sec2 : secure SG1 SL S2 SG2 *
============================
 lookup SG2 X public
 < L: apply IH to Sec1 LkpSec.

Subgoal 2:

Variables: SG SL SG2 X SG1 S2 S1
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG SL (seq S1 S2) SG2 @
LkpSec : lookup SG X public
Sec1 : secure SG SL S1 SG1 *
Sec2 : secure SG1 SL S2 SG2 *
L : lookup SG1 X public
============================
 lookup SG2 X public
 < apply IH to Sec2 L.

Subgoal 2:

Variables: SG SL SG2 X SG1 S2 S1
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG SL (seq S1 S2) SG2 @
LkpSec : lookup SG X public
Sec1 : secure SG SL S1 SG1 *
Sec2 : secure SG1 SL S2 SG2 *
L : lookup SG1 X public
H1 : lookup SG2 X public
============================
 lookup SG2 X public
 < search.

Subgoal 3:

Variables: SG X N E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG public (decl N Ty E) ((N, public)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E public
Sec2 : no_lookup SG N
============================
 lookup ((N, public)::SG) X public
 < assert N = X -> false.

Subgoal 3.1:

Variables: SG X N E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG public (decl N Ty E) ((N, public)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E public
Sec2 : no_lookup SG N
============================
 N = X -> false
 < intros E.

Subgoal 3.1:

Variables: SG X N E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG public (decl N Ty E) ((N, public)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E public
Sec2 : no_lookup SG N
E : N = X
============================
 false
 < case E.

Subgoal 3.1:

Variables: SG X E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG public (decl X Ty E) ((X, public)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E public
Sec2 : no_lookup SG X
============================
 false
 < apply no_lookup to Sec2 LkpSec.

Subgoal 3:

Variables: SG X N E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG public (decl N Ty E) ((N, public)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E public
Sec2 : no_lookup SG N
H1 : N = X -> false
============================
 lookup ((N, public)::SG) X public
 < search.

Subgoal 4:

Variables: SL SG2 X L E N
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG2 SL (assign N E) SG2 @
LkpSec : lookup SG2 X public
Sec1 : level SG2 E L
Sec2 : lookup SG2 N private
============================
 lookup SG2 X public
 < search.

Subgoal 5:

Variables: SG2 X E N
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG2 public (assign N E) SG2 @
LkpSec : lookup SG2 X public
Sec1 : level SG2 E public
Sec2 : lookup SG2 N public
============================
 lookup SG2 X public
 < search.

Subgoal 6:

Variables: SL SG2 X L Sl1 SG1 SG3 S2 S1 E
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG2 SL (ifte E S1 S2) SG2 @
LkpSec : lookup SG2 X public
Sec1 : level SG2 E L
Sec2 : join L SL Sl1
Sec3 : secure SG2 Sl1 S1 SG1 *
Sec4 : secure SG2 Sl1 S2 SG3 *
============================
 lookup SG2 X public
 < search.

Subgoal 7:

Variables: SL SG2 X L Sl1 SG1 S1 E
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG2 SL (while E S1) SG2 @
LkpSec : lookup SG2 X public
Sec1 : level SG2 E L
Sec2 : join L SL Sl1
Sec3 : secure SG2 Sl1 S1 SG1 *
============================
 lookup SG2 X public
 < search.

Subgoal 8:

Variables: SG SL X L N E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG SL (secdecl N Ty private E) ((N, private)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E L
Sec2 : no_lookup SG N
============================
 lookup ((N, private)::SG) X public
 < assert N = X -> false.

Subgoal 8.1:

Variables: SG SL X L N E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG SL (secdecl N Ty private E) ((N, private)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E L
Sec2 : no_lookup SG N
============================
 N = X -> false
 < intros E.

Subgoal 8.1:

Variables: SG SL X L N E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG SL (secdecl N Ty private E) ((N, private)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E L
Sec2 : no_lookup SG N
E : N = X
============================
 false
 < case E.

Subgoal 8.1:

Variables: SG SL X L E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG SL (secdecl X Ty private E) ((X, private)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E L
Sec2 : no_lookup SG X
============================
 false
 < apply no_lookup to Sec2 LkpSec.

Subgoal 8:

Variables: SG SL X L N E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG SL (secdecl N Ty private E) ((N, private)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E L
Sec2 : no_lookup SG N
H1 : N = X -> false
============================
 lookup ((N, private)::SG) X public
 < search.

Subgoal 9:

Variables: SG X N E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG public (secdecl N Ty public E) ((N, public)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E public
Sec2 : no_lookup SG N
============================
 lookup ((N, public)::SG) X public
 < assert N = X -> false.

Subgoal 9.1:

Variables: SG X N E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG public (secdecl N Ty public E) ((N, public)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E public
Sec2 : no_lookup SG N
============================
 N = X -> false
 < intros E.

Subgoal 9.1:

Variables: SG X N E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG public (secdecl N Ty public E) ((N, public)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E public
Sec2 : no_lookup SG N
E : N = X
============================
 false
 < case E.

Subgoal 9.1:

Variables: SG X E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG public (secdecl X Ty public E) ((X, public)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E public
Sec2 : no_lookup SG X
============================
 false
 < apply no_lookup to Sec2 LkpSec.

Subgoal 9:

Variables: SG X N E Ty
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG public (secdecl N Ty public E) ((N, public)::SG) @
LkpSec : lookup SG X public
Sec1 : level SG E public
Sec2 : no_lookup SG N
H1 : N = X -> false
============================
 lookup ((N, public)::SG) X public
 < search.

Subgoal 10:

Variables: SG SL SG2 X S1
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG SL <unknown I s> SG2 @
LkpSec : lookup SG X public
Sec1 : |{s}- <unknown I s> ~~> S1
Sec2 : secure SG SL S1 SG2 *
============================
 lookup SG2 X public
 < apply IH to Sec2 LkpSec.

Subgoal 10:

Variables: SG SL SG2 X S1
IH : forall SG SL SG2 S X,
       secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure SG SL <unknown I s> SG2 @
LkpSec : lookup SG X public
Sec1 : |{s}- <unknown I s> ~~> S1
Sec2 : secure SG SL S1 SG2 *
H1 : lookup SG2 X public
============================
 lookup SG2 X public
 < search.

Proof completed.
 < Theorem public_equiv_swap :
     forall SG SG' GA GB,
       (forall X, lookup SG X public -> lookup SG' X public) -> public_equiv SG' GA GB ->
       public_equiv SG GA GB.

============================
 forall SG SG' GA GB,
   (forall X, lookup SG X public -> lookup SG' X public) -> public_equiv SG' GA GB ->
   public_equiv SG GA GB
 < intros LkpEquiv Eq.

Variables: SG SG' GA GB
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : public_equiv SG' GA GB
============================
 public_equiv SG GA GB
 < Eq: case Eq.

Variables: SG SG' GA GB
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V
============================
 public_equiv SG GA GB
 < unfold .

Subgoal 1:

Variables: SG SG' GA GB
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V
============================
 forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
 < intros LkpSec LkpA.

Subgoal 1:

Variables: SG SG' GA GB X V
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpA : lookup GA X V
============================
 lookup GB X V
 < LkpSG': apply LkpEquiv to LkpSec.

Subgoal 1:

Variables: SG SG' GA GB X V
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpA : lookup GA X V
LkpSG' : lookup SG' X public
============================
 lookup GB X V
 < apply Eq to LkpSG' LkpA.

Subgoal 1:

Variables: SG SG' GA GB X V
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpA : lookup GA X V
LkpSG' : lookup SG' X public
H1 : lookup GB X V
============================
 lookup GB X V
 < search.

Subgoal 2:

Variables: SG SG' GA GB
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V
============================
 forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
 < intros LkpSec LkpB.

Subgoal 2:

Variables: SG SG' GA GB X V
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpB : lookup GB X V
============================
 lookup GA X V
 < LkpSG': apply LkpEquiv to LkpSec.

Subgoal 2:

Variables: SG SG' GA GB X V
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpB : lookup GB X V
LkpSG' : lookup SG' X public
============================
 lookup GA X V
 < apply Eq1 to LkpSG' LkpB.

Subgoal 2:

Variables: SG SG' GA GB X V
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpB : lookup GB X V
LkpSG' : lookup SG' X public
H1 : lookup GA X V
============================
 lookup GA X V
 < search.

Proof completed.
 < Extensible_Theorem
      stmt_not_public_no_public_change : forall S SG SL SG1 G G1,
         Sec : secure SG SL S SG1 ->
         NEq : (SL = public -> false) ->
         Ev : eval_s G S G1 ->
         public_equiv SG G G1
      on Ev.

Subgoal 1:

Variables: SG SL SG1 G1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG SL skipS SG1
NEq : SL = public -> false
Ev : eval_s G1 skipS G1 @
============================
 public_equiv SG G1 G1
 < case Sec.

Subgoal 1:

Variables: SL SG1 G1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G1 skipS G1 @
============================
 public_equiv SG1 G1 G1
 < backchain public_equiv_refl.

Subgoal 2:

Variables: SG SL SG1 G V N E Ty
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG SL (decl N Ty E) SG1
NEq : SL = public -> false
Ev : eval_s G (decl N Ty E) ((N, V)::G) @
Ev1 : eval_e G E V
============================
 public_equiv SG G ((N, V)::G)
 < Sec: case Sec.

Subgoal 2:

Variables: SG G V N E Ty
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : public = public -> false
Ev : eval_s G (decl N Ty E) ((N, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E public
Sec1 : no_lookup SG N
============================
 public_equiv SG G ((N, V)::G)
 < apply NEq to _.

Subgoal 3:

Variables: SG SL SG1 G VOld NewG V N E
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG SL (assign N E) SG1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
============================
 public_equiv SG G ((N, V)::NewG)
 < Sec: case Sec.

Subgoal 3.1:

Variables: SL SG1 G VOld NewG V N E L
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
============================
 public_equiv SG1 G ((N, V)::NewG)
 < unfold .

Subgoal 3.1.1:

Variables: SL SG1 G VOld NewG V N E L
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
============================
 forall X V1, lookup SG1 X public -> lookup G X V1 -> lookup ((N, V)::NewG) X V1
 < intros LS LA.

Subgoal 3.1.1:

Variables: SL SG1 G VOld NewG V N E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 X public
LA : lookup G X V1
============================
 lookup ((N, V)::NewG) X V1
 < N: assert N = X -> false.

Subgoal 3.1.1.1:

Variables: SL SG1 G VOld NewG V N E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 X public
LA : lookup G X V1
============================
 N = X -> false
 < intros E.

Subgoal 3.1.1.1:

Variables: SL SG1 G VOld NewG V N E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 X public
LA : lookup G X V1
E : N = X
============================
 false
 < case E.

Subgoal 3.1.1.1:

Variables: SL SG1 G VOld NewG V E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign X E) ((X, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (X, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 X private
LS : lookup SG1 X public
LA : lookup G X V1
============================
 false
 < apply lookup_unique to Sec1 LS.

Subgoal 3.1.1:

Variables: SL SG1 G VOld NewG V N E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 X public
LA : lookup G X V1
N : N = X -> false
============================
 lookup ((N, V)::NewG) X V1
 < assert X = N -> false.

Subgoal 3.1.1.2:

Variables: SL SG1 G VOld NewG V N E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 X public
LA : lookup G X V1
N : N = X -> false
============================
 X = N -> false
 < intros E.

Subgoal 3.1.1.2:

Variables: SL SG1 G VOld NewG V N E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 X public
LA : lookup G X V1
N : N = X -> false
E : X = N
============================
 false
 < case E.

Subgoal 3.1.1.2:

Variables: SL SG1 G VOld NewG V N E L V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 N public
LA : lookup G N V1
N : N = N -> false
============================
 false
 < backchain N.

Subgoal 3.1.1:

Variables: SL SG1 G VOld NewG V N E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 X public
LA : lookup G X V1
N : N = X -> false
H1 : X = N -> false
============================
 lookup ((N, V)::NewG) X V1
 < apply select_lookup to LA Ev2 _.

Subgoal 3.1.1:

Variables: SL SG1 G VOld NewG V N E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 X public
LA : lookup G X V1
N : N = X -> false
H1 : X = N -> false
H2 : lookup NewG X V1
============================
 lookup ((N, V)::NewG) X V1
 < search.

Subgoal 3.1.2:

Variables: SL SG1 G VOld NewG V N E L
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
============================
 forall X V1, lookup SG1 X public -> lookup ((N, V)::NewG) X V1 -> lookup G X V1
 < intros LS LB.

Subgoal 3.1.2:

Variables: SL SG1 G VOld NewG V N E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 X public
LB : lookup ((N, V)::NewG) X V1
============================
 lookup G X V1
 < L: case LB.

Subgoal 3.1.2.1:

Variables: SL SG1 G VOld NewG E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign X E) ((X, V1)::NewG) @
Ev1 : eval_e G E V1
Ev2 : select (X, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 X private
LS : lookup SG1 X public
============================
 lookup G X V1
 < apply lookup_unique to Sec1 LS.

Subgoal 3.1.2.2:

Variables: SL SG1 G VOld NewG V N E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 X public
L : N = X -> false
L1 : lookup NewG X V1
============================
 lookup G X V1
 < assert X = N -> false.

Subgoal 3.1.2.2.1:

Variables: SL SG1 G VOld NewG V N E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 X public
L : N = X -> false
L1 : lookup NewG X V1
============================
 X = N -> false
 < intros E.

Subgoal 3.1.2.2.1:

Variables: SL SG1 G VOld NewG V N E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 X public
L : N = X -> false
L1 : lookup NewG X V1
E : X = N
============================
 false
 < case E.

Subgoal 3.1.2.2.1:

Variables: SL SG1 G VOld NewG V N E L V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 N public
L : N = N -> false
L1 : lookup NewG N V1
============================
 false
 < backchain L.

Subgoal 3.1.2.2:

Variables: SL SG1 G VOld NewG V N E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 X public
L : N = X -> false
L1 : lookup NewG X V1
H1 : X = N -> false
============================
 lookup G X V1
 < apply lookup_after_select_before to L1 Ev2 _.

Subgoal 3.1.2.2:

Variables: SL SG1 G VOld NewG V N E L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LS : lookup SG1 X public
L : N = X -> false
L1 : lookup NewG X V1
H1 : X = N -> false
H2 : lookup G X V1
============================
 lookup G X V1
 < search.

Subgoal 3.2:

Variables: SG1 G VOld NewG V N E
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : public = public -> false
Ev : eval_s G (assign N E) ((N, V)::NewG) @
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
Sec : level SG1 E public
Sec1 : lookup SG1 N public
============================
 public_equiv SG1 G ((N, V)::NewG)
 < apply NEq to _.

Subgoal 4:

Variables: SG SL SG1 G G1 G2 S2 S1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG SL (seq S1 S2) SG1
NEq : SL = public -> false
Ev : eval_s G (seq S1 S2) G1 @
Ev1 : eval_s G S1 G2 *
Ev2 : eval_s G2 S2 G1 *
============================
 public_equiv SG G G1
 < Sec: case Sec.

Subgoal 4:

Variables: SG SL SG1 G G1 G2 S2 S1 SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (seq S1 S2) G1 @
Ev1 : eval_s G S1 G2 *
Ev2 : eval_s G2 S2 G1 *
Sec : secure SG SL S1 SG2
Sec1 : secure SG2 SL S2 SG1
============================
 public_equiv SG G G1
 < PE1: apply IH to Sec _ Ev1.

Subgoal 4:

Variables: SG SL SG1 G G1 G2 S2 S1 SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (seq S1 S2) G1 @
Ev1 : eval_s G S1 G2 *
Ev2 : eval_s G2 S2 G1 *
Sec : secure SG SL S1 SG2
Sec1 : secure SG2 SL S2 SG1
PE1 : public_equiv SG G G2
============================
 public_equiv SG G G1
 < PE2: apply IH to Sec1 _ Ev2.

Subgoal 4:

Variables: SG SL SG1 G G1 G2 S2 S1 SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (seq S1 S2) G1 @
Ev1 : eval_s G S1 G2 *
Ev2 : eval_s G2 S2 G1 *
Sec : secure SG SL S1 SG2
Sec1 : secure SG2 SL S2 SG1
PE1 : public_equiv SG G G2
PE2 : public_equiv SG2 G2 G1
============================
 public_equiv SG G G1
 < E: assert forall X,
     lookup SG X public -> lookup SG2 X public.

Subgoal 4.1:

Variables: SG SL SG1 G G1 G2 S2 S1 SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (seq S1 S2) G1 @
Ev1 : eval_s G S1 G2 *
Ev2 : eval_s G2 S2 G1 *
Sec : secure SG SL S1 SG2
Sec1 : secure SG2 SL S2 SG1
PE1 : public_equiv SG G G2
PE2 : public_equiv SG2 G2 G1
============================
 forall X, lookup SG X public -> lookup SG2 X public
 < intros L.

Subgoal 4.1:

Variables: SG SL SG1 G G1 G2 S2 S1 SG2 X
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (seq S1 S2) G1 @
Ev1 : eval_s G S1 G2 *
Ev2 : eval_s G2 S2 G1 *
Sec : secure SG SL S1 SG2
Sec1 : secure SG2 SL S2 SG1
PE1 : public_equiv SG G G2
PE2 : public_equiv SG2 G2 G1
L : lookup SG X public
============================
 lookup SG2 X public
 < L': apply stmt_public_branch to Sec L.

Subgoal 4.1:

Variables: SG SL SG1 G G1 G2 S2 S1 SG2 X
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (seq S1 S2) G1 @
Ev1 : eval_s G S1 G2 *
Ev2 : eval_s G2 S2 G1 *
Sec : secure SG SL S1 SG2
Sec1 : secure SG2 SL S2 SG1
PE1 : public_equiv SG G G2
PE2 : public_equiv SG2 G2 G1
L : lookup SG X public
L' : lookup SG2 X public
============================
 lookup SG2 X public
 < search.

Subgoal 4:

Variables: SG SL SG1 G G1 G2 S2 S1 SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (seq S1 S2) G1 @
Ev1 : eval_s G S1 G2 *
Ev2 : eval_s G2 S2 G1 *
Sec : secure SG SL S1 SG2
Sec1 : secure SG2 SL S2 SG1
PE1 : public_equiv SG G G2
PE2 : public_equiv SG2 G2 G1
E : forall X, lookup SG X public -> lookup SG2 X public
============================
 public_equiv SG G G1
 < PE': apply public_equiv_swap to E PE2.

Subgoal 4:

Variables: SG SL SG1 G G1 G2 S2 S1 SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (seq S1 S2) G1 @
Ev1 : eval_s G S1 G2 *
Ev2 : eval_s G2 S2 G1 *
Sec : secure SG SL S1 SG2
Sec1 : secure SG2 SL S2 SG1
PE1 : public_equiv SG G G2
PE2 : public_equiv SG2 G2 G1
E : forall X, lookup SG X public -> lookup SG2 X public
PE' : public_equiv SG G2 G1
============================
 public_equiv SG G G1
 < apply public_equiv_trans to PE1 PE'.

Subgoal 4:

Variables: SG SL SG1 G G1 G2 S2 S1 SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (seq S1 S2) G1 @
Ev1 : eval_s G S1 G2 *
Ev2 : eval_s G2 S2 G1 *
Sec : secure SG SL S1 SG2
Sec1 : secure SG2 SL S2 SG1
PE1 : public_equiv SG G G2
PE2 : public_equiv SG2 G2 G1
E : forall X, lookup SG X public -> lookup SG2 X public
PE' : public_equiv SG G2 G1
H1 : public_equiv SG G G1
============================
 public_equiv SG G G1
 < search.

Subgoal 5:

Variables: SG SL SG1 G G1 S2 S1 E
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG SL (ifte E S1 S2) SG1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G1 *
============================
 public_equiv SG G G1
 < Sec: case Sec.

Subgoal 5:

Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G1 *
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
============================
 public_equiv SG1 G G1
 < assert Sl1 = public -> false.

Subgoal 5.1:

Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G1 *
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
============================
 Sl1 = public -> false
 < intros E.

Subgoal 5.1:

Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G1 *
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
E : Sl1 = public
============================
 false
 < case E.

Subgoal 5.1:

Variables: SL SG1 G G1 S2 S1 E L SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G1 *
Sec : level SG1 E L
Sec1 : join L SL public
Sec2 : secure SG1 public S1 SG2
Sec3 : secure SG1 public S2 SG3
============================
 false
 < backchain NEq.

Subgoal 5.1:

Variables: SL SG1 G G1 S2 S1 E L SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G1 *
Sec : level SG1 E L
Sec1 : join L SL public
Sec2 : secure SG1 public S1 SG2
Sec3 : secure SG1 public S2 SG3
============================
 SL = public
 < apply join_public to Sec1.

Subgoal 5.1:

Variables: SG1 G G1 S2 S1 E SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : public = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G1 *
Sec : level SG1 E public
Sec1 : join public public public
Sec2 : secure SG1 public S1 SG2
Sec3 : secure SG1 public S2 SG3
============================
 public = public
 < search.

Subgoal 5:

Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G1 *
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
H1 : Sl1 = public -> false
============================
 public_equiv SG1 G G1
 < apply IH to Sec2 _ Ev2.

Subgoal 5:

Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G1 *
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
H1 : Sl1 = public -> false
H2 : public_equiv SG1 G G1
============================
 public_equiv SG1 G G1
 < search.

Subgoal 6:

Variables: SG SL SG1 G G1 S2 S1 E
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG SL (ifte E S1 S2) SG1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E falseE
Ev2 : eval_s G S2 G1 *
============================
 public_equiv SG G G1
 < Sec: case Sec.

Subgoal 6:

Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E falseE
Ev2 : eval_s G S2 G1 *
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
============================
 public_equiv SG1 G G1
 < assert Sl1 = public -> false.

Subgoal 6.1:

Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E falseE
Ev2 : eval_s G S2 G1 *
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
============================
 Sl1 = public -> false
 < intros E.

Subgoal 6.1:

Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E falseE
Ev2 : eval_s G S2 G1 *
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
E : Sl1 = public
============================
 false
 < case E.

Subgoal 6.1:

Variables: SL SG1 G G1 S2 S1 E L SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E falseE
Ev2 : eval_s G S2 G1 *
Sec : level SG1 E L
Sec1 : join L SL public
Sec2 : secure SG1 public S1 SG2
Sec3 : secure SG1 public S2 SG3
============================
 false
 < backchain NEq.

Subgoal 6.1:

Variables: SL SG1 G G1 S2 S1 E L SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E falseE
Ev2 : eval_s G S2 G1 *
Sec : level SG1 E L
Sec1 : join L SL public
Sec2 : secure SG1 public S1 SG2
Sec3 : secure SG1 public S2 SG3
============================
 SL = public
 < apply join_public to Sec1.

Subgoal 6.1:

Variables: SG1 G G1 S2 S1 E SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : public = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E falseE
Ev2 : eval_s G S2 G1 *
Sec : level SG1 E public
Sec1 : join public public public
Sec2 : secure SG1 public S1 SG2
Sec3 : secure SG1 public S2 SG3
============================
 public = public
 < search.

Subgoal 6:

Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E falseE
Ev2 : eval_s G S2 G1 *
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
H1 : Sl1 = public -> false
============================
 public_equiv SG1 G G1
 < apply IH to Sec3 _ Ev2.

Subgoal 6:

Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (ifte E S1 S2) G1 @
Ev1 : eval_e G E falseE
Ev2 : eval_s G S2 G1 *
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
H1 : Sl1 = public -> false
H2 : public_equiv SG1 G G1
============================
 public_equiv SG1 G G1
 < search.

Subgoal 7:

Variables: SG SL SG1 G G1 G2 S1 E
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G (while E S1) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G2 *
Ev3 : eval_s G2 (while E S1) G1 *
============================
 public_equiv SG G G1
 < Sec: case Sec (keep).

Subgoal 7:

Variables: SL SG1 G G1 G2 S1 E L Sl1 SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG1 SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G (while E S1) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G2 *
Ev3 : eval_s G2 (while E S1) G1 *
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
============================
 public_equiv SG1 G G1
 < assert Sl1 = public -> false.

Subgoal 7.1:

Variables: SL SG1 G G1 G2 S1 E L Sl1 SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG1 SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G (while E S1) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G2 *
Ev3 : eval_s G2 (while E S1) G1 *
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
============================
 Sl1 = public -> false
 < intros E.

Subgoal 7.1:

Variables: SL SG1 G G1 G2 S1 E L Sl1 SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG1 SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G (while E S1) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G2 *
Ev3 : eval_s G2 (while E S1) G1 *
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
E : Sl1 = public
============================
 false
 < case E.

Subgoal 7.1:

Variables: SL SG1 G G1 G2 S1 E L SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG1 SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G (while E S1) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G2 *
Ev3 : eval_s G2 (while E S1) G1 *
Sec1 : level SG1 E L
Sec2 : join L SL public
Sec3 : secure SG1 public S1 SG2
============================
 false
 < backchain NEq.

Subgoal 7.1:

Variables: SL SG1 G G1 G2 S1 E L SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG1 SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G (while E S1) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G2 *
Ev3 : eval_s G2 (while E S1) G1 *
Sec1 : level SG1 E L
Sec2 : join L SL public
Sec3 : secure SG1 public S1 SG2
============================
 SL = public
 < apply join_public to Sec2.

Subgoal 7.1:

Variables: SG1 G G1 G2 S1 E SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG1 public (while E S1) SG1
NEq : public = public -> false
Ev : eval_s G (while E S1) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G2 *
Ev3 : eval_s G2 (while E S1) G1 *
Sec1 : level SG1 E public
Sec2 : join public public public
Sec3 : secure SG1 public S1 SG2
============================
 public = public
 < search.

Subgoal 7:

Variables: SL SG1 G G1 G2 S1 E L Sl1 SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG1 SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G (while E S1) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G2 *
Ev3 : eval_s G2 (while E S1) G1 *
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
H1 : Sl1 = public -> false
============================
 public_equiv SG1 G G1
 < EqGG2: apply IH to Sec3 _ Ev2.

Subgoal 7:

Variables: SL SG1 G G1 G2 S1 E L Sl1 SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG1 SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G (while E S1) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G2 *
Ev3 : eval_s G2 (while E S1) G1 *
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
H1 : Sl1 = public -> false
EqGG2 : public_equiv SG1 G G2
============================
 public_equiv SG1 G G1
 < EqG2G1: apply IH to _ _ Ev3.

Subgoal 7:

Variables: SL SG1 G G1 G2 S1 E L Sl1 SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG1 SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G (while E S1) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G2 *
Ev3 : eval_s G2 (while E S1) G1 *
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
H1 : Sl1 = public -> false
EqGG2 : public_equiv SG1 G G2
EqG2G1 : public_equiv SG1 G2 G1
============================
 public_equiv SG1 G G1
 < apply public_equiv_trans to EqGG2 EqG2G1.

Subgoal 7:

Variables: SL SG1 G G1 G2 S1 E L Sl1 SG2
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG1 SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G (while E S1) G1 @
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G2 *
Ev3 : eval_s G2 (while E S1) G1 *
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
H1 : Sl1 = public -> false
EqGG2 : public_equiv SG1 G G2
EqG2G1 : public_equiv SG1 G2 G1
H2 : public_equiv SG1 G G1
============================
 public_equiv SG1 G G1
 < search.

Subgoal 8:

Variables: SG SL SG1 G1 S1 E
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G1 (while E S1) G1 @
Ev1 : eval_e G1 E falseE
============================
 public_equiv SG G1 G1
 < unfold .

Subgoal 8.1:

Variables: SG SL SG1 G1 S1 E
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G1 (while E S1) G1 @
Ev1 : eval_e G1 E falseE
============================
 forall X V, lookup SG X public -> lookup G1 X V -> lookup G1 X V
 < intros LkpSec LkpG1.

Subgoal 8.1:

Variables: SG SL SG1 G1 S1 E X V
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G1 (while E S1) G1 @
Ev1 : eval_e G1 E falseE
LkpSec : lookup SG X public
LkpG1 : lookup G1 X V
============================
 lookup G1 X V
 < search.

Subgoal 8.2:

Variables: SG SL SG1 G1 S1 E
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G1 (while E S1) G1 @
Ev1 : eval_e G1 E falseE
============================
 forall X V, lookup SG X public -> lookup G1 X V -> lookup G1 X V
 < intros LkpSec LkpG1.

Subgoal 8.2:

Variables: SG SL SG1 G1 S1 E X V
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG SL (while E S1) SG1
NEq : SL = public -> false
Ev : eval_s G1 (while E S1) G1 @
Ev1 : eval_e G1 E falseE
LkpSec : lookup SG X public
LkpG1 : lookup G1 X V
============================
 lookup G1 X V
 < search.

Subgoal 9:

Variables: SG SL SG1 G V N E Sl Ty
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG SL (secdecl N Ty Sl E) SG1
NEq : SL = public -> false
Ev : eval_s G (secdecl N Ty Sl E) ((N, V)::G) @
Ev1 : eval_e G E V
============================
 public_equiv SG G ((N, V)::G)
 < Sec: case Sec.

Subgoal 9.1:

Variables: SG SL G V N E Ty L
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E L
Sec1 : no_lookup SG N
============================
 public_equiv SG G ((N, V)::G)
 < unfold .

Subgoal 9.1.1:

Variables: SG SL G V N E Ty L
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E L
Sec1 : no_lookup SG N
============================
 forall X V1, lookup SG X public -> lookup G X V1 -> lookup ((N, V)::G) X V1
 < intros LkpSec LkpG.

Subgoal 9.1.1:

Variables: SG SL G V N E Ty L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E L
Sec1 : no_lookup SG N
LkpSec : lookup SG X public
LkpG : lookup G X V1
============================
 lookup ((N, V)::G) X V1
 < assert N = X -> false.

Subgoal 9.1.1.1:

Variables: SG SL G V N E Ty L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E L
Sec1 : no_lookup SG N
LkpSec : lookup SG X public
LkpG : lookup G X V1
============================
 N = X -> false
 < intros E.

Subgoal 9.1.1.1:

Variables: SG SL G V N E Ty L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E L
Sec1 : no_lookup SG N
LkpSec : lookup SG X public
LkpG : lookup G X V1
E : N = X
============================
 false
 < case E.

Subgoal 9.1.1.1:

Variables: SG SL G V E Ty L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (secdecl X Ty private E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E L
Sec1 : no_lookup SG X
LkpSec : lookup SG X public
LkpG : lookup G X V1
============================
 false
 < apply no_lookup to Sec1 LkpSec.

Subgoal 9.1.1:

Variables: SG SL G V N E Ty L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E L
Sec1 : no_lookup SG N
LkpSec : lookup SG X public
LkpG : lookup G X V1
H1 : N = X -> false
============================
 lookup ((N, V)::G) X V1
 < search.

Subgoal 9.1.2:

Variables: SG SL G V N E Ty L
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E L
Sec1 : no_lookup SG N
============================
 forall X V1, lookup SG X public -> lookup ((N, V)::G) X V1 -> lookup G X V1
 < intros LkpSec LkpG+.

Subgoal 9.1.2:

Variables: SG SL G V N E Ty L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E L
Sec1 : no_lookup SG N
LkpSec : lookup SG X public
LkpG+ : lookup ((N, V)::G) X V1
============================
 lookup G X V1
 < Lkp: case LkpG+.

Subgoal 9.1.2.1:

Variables: SG SL G E Ty L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (secdecl X Ty private E) ((X, V1)::G) @
Ev1 : eval_e G E V1
Sec : level SG E L
Sec1 : no_lookup SG X
LkpSec : lookup SG X public
============================
 lookup G X V1
 < apply no_lookup to Sec1 LkpSec.

Subgoal 9.1.2.2:

Variables: SG SL G V N E Ty L X V1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E L
Sec1 : no_lookup SG N
LkpSec : lookup SG X public
Lkp : N = X -> false
Lkp1 : lookup G X V1
============================
 lookup G X V1
 < search.

Subgoal 9.2:

Variables: SG G V N E Ty
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : public = public -> false
Ev : eval_s G (secdecl N Ty public E) ((N, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E public
Sec1 : no_lookup SG N
============================
 public_equiv SG G ((N, V)::G)
 < apply NEq to _.

Subgoal 10:

Variables: SG SL SG1 G G1 T
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
Sec : secure SG SL <unknown K eval_s> SG1
NEq : SL = public -> false
Ev : eval_s G <unknown K eval_s> G1 @
Ev1 : |{s}- <unknown K eval_s> ~~> T
Ev2 : eval_s G T G1 *
============================
 public_equiv SG G G1
 < Sec: case Sec.

Subgoal 10:

Variables: SG SL SG1 G G1 T S1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G <unknown K eval_s> G1 @
Ev1 : |{s}- <unknown K eval_s> ~~> T
Ev2 : eval_s G T G1 *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
============================
 public_equiv SG G G1
 < apply proj_s_unique to Ev1 Sec.

Subgoal 10:

Variables: SG SL SG1 G G1 S1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G <unknown K eval_s> G1 @
Ev1 : |{s}- <unknown K eval_s> ~~> S1
Ev2 : eval_s G S1 G1 *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
============================
 public_equiv SG G G1
 < apply IH to _ _ Ev2.

Subgoal 10:

Variables: SG SL SG1 G G1 S1
IH : forall S SG SL SG1 G G1,
       secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1
NEq : SL = public -> false
Ev : eval_s G <unknown K eval_s> G1 @
Ev1 : |{s}- <unknown K eval_s> ~~> S1
Ev2 : eval_s G S1 G1 *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
H1 : public_equiv SG G G1
============================
 public_equiv SG G G1
 < search.

Proof completed.
 < Theorem while_no_public_change :
     forall SG SL SG' Cond Body S G G2,
       secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
       eval_s G (while Cond Body) G2 -> public_equiv SG G G2.

============================
 forall SG SL SG' Cond Body S G G2,
   secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
   eval_s G (while Cond Body) G2 -> public_equiv SG G G2
 < induction on 4.

IH : forall SG SL SG' Cond Body S G G2,
       secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
       eval_s G (while Cond Body) G2 * -> public_equiv SG G G2
============================
 forall SG SL SG' Cond Body S G G2,
   secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
   eval_s G (while Cond Body) G2 @ -> public_equiv SG G G2
 < intros Sec Lev NEq Ev.

Variables: SG SL SG' Cond Body S G G2
IH : forall SG SL SG' Cond Body S G G2,
       secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
       eval_s G (while Cond Body) G2 * -> public_equiv SG G G2
Sec : secure SG SL (while Cond Body) SG'
Lev : level SG Cond S
NEq : S = public -> false
Ev : eval_s G (while Cond Body) G2 @
============================
 public_equiv SG G G2
 < Ev: case Ev.

Subgoal 1:

Variables: SG SL SG' Cond Body S G G2 G1
IH : forall SG SL SG' Cond Body S G G2,
       secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
       eval_s G (while Cond Body) G2 * -> public_equiv SG G G2
Sec : secure SG SL (while Cond Body) SG'
Lev : level SG Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueE
Ev1 : eval_s G Body G1 *
Ev2 : eval_s G1 (while Cond Body) G2 *
============================
 public_equiv SG G G2
 < EqG1G2: apply IH to Sec Lev NEq Ev2.

Subgoal 1:

Variables: SG SL SG' Cond Body S G G2 G1
IH : forall SG SL SG' Cond Body S G G2,
       secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
       eval_s G (while Cond Body) G2 * -> public_equiv SG G G2
Sec : secure SG SL (while Cond Body) SG'
Lev : level SG Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueE
Ev1 : eval_s G Body G1 *
Ev2 : eval_s G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG G1 G2
============================
 public_equiv SG G G2
 < Sec: case Sec.

Subgoal 1:

Variables: SL SG' Cond Body S G G2 G1 L Sl1 SG2
IH : forall SG SL SG' Cond Body S G G2,
       secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
       eval_s G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueE
Ev1 : eval_s G Body G1 *
Ev2 : eval_s G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond L
Sec1 : join L SL Sl1
Sec2 : secure SG' Sl1 Body SG2
============================
 public_equiv SG' G G2
 < EqGG1: apply stmt_not_public_no_public_change to Sec2 _ Ev1.

Subgoal 1.1:

Variables: SL SG' Cond Body S G G2 G1 L Sl1 SG2
IH : forall SG SL SG' Cond Body S G G2,
       secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
       eval_s G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueE
Ev1 : eval_s G Body G1 *
Ev2 : eval_s G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond L
Sec1 : join L SL Sl1
Sec2 : secure SG' Sl1 Body SG2
============================
 Sl1 = public -> false
 < intros Eq.

Subgoal 1.1:

Variables: SL SG' Cond Body S G G2 G1 L Sl1 SG2
IH : forall SG SL SG' Cond Body S G G2,
       secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
       eval_s G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueE
Ev1 : eval_s G Body G1 *
Ev2 : eval_s G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond L
Sec1 : join L SL Sl1
Sec2 : secure SG' Sl1 Body SG2
Eq : Sl1 = public
============================
 false
 < case Eq.

Subgoal 1.1:

Variables: SL SG' Cond Body S G G2 G1 L SG2
IH : forall SG SL SG' Cond Body S G G2,
       secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
       eval_s G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueE
Ev1 : eval_s G Body G1 *
Ev2 : eval_s G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond L
Sec1 : join L SL public
Sec2 : secure SG' public Body SG2
============================
 false
 < apply join_public to Sec1.

Subgoal 1.1:

Variables: SG' Cond Body S G G2 G1 SG2
IH : forall SG SL SG' Cond Body S G G2,
       secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
       eval_s G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueE
Ev1 : eval_s G Body G1 *
Ev2 : eval_s G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond public
Sec1 : join public public public
Sec2 : secure SG' public Body SG2
============================
 false
 < apply level_unique to Lev Sec.

Subgoal 1.1:

Variables: SG' Cond Body G G2 G1 SG2
IH : forall SG SL SG' Cond Body S G G2,
       secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
       eval_s G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond public
NEq : public = public -> false
Ev : eval_e G Cond trueE
Ev1 : eval_s G Body G1 *
Ev2 : eval_s G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond public
Sec1 : join public public public
Sec2 : secure SG' public Body SG2
============================
 false
 < backchain NEq.

Subgoal 1:

Variables: SL SG' Cond Body S G G2 G1 L Sl1 SG2
IH : forall SG SL SG' Cond Body S G G2,
       secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
       eval_s G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueE
Ev1 : eval_s G Body G1 *
Ev2 : eval_s G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond L
Sec1 : join L SL Sl1
Sec2 : secure SG' Sl1 Body SG2
EqGG1 : public_equiv SG' G G1
============================
 public_equiv SG' G G2
 < apply public_equiv_trans to EqGG1 EqG1G2.

Subgoal 1:

Variables: SL SG' Cond Body S G G2 G1 L Sl1 SG2
IH : forall SG SL SG' Cond Body S G G2,
       secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
       eval_s G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueE
Ev1 : eval_s G Body G1 *
Ev2 : eval_s G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond L
Sec1 : join L SL Sl1
Sec2 : secure SG' Sl1 Body SG2
EqGG1 : public_equiv SG' G G1
H1 : public_equiv SG' G G2
============================
 public_equiv SG' G G2
 < search.

Subgoal 2:

Variables: SG SL SG' Cond Body S G2
IH : forall SG SL SG' Cond Body S G G2,
       secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
       eval_s G (while Cond Body) G2 * -> public_equiv SG G G2
Sec : secure SG SL (while Cond Body) SG'
Lev : level SG Cond S
NEq : S = public -> false
Ev : eval_e G2 Cond falseE
============================
 public_equiv SG G2 G2
 < backchain public_equiv_refl.

Proof completed.
 < Extensible_Theorem
      stmt_secure : forall S SG SL SG1 GA GA' GB GB',
         Is : is_s S ->
         Sec : secure SG SL S SG1 ->
         Rel : public_equiv SG GA GB ->
         EvA : eval_s GA S GA' ->
         EvB : eval_s GB S GB' ->
         public_equiv SG1 GA' GB'
      on EvA.

Subgoal 1:

Variables: SG SL SG1 GA' GB GB'
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s skipS
Sec : secure SG SL skipS SG1
Rel : public_equiv SG GA' GB
EvA : eval_s GA' skipS GA' @
EvB : eval_s GB skipS GB'
============================
 public_equiv SG1 GA' GB'
 < case EvB.

Subgoal 1:

Variables: SG SL SG1 GA' GB'
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s skipS
Sec : secure SG SL skipS SG1
Rel : public_equiv SG GA' GB'
EvA : eval_s GA' skipS GA' @
============================
 public_equiv SG1 GA' GB'
 < case Sec.

Subgoal 1:

Variables: SL SG1 GA' GB'
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s skipS
Rel : public_equiv SG1 GA' GB'
EvA : eval_s GA' skipS GA' @
============================
 public_equiv SG1 GA' GB'
 < search.

Subgoal 2:

Variables: SG SL SG1 GA GB GB' V N E Ty
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (decl N Ty E)
Sec : secure SG SL (decl N Ty E) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl N Ty E) ((N, V)::GA) @
EvB : eval_s GB (decl N Ty E) GB'
EvA1 : eval_e GA E V
============================
 public_equiv SG1 ((N, V)::GA) GB'
 < EvB: case EvB.

Subgoal 2:

Variables: SG SL SG1 GA GB V N E Ty V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (decl N Ty E)
Sec : secure SG SL (decl N Ty E) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl N Ty E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
============================
 public_equiv SG1 ((N, V)::GA) ((N, V1)::GB)
 < Sec: case Sec.

Subgoal 2:

Variables: SG GA GB V N E Ty V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (decl N Ty E)
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl N Ty E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
============================
 public_equiv ((N, public)::SG) ((N, V)::GA) ((N, V1)::GB)
 < Is: case Is.

Subgoal 2:

Variables: SG GA GB V N E Ty V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl N Ty E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
Is : is_string N
Is1 : is_ty Ty
Is2 : is_e E
============================
 public_equiv ((N, public)::SG) ((N, V)::GA) ((N, V1)::GB)
 < apply level_secure to _ _ Rel EvA1 EvB.

Subgoal 2:

Variables: SG GA GB N E Ty V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
Is : is_string N
Is1 : is_ty Ty
Is2 : is_e E
============================
 public_equiv ((N, public)::SG) ((N, V1)::GA) ((N, V1)::GB)
 < unfold .

Subgoal 2.1:

Variables: SG GA GB N E Ty V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
Is : is_string N
Is1 : is_ty Ty
Is2 : is_e E
============================
 forall X V,
   lookup ((N, public)::SG) X public -> lookup ((N, V1)::GA) X V -> lookup ((N, V1)::GB) X V
 < intros LkpSec LkpA.

Subgoal 2.1:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
Is : is_string N
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : lookup ((N, public)::SG) X public
LkpA : lookup ((N, V1)::GA) X V2
============================
 lookup ((N, V1)::GB) X V2
 < LkpSec: case LkpSec.

Subgoal 2.1.1:

Variables: SG GA GB E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl X Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG X
Is : is_string X
Is1 : is_ty Ty
Is2 : is_e E
LkpA : lookup ((X, V1)::GA) X V2
============================
 lookup ((X, V1)::GB) X V2
 < LkpA: case LkpA.

Subgoal 2.1.1.1:

Variables: SG GA GB E Ty X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl X Ty E) ((X, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Sec : level SG E public
Sec1 : no_lookup SG X
Is : is_string X
Is1 : is_ty Ty
Is2 : is_e E
============================
 lookup ((X, V2)::GB) X V2
 < search.

Subgoal 2.1.1.2:

Variables: SG GA GB E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl X Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG X
Is : is_string X
Is1 : is_ty Ty
Is2 : is_e E
LkpA : X = X -> false
LkpA1 : lookup GA X V2
============================
 lookup ((X, V1)::GB) X V2
 < apply LkpA to _.

Subgoal 2.1.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
Is : is_string N
Is1 : is_ty Ty
Is2 : is_e E
LkpA : lookup ((N, V1)::GA) X V2
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
============================
 lookup ((N, V1)::GB) X V2
 < LkpA: case LkpA.

Subgoal 2.1.2.1:

Variables: SG GA GB E Ty X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl X Ty E) ((X, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Sec : level SG E public
Sec1 : no_lookup SG X
Is : is_string X
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : X = X -> false
LkpSec1 : lookup SG X public
============================
 lookup ((X, V2)::GB) X V2
 < apply LkpSec to _.

Subgoal 2.1.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
Is : is_string N
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
LkpA : N = X -> false
LkpA1 : lookup GA X V2
============================
 lookup ((N, V1)::GB) X V2
 < Rel: case Rel.

Subgoal 2.1.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
Is : is_string N
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
LkpA : N = X -> false
LkpA1 : lookup GA X V2
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
 lookup ((N, V1)::GB) X V2
 < apply Rel to LkpSec1 LkpA1.

Subgoal 2.1.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
Is : is_string N
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
LkpA : N = X -> false
LkpA1 : lookup GA X V2
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
H1 : lookup GB X V2
============================
 lookup ((N, V1)::GB) X V2
 < search.

Subgoal 2.2:

Variables: SG GA GB N E Ty V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
Is : is_string N
Is1 : is_ty Ty
Is2 : is_e E
============================
 forall X V,
   lookup ((N, public)::SG) X public -> lookup ((N, V1)::GB) X V -> lookup ((N, V1)::GA) X V
 < intros LkpSec LkpB.

Subgoal 2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
Is : is_string N
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : lookup ((N, public)::SG) X public
LkpB : lookup ((N, V1)::GB) X V2
============================
 lookup ((N, V1)::GA) X V2
 < LkpSec: case LkpSec.

Subgoal 2.2.1:

Variables: SG GA GB E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl X Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG X
Is : is_string X
Is1 : is_ty Ty
Is2 : is_e E
LkpB : lookup ((X, V1)::GB) X V2
============================
 lookup ((X, V1)::GA) X V2
 < LkpB: case LkpB.

Subgoal 2.2.1.1:

Variables: SG GA GB E Ty X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl X Ty E) ((X, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Sec : level SG E public
Sec1 : no_lookup SG X
Is : is_string X
Is1 : is_ty Ty
Is2 : is_e E
============================
 lookup ((X, V2)::GA) X V2
 < search.

Subgoal 2.2.1.2:

Variables: SG GA GB E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl X Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG X
Is : is_string X
Is1 : is_ty Ty
Is2 : is_e E
LkpB : X = X -> false
LkpB1 : lookup GB X V2
============================
 lookup ((X, V1)::GA) X V2
 < apply LkpB to _.

Subgoal 2.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
Is : is_string N
Is1 : is_ty Ty
Is2 : is_e E
LkpB : lookup ((N, V1)::GB) X V2
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
============================
 lookup ((N, V1)::GA) X V2
 < LkpB: case LkpB.

Subgoal 2.2.2.1:

Variables: SG GA GB E Ty X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl X Ty E) ((X, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Sec : level SG E public
Sec1 : no_lookup SG X
Is : is_string X
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : X = X -> false
LkpSec1 : lookup SG X public
============================
 lookup ((X, V2)::GA) X V2
 < apply LkpSec to _.

Subgoal 2.2.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
Is : is_string N
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
LkpB : N = X -> false
LkpB1 : lookup GB X V2
============================
 lookup ((N, V1)::GA) X V2
 < Rel: case Rel.

Subgoal 2.2.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
Is : is_string N
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
LkpB : N = X -> false
LkpB1 : lookup GB X V2
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
 lookup ((N, V1)::GA) X V2
 < apply Rel1 to LkpSec1 LkpB1.

Subgoal 2.2.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG N
Is : is_string N
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
LkpB : N = X -> false
LkpB1 : lookup GB X V2
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
H1 : lookup GA X V2
============================
 lookup ((N, V1)::GA) X V2
 < search.

Subgoal 3:

Variables: SG SL SG1 GA GB GB' VOld NewG V N E
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (assign N E)
Sec : secure SG SL (assign N E) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvB : eval_s GB (assign N E) GB'
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
============================
 public_equiv SG1 ((N, V)::NewG) GB'
 < EvB: case EvB.

Subgoal 3:

Variables: SG SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (assign N E)
Sec : secure SG SL (assign N E) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
============================
 public_equiv SG1 ((N, V)::NewG) ((N, V1)::NewG1)
 < Is: case Is.

Subgoal 3:

Variables: SG SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Sec : secure SG SL (assign N E) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
============================
 public_equiv SG1 ((N, V)::NewG) ((N, V1)::NewG1)
 < Sec: case Sec.

Subgoal 3.1:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
============================
 public_equiv SG1 ((N, V)::NewG) ((N, V1)::NewG1)
 < unfold .

Subgoal 3.1.1:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
============================
 forall X V2,
   lookup SG1 X public -> lookup ((N, V)::NewG) X V2 -> lookup ((N, V1)::NewG1) X V2
 < intros LkpSec LkpA.

Subgoal 3.1.1:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpA : lookup ((N, V)::NewG) X V2
============================
 lookup ((N, V1)::NewG1) X V2
 < LkpA: case LkpA.

Subgoal 3.1.1.1:

Variables: SL SG1 GA GB VOld NewG E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign X E) ((X, V2)::NewG) @
EvA1 : eval_e GA E V2
EvA2 : select (X, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (X, VOld1) NewG1 GB
Is : is_string X
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X public
============================
 lookup ((X, V1)::NewG1) X V2
 < apply lookup_unique to Sec1 LkpSec.

Subgoal 3.1.1.2:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
============================
 lookup ((N, V1)::NewG1) X V2
 < assert X = N -> false.

Subgoal 3.1.1.2.1:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
============================
 X = N -> false
 < intros E.

Subgoal 3.1.1.2.1:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
E : X = N
============================
 false
 < case E.

Subgoal 3.1.1.2.1:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 N public
LkpA : N = N -> false
LkpA1 : lookup NewG N V2
============================
 false
 < backchain LkpA.

Subgoal 3.1.1.2:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
H1 : X = N -> false
============================
 lookup ((N, V1)::NewG1) X V2
 < L: apply lookup_after_select_before to LkpA1 EvA2 _.

Subgoal 3.1.1.2:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
H1 : X = N -> false
L : lookup GA X V2
============================
 lookup ((N, V1)::NewG1) X V2
 < R: case Rel.

Subgoal 3.1.1.2:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
H1 : X = N -> false
L : lookup GA X V2
R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
 lookup ((N, V1)::NewG1) X V2
 < LB: apply R to _ L.

Subgoal 3.1.1.2:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
H1 : X = N -> false
L : lookup GA X V2
R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LB : lookup GB X V2
============================
 lookup ((N, V1)::NewG1) X V2
 < apply select_lookup to LB EvB1 _.

Subgoal 3.1.1.2:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
H1 : X = N -> false
L : lookup GA X V2
R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LB : lookup GB X V2
H2 : lookup NewG1 X V2
============================
 lookup ((N, V1)::NewG1) X V2
 < search.

Subgoal 3.1.2:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
============================
 forall X V2,
   lookup SG1 X public -> lookup ((N, V1)::NewG1) X V2 -> lookup ((N, V)::NewG) X V2
 < intros LkpSec LkpB.

Subgoal 3.1.2:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpB : lookup ((N, V1)::NewG1) X V2
============================
 lookup ((N, V)::NewG) X V2
 < LkpB: case LkpB.

Subgoal 3.1.2.1:

Variables: SL SG1 GA GB VOld NewG V E VOld1 NewG1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign X E) ((X, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (X, VOld) NewG GA
EvB : eval_e GB E V2
EvB1 : select (X, VOld1) NewG1 GB
Is : is_string X
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X public
============================
 lookup ((X, V)::NewG) X V2
 < apply lookup_unique to Sec1 LkpSec.

Subgoal 3.1.2.2:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
============================
 lookup ((N, V)::NewG) X V2
 < assert X = N -> false.

Subgoal 3.1.2.2.1:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
============================
 X = N -> false
 < intros E.

Subgoal 3.1.2.2.1:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
E : X = N
============================
 false
 < case E.

Subgoal 3.1.2.2.1:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 N public
LkpB : N = N -> false
LkpB1 : lookup NewG1 N V2
============================
 false
 < backchain LkpB.

Subgoal 3.1.2.2:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
H1 : X = N -> false
============================
 lookup ((N, V)::NewG) X V2
 < L: apply lookup_after_select_before to LkpB1 EvB1 _.

Subgoal 3.1.2.2:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
H1 : X = N -> false
L : lookup GB X V2
============================
 lookup ((N, V)::NewG) X V2
 < R: case Rel.

Subgoal 3.1.2.2:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
H1 : X = N -> false
L : lookup GB X V2
R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
 lookup ((N, V)::NewG) X V2
 < LA: apply R1 to _ L.

Subgoal 3.1.2.2:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
H1 : X = N -> false
L : lookup GB X V2
R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LA : lookup GA X V2
============================
 lookup ((N, V)::NewG) X V2
 < apply select_lookup to LA EvA2 _.

Subgoal 3.1.2.2:

Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E L
Sec1 : lookup SG1 N private
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
H1 : X = N -> false
L : lookup GB X V2
R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LA : lookup GA X V2
H2 : lookup NewG X V2
============================
 lookup ((N, V)::NewG) X V2
 < search.

Subgoal 3.2:

Variables: SG1 GA GB VOld NewG V N E VOld1 NewG1 V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V)::NewG) @
EvA1 : eval_e GA E V
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
============================
 public_equiv SG1 ((N, V)::NewG) ((N, V1)::NewG1)
 < apply level_secure to _ Sec Rel EvA1 EvB.

Subgoal 3.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
============================
 public_equiv SG1 ((N, V1)::NewG) ((N, V1)::NewG1)
 < unfold .

Subgoal 3.2.1:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
============================
 forall X V,
   lookup SG1 X public -> lookup ((N, V1)::NewG) X V -> lookup ((N, V1)::NewG1) X V
 < intros LkpSec LkpA.

Subgoal 3.2.1:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpA : lookup ((N, V1)::NewG) X V2
============================
 lookup ((N, V1)::NewG1) X V2
 < LkpA: case LkpA.

Subgoal 3.2.1.1:

Variables: SG1 GA GB VOld NewG E VOld1 NewG1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign X E) ((X, V2)::NewG) @
EvA1 : eval_e GA E V2
EvA2 : select (X, VOld) NewG GA
EvB : eval_e GB E V2
EvB1 : select (X, VOld1) NewG1 GB
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X public
============================
 lookup ((X, V2)::NewG1) X V2
 < search.

Subgoal 3.2.1.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
============================
 lookup ((N, V1)::NewG1) X V2
 < assert X = N -> false.

Subgoal 3.2.1.2.1:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
============================
 X = N -> false
 < intros E.

Subgoal 3.2.1.2.1:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
E : X = N
============================
 false
 < case E.

Subgoal 3.2.1.2.1:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 N public
LkpA : N = N -> false
LkpA1 : lookup NewG N V2
============================
 false
 < backchain LkpA.

Subgoal 3.2.1.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
H1 : X = N -> false
============================
 lookup ((N, V1)::NewG1) X V2
 < LGA: apply lookup_after_select_before to LkpA1 EvA2 _.

Subgoal 3.2.1.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
H1 : X = N -> false
LGA : lookup GA X V2
============================
 lookup ((N, V1)::NewG1) X V2
 < R: case Rel.

Subgoal 3.2.1.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
H1 : X = N -> false
LGA : lookup GA X V2
R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
 lookup ((N, V1)::NewG1) X V2
 < LGB: apply R to LkpSec LGA.

Subgoal 3.2.1.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
H1 : X = N -> false
LGA : lookup GA X V2
R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LGB : lookup GB X V2
============================
 lookup ((N, V1)::NewG1) X V2
 < apply select_lookup to LGB EvB1 _.

Subgoal 3.2.1.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpA : N = X -> false
LkpA1 : lookup NewG X V2
H1 : X = N -> false
LGA : lookup GA X V2
R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LGB : lookup GB X V2
H2 : lookup NewG1 X V2
============================
 lookup ((N, V1)::NewG1) X V2
 < search.

Subgoal 3.2.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
============================
 forall X V,
   lookup SG1 X public -> lookup ((N, V1)::NewG1) X V -> lookup ((N, V1)::NewG) X V
 < intros LkpSec LkpB.

Subgoal 3.2.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpB : lookup ((N, V1)::NewG1) X V2
============================
 lookup ((N, V1)::NewG) X V2
 < LkpB: case LkpB.

Subgoal 3.2.2.1:

Variables: SG1 GA GB VOld NewG E VOld1 NewG1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign X E) ((X, V2)::NewG) @
EvA1 : eval_e GA E V2
EvA2 : select (X, VOld) NewG GA
EvB : eval_e GB E V2
EvB1 : select (X, VOld1) NewG1 GB
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X public
============================
 lookup ((X, V2)::NewG) X V2
 < search.

Subgoal 3.2.2.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
============================
 lookup ((N, V1)::NewG) X V2
 < assert X = N -> false.

Subgoal 3.2.2.2.1:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
============================
 X = N -> false
 < intros E.

Subgoal 3.2.2.2.1:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
E : X = N
============================
 false
 < case E.

Subgoal 3.2.2.2.1:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 N public
LkpB : N = N -> false
LkpB1 : lookup NewG1 N V2
============================
 false
 < backchain LkpB.

Subgoal 3.2.2.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
H1 : X = N -> false
============================
 lookup ((N, V1)::NewG) X V2
 < LGB: apply lookup_after_select_before to LkpB1 EvB1 _.

Subgoal 3.2.2.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
H1 : X = N -> false
LGB : lookup GB X V2
============================
 lookup ((N, V1)::NewG) X V2
 < R: case Rel.

Subgoal 3.2.2.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
H1 : X = N -> false
LGB : lookup GB X V2
R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
 lookup ((N, V1)::NewG) X V2
 < LGA: apply R1 to LkpSec LGB.

Subgoal 3.2.2.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
H1 : X = N -> false
LGB : lookup GB X V2
R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LGA : lookup GA X V2
============================
 lookup ((N, V1)::NewG) X V2
 < apply select_lookup to LGA EvA2 _.

Subgoal 3.2.2.2:

Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (assign N E) ((N, V1)::NewG) @
EvA1 : eval_e GA E V1
EvA2 : select (N, VOld) NewG GA
EvB : eval_e GB E V1
EvB1 : select (N, VOld1) NewG1 GB
Is : is_string N
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 N public
LkpSec : lookup SG1 X public
LkpB : N = X -> false
LkpB1 : lookup NewG1 X V2
H1 : X = N -> false
LGB : lookup GB X V2
R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LGA : lookup GA X V2
H2 : lookup NewG X V2
============================
 lookup ((N, V1)::NewG) X V2
 < search.

Subgoal 4:

Variables: SG SL SG1 GA GA' GB GB' G1 S2 S1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (seq S1 S2)
Sec : secure SG SL (seq S1 S2) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (seq S1 S2) GA' @
EvB : eval_s GB (seq S1 S2) GB'
EvA1 : eval_s GA S1 G1 *
EvA2 : eval_s G1 S2 GA' *
============================
 public_equiv SG1 GA' GB'
 < EvB: case EvB.

Subgoal 4:

Variables: SG SL SG1 GA GA' GB GB' G1 S2 S1 G2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (seq S1 S2)
Sec : secure SG SL (seq S1 S2) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (seq S1 S2) GA' @
EvA1 : eval_s GA S1 G1 *
EvA2 : eval_s G1 S2 GA' *
EvB : eval_s GB S1 G2
EvB1 : eval_s G2 S2 GB'
============================
 public_equiv SG1 GA' GB'
 < Sec: case Sec.

Subgoal 4:

Variables: SG SL SG1 GA GA' GB GB' G1 S2 S1 G2 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (seq S1 S2)
Rel : public_equiv SG GA GB
EvA : eval_s GA (seq S1 S2) GA' @
EvA1 : eval_s GA S1 G1 *
EvA2 : eval_s G1 S2 GA' *
EvB : eval_s GB S1 G2
EvB1 : eval_s G2 S2 GB'
Sec : secure SG SL S1 SG2
Sec1 : secure SG2 SL S2 SG1
============================
 public_equiv SG1 GA' GB'
 < Is: case Is.

Subgoal 4:

Variables: SG SL SG1 GA GA' GB GB' G1 S2 S1 G2 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (seq S1 S2) GA' @
EvA1 : eval_s GA S1 G1 *
EvA2 : eval_s G1 S2 GA' *
EvB : eval_s GB S1 G2
EvB1 : eval_s G2 S2 GB'
Sec : secure SG SL S1 SG2
Sec1 : secure SG2 SL S2 SG1
Is : is_s S1
Is1 : is_s S2
============================
 public_equiv SG1 GA' GB'
 < apply IH to _ _ _ EvA1 EvB.

Subgoal 4:

Variables: SG SL SG1 GA GA' GB GB' G1 S2 S1 G2 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (seq S1 S2) GA' @
EvA1 : eval_s GA S1 G1 *
EvA2 : eval_s G1 S2 GA' *
EvB : eval_s GB S1 G2
EvB1 : eval_s G2 S2 GB'
Sec : secure SG SL S1 SG2
Sec1 : secure SG2 SL S2 SG1
Is : is_s S1
Is1 : is_s S2
H1 : public_equiv SG2 G1 G2
============================
 public_equiv SG1 GA' GB'
 < apply IH to _ _ _ EvA2 EvB1.

Subgoal 4:

Variables: SG SL SG1 GA GA' GB GB' G1 S2 S1 G2 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (seq S1 S2) GA' @
EvA1 : eval_s GA S1 G1 *
EvA2 : eval_s G1 S2 GA' *
EvB : eval_s GB S1 G2
EvB1 : eval_s G2 S2 GB'
Sec : secure SG SL S1 SG2
Sec1 : secure SG2 SL S2 SG1
Is : is_s S1
Is1 : is_s S2
H1 : public_equiv SG2 G1 G2
H2 : public_equiv SG1 GA' GB'
============================
 public_equiv SG1 GA' GB'
 < search.

Subgoal 5:

Variables: SG SL SG1 GA GA' GB GB' S2 S1 E
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (ifte E S1 S2)
Sec : secure SG SL (ifte E S1 S2) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvB : eval_s GB (ifte E S1 S2) GB'
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
============================
 public_equiv SG1 GA' GB'
 < Is: case Is.

Subgoal 5:

Variables: SG SL SG1 GA GA' GB GB' S2 S1 E
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Sec : secure SG SL (ifte E S1 S2) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvB : eval_s GB (ifte E S1 S2) GB'
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
============================
 public_equiv SG1 GA' GB'
 < Sec: case Sec.

Subgoal 5:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvB : eval_s GB (ifte E S1 S2) GB'
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
============================
 public_equiv SG1 GA' GB'
 < EvB: case EvB.

Subgoal 5.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
============================
 public_equiv SG1 GA' GB'
 < EqGA'GB': apply IH to _ _ _ EvA2 EvB1.

Subgoal 5.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
EqGA'GB' : public_equiv SG2 GA' GB'
============================
 public_equiv SG1 GA' GB'
 < LkpEq: assert forall X,
     lookup SG1 X public -> lookup SG2 X public.

Subgoal 5.1.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
EqGA'GB' : public_equiv SG2 GA' GB'
============================
 forall X, lookup SG1 X public -> lookup SG2 X public
 < intros Lkp.

Subgoal 5.1.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 X
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
EqGA'GB' : public_equiv SG2 GA' GB'
Lkp : lookup SG1 X public
============================
 lookup SG2 X public
 < apply stmt_public_branch to Sec2 Lkp.

Subgoal 5.1.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 X
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
EqGA'GB' : public_equiv SG2 GA' GB'
Lkp : lookup SG1 X public
H1 : lookup SG2 X public
============================
 lookup SG2 X public
 < search.

Subgoal 5.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
EqGA'GB' : public_equiv SG2 GA' GB'
LkpEq : forall X, lookup SG1 X public -> lookup SG2 X public
============================
 public_equiv SG1 GA' GB'
 < apply public_equiv_swap to LkpEq EqGA'GB'.

Subgoal 5.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
EqGA'GB' : public_equiv SG2 GA' GB'
LkpEq : forall X, lookup SG1 X public -> lookup SG2 X public
H1 : public_equiv SG1 GA' GB'
============================
 public_equiv SG1 GA' GB'
 < search.

Subgoal 5.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
============================
 public_equiv SG1 GA' GB'
 < NEq: assert L = public -> false.

Subgoal 5.2.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
============================
 L = public -> false
 < intros E.

Subgoal 5.2.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
E : L = public
============================
 false
 < case E.

Subgoal 5.2.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E public
Sec1 : join public SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
============================
 false
 < apply level_not_public to Is _ Sec EvA1 EvB _.

Subgoal 5.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : L = public -> false
============================
 public_equiv SG1 GA' GB'
 < EqGAGA': apply stmt_not_public_no_public_change to Sec2 _ EvA2.

Subgoal 5.2.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : L = public -> false
============================
 Sl1 = public -> false
 < intros E.

Subgoal 5.2.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : L = public -> false
E : Sl1 = public
============================
 false
 < case E.

Subgoal 5.2.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL public
Sec2 : secure SG1 public S1 SG2
Sec3 : secure SG1 public S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : L = public -> false
============================
 false
 < apply join_public to Sec1.

Subgoal 5.2.2:

Variables: SG1 GA GA' GB GB' S2 S1 E SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E public
Sec1 : join public public public
Sec2 : secure SG1 public S1 SG2
Sec3 : secure SG1 public S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : public = public -> false
============================
 false
 < backchain NEq.

Subgoal 5.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
============================
 public_equiv SG1 GA' GB'
 < EqGBGB': apply stmt_not_public_no_public_change to Sec3 _ EvB1.

Subgoal 5.2.3:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
============================
 Sl1 = public -> false
 < intros E.

Subgoal 5.2.3:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
E : Sl1 = public
============================
 false
 < case E.

Subgoal 5.2.3:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL public
Sec2 : secure SG1 public S1 SG2
Sec3 : secure SG1 public S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
============================
 false
 < apply join_public to Sec1.

Subgoal 5.2.3:

Variables: SG1 GA GA' GB GB' S2 S1 E SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E public
Sec1 : join public public public
Sec2 : secure SG1 public S1 SG2
Sec3 : secure SG1 public S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : public = public -> false
EqGAGA' : public_equiv SG1 GA GA'
============================
 false
 < backchain NEq.

Subgoal 5.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
EqGBGB' : public_equiv SG1 GB GB'
============================
 public_equiv SG1 GA' GB'
 < EqGAGB': apply public_equiv_trans to Rel EqGBGB'.

Subgoal 5.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
EqGBGB' : public_equiv SG1 GB GB'
EqGAGB' : public_equiv SG1 GA GB'
============================
 public_equiv SG1 GA' GB'
 < EqGA'GA: apply public_equiv_symm to EqGAGA'.

Subgoal 5.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
EqGBGB' : public_equiv SG1 GB GB'
EqGAGB' : public_equiv SG1 GA GB'
EqGA'GA : public_equiv SG1 GA' GA
============================
 public_equiv SG1 GA' GB'
 < EqGA'GB: apply public_equiv_trans to EqGA'GA Rel.

Subgoal 5.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
EqGBGB' : public_equiv SG1 GB GB'
EqGAGB' : public_equiv SG1 GA GB'
EqGA'GA : public_equiv SG1 GA' GA
EqGA'GB : public_equiv SG1 GA' GB
============================
 public_equiv SG1 GA' GB'
 < apply public_equiv_trans to EqGA'GB EqGBGB'.

Subgoal 5.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
EqGBGB' : public_equiv SG1 GB GB'
EqGAGB' : public_equiv SG1 GA GB'
EqGA'GA : public_equiv SG1 GA' GA
EqGA'GB : public_equiv SG1 GA' GB
H1 : public_equiv SG1 GA' GB'
============================
 public_equiv SG1 GA' GB'
 < search.

Subgoal 6:

Variables: SG SL SG1 GA GA' GB GB' S2 S1 E
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (ifte E S1 S2)
Sec : secure SG SL (ifte E S1 S2) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvB : eval_s GB (ifte E S1 S2) GB'
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
============================
 public_equiv SG1 GA' GB'
 < Is: case Is.

Subgoal 6:

Variables: SG SL SG1 GA GA' GB GB' S2 S1 E
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Sec : secure SG SL (ifte E S1 S2) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvB : eval_s GB (ifte E S1 S2) GB'
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
============================
 public_equiv SG1 GA' GB'
 < Sec: case Sec.

Subgoal 6:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvB : eval_s GB (ifte E S1 S2) GB'
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
============================
 public_equiv SG1 GA' GB'
 < EvB: case EvB.

Subgoal 6.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
============================
 public_equiv SG1 GA' GB'
 < NEq: assert L = public -> false.

Subgoal 6.1.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
============================
 L = public -> false
 < intros E.

Subgoal 6.1.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
E : L = public
============================
 false
 < case E.

Subgoal 6.1.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E public
Sec1 : join public SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
============================
 false
 < apply level_not_public to Is _ _ EvA1 EvB _.

Subgoal 6.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : L = public -> false
============================
 public_equiv SG1 GA' GB'
 < EqGAGA': apply stmt_not_public_no_public_change to Sec3 _ EvA2.

Subgoal 6.1.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : L = public -> false
============================
 Sl1 = public -> false
 < intros E.

Subgoal 6.1.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : L = public -> false
E : Sl1 = public
============================
 false
 < case E.

Subgoal 6.1.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL public
Sec2 : secure SG1 public S1 SG2
Sec3 : secure SG1 public S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : L = public -> false
============================
 false
 < apply join_public to Sec1.

Subgoal 6.1.2:

Variables: SG1 GA GA' GB GB' S2 S1 E SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E public
Sec1 : join public public public
Sec2 : secure SG1 public S1 SG2
Sec3 : secure SG1 public S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : public = public -> false
============================
 false
 < backchain NEq.

Subgoal 6.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
============================
 public_equiv SG1 GA' GB'
 < EqGBGB': apply stmt_not_public_no_public_change to Sec2 _ EvB1.

Subgoal 6.1.3:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
============================
 Sl1 = public -> false
 < intros E.

Subgoal 6.1.3:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
E : Sl1 = public
============================
 false
 < case E.

Subgoal 6.1.3:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL public
Sec2 : secure SG1 public S1 SG2
Sec3 : secure SG1 public S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
============================
 false
 < apply join_public to Sec1.

Subgoal 6.1.3:

Variables: SG1 GA GA' GB GB' S2 S1 E SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E public
Sec1 : join public public public
Sec2 : secure SG1 public S1 SG2
Sec3 : secure SG1 public S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : public = public -> false
EqGAGA' : public_equiv SG1 GA GA'
============================
 false
 < backchain NEq.

Subgoal 6.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
EqGBGB' : public_equiv SG1 GB GB'
============================
 public_equiv SG1 GA' GB'
 < EqGAGB': apply public_equiv_trans to Rel EqGBGB'.

Subgoal 6.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
EqGBGB' : public_equiv SG1 GB GB'
EqGAGB' : public_equiv SG1 GA GB'
============================
 public_equiv SG1 GA' GB'
 < EqGA'GA: apply public_equiv_symm to EqGAGA'.

Subgoal 6.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
EqGBGB' : public_equiv SG1 GB GB'
EqGAGB' : public_equiv SG1 GA GB'
EqGA'GA : public_equiv SG1 GA' GA
============================
 public_equiv SG1 GA' GB'
 < EqGA'GB: apply public_equiv_trans to EqGA'GA Rel.

Subgoal 6.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
EqGBGB' : public_equiv SG1 GB GB'
EqGAGB' : public_equiv SG1 GA GB'
EqGA'GA : public_equiv SG1 GA' GA
EqGA'GB : public_equiv SG1 GA' GB
============================
 public_equiv SG1 GA' GB'
 < apply public_equiv_trans to EqGA'GB EqGBGB'.

Subgoal 6.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 GB'
NEq : L = public -> false
EqGAGA' : public_equiv SG1 GA GA'
EqGBGB' : public_equiv SG1 GB GB'
EqGAGB' : public_equiv SG1 GA GB'
EqGA'GA : public_equiv SG1 GA' GA
EqGA'GB : public_equiv SG1 GA' GB
H1 : public_equiv SG1 GA' GB'
============================
 public_equiv SG1 GA' GB'
 < search.

Subgoal 6.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
============================
 public_equiv SG1 GA' GB'
 < EqGA'GB': apply IH to _ _ _ EvA2 EvB1.

Subgoal 6.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
EqGA'GB' : public_equiv SG3 GA' GB'
============================
 public_equiv SG1 GA' GB'
 < LkpEq: assert forall X,
     lookup SG1 X public -> lookup SG3 X public.

Subgoal 6.2.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
EqGA'GB' : public_equiv SG3 GA' GB'
============================
 forall X, lookup SG1 X public -> lookup SG3 X public
 < intros Lkp.

Subgoal 6.2.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 X
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
EqGA'GB' : public_equiv SG3 GA' GB'
Lkp : lookup SG1 X public
============================
 lookup SG3 X public
 < apply stmt_public_branch to Sec3 Lkp.

Subgoal 6.2.1:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 X
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
EqGA'GB' : public_equiv SG3 GA' GB'
Lkp : lookup SG1 X public
H1 : lookup SG3 X public
============================
 lookup SG3 X public
 < search.

Subgoal 6.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
EqGA'GB' : public_equiv SG3 GA' GB'
LkpEq : forall X, lookup SG1 X public -> lookup SG3 X public
============================
 public_equiv SG1 GA' GB'
 < apply public_equiv_swap to LkpEq EqGA'GB'.

Subgoal 6.2:

Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (ifte E S1 S2) GA' @
EvA1 : eval_e GA E falseE
EvA2 : eval_s GA S2 GA' *
Is : is_e E
Is1 : is_s S1
Is2 : is_s S2
Sec : level SG1 E L
Sec1 : join L SL Sl1
Sec2 : secure SG1 Sl1 S1 SG2
Sec3 : secure SG1 Sl1 S2 SG3
EvB : eval_e GB E falseE
EvB1 : eval_s GB S2 GB'
EqGA'GB' : public_equiv SG3 GA' GB'
LkpEq : forall X, lookup SG1 X public -> lookup SG3 X public
H1 : public_equiv SG1 GA' GB'
============================
 public_equiv SG1 GA' GB'
 < search.

Subgoal 7:

Variables: SG SL SG1 GA GA' GB GB' G1 S1 E
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG SL (while E S1) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (while E S1) GA' @
EvB : eval_s GB (while E S1) GB'
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
============================
 public_equiv SG1 GA' GB'
 < Is: case Is (keep).

Subgoal 7:

Variables: SG SL SG1 GA GA' GB GB' G1 S1 E
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG SL (while E S1) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (while E S1) GA' @
EvB : eval_s GB (while E S1) GB'
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
============================
 public_equiv SG1 GA' GB'
 < Sec: case Sec (keep).

Subgoal 7:

Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (while E S1) GA' @
EvB : eval_s GB (while E S1) GB'
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
============================
 public_equiv SG1 GA' GB'
 < EvB: case EvB.

Subgoal 7.1:

Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G2
EvB2 : eval_s G2 (while E S1) GB'
============================
 public_equiv SG1 GA' GB'
 < EqG1G3: apply IH to _ _ _ EvA2 EvB1.

Subgoal 7.1:

Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G2
EvB2 : eval_s G2 (while E S1) GB'
EqG1G3 : public_equiv SG2 G1 G2
============================
 public_equiv SG1 GA' GB'
 < LEq: assert forall X,
     lookup SG1 X public -> lookup SG2 X public.

Subgoal 7.1.1:

Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G2
EvB2 : eval_s G2 (while E S1) GB'
EqG1G3 : public_equiv SG2 G1 G2
============================
 forall X, lookup SG1 X public -> lookup SG2 X public
 < intros Lkp.

Subgoal 7.1.1:

Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2 X
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G2
EvB2 : eval_s G2 (while E S1) GB'
EqG1G3 : public_equiv SG2 G1 G2
Lkp : lookup SG1 X public
============================
 lookup SG2 X public
 < apply stmt_public_branch to Sec3 Lkp.

Subgoal 7.1.1:

Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2 X
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G2
EvB2 : eval_s G2 (while E S1) GB'
EqG1G3 : public_equiv SG2 G1 G2
Lkp : lookup SG1 X public
H1 : lookup SG2 X public
============================
 lookup SG2 X public
 < search.

Subgoal 7.1:

Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G2
EvB2 : eval_s G2 (while E S1) GB'
EqG1G3 : public_equiv SG2 G1 G2
LEq : forall X, lookup SG1 X public -> lookup SG2 X public
============================
 public_equiv SG1 GA' GB'
 < apply public_equiv_swap to LEq EqG1G3.

Subgoal 7.1:

Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G2
EvB2 : eval_s G2 (while E S1) GB'
EqG1G3 : public_equiv SG2 G1 G2
LEq : forall X, lookup SG1 X public -> lookup SG2 X public
H1 : public_equiv SG1 G1 G2
============================
 public_equiv SG1 GA' GB'
 < EqG1GA': apply IH to Is Sec _ EvA3 EvB2.

Subgoal 7.1:

Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G2
EvB2 : eval_s G2 (while E S1) GB'
EqG1G3 : public_equiv SG2 G1 G2
LEq : forall X, lookup SG1 X public -> lookup SG2 X public
H1 : public_equiv SG1 G1 G2
EqG1GA' : public_equiv SG1 GA' GB'
============================
 public_equiv SG1 GA' GB'
 < search.

Subgoal 7.2:

Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB' E falseE
============================
 public_equiv SG1 GA' GB'
 < SNEq: assert L = public -> false.

Subgoal 7.2.1:

Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB' E falseE
============================
 L = public -> false
 < intros E.

Subgoal 7.2.1:

Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB' E falseE
E : L = public
============================
 false
 < case E.

Subgoal 7.2.1:

Variables: SL SG1 GA GA' GB' G1 S1 E Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E public
Sec2 : join public SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB' E falseE
============================
 false
 < apply level_not_public to Is1 _ _ EvA1 EvB _.

Subgoal 7.2:

Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB' E falseE
SNEq : L = public -> false
============================
 public_equiv SG1 GA' GB'
 < EqGAG1: apply stmt_not_public_no_public_change to Sec3 _ EvA2.

Subgoal 7.2.2:

Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB' E falseE
SNEq : L = public -> false
============================
 Sl1 = public -> false
 < intros E.

Subgoal 7.2.2:

Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB' E falseE
SNEq : L = public -> false
E : Sl1 = public
============================
 false
 < case E.

Subgoal 7.2.2:

Variables: SL SG1 GA GA' GB' G1 S1 E L SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL public
Sec3 : secure SG1 public S1 SG2
EvB : eval_e GB' E falseE
SNEq : L = public -> false
============================
 false
 < apply join_public to Sec2.

Subgoal 7.2.2:

Variables: SG1 GA GA' GB' G1 S1 E SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 public (while E S1) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E public
Sec2 : join public public public
Sec3 : secure SG1 public S1 SG2
EvB : eval_e GB' E falseE
SNEq : public = public -> false
============================
 false
 < backchain SNEq.

Subgoal 7.2:

Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB' E falseE
SNEq : L = public -> false
EqGAG1 : public_equiv SG1 GA G1
============================
 public_equiv SG1 GA' GB'
 < EqG1GA': apply while_no_public_change to Sec Sec1 _ EvA3.

Subgoal 7.2:

Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB' E falseE
SNEq : L = public -> false
EqGAG1 : public_equiv SG1 GA G1
EqG1GA' : public_equiv SG1 G1 GA'
============================
 public_equiv SG1 GA' GB'
 < EqGAGA': apply public_equiv_trans to EqGAG1 EqG1GA'.

Subgoal 7.2:

Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB' E falseE
SNEq : L = public -> false
EqGAG1 : public_equiv SG1 GA G1
EqG1GA' : public_equiv SG1 G1 GA'
EqGAGA' : public_equiv SG1 GA GA'
============================
 public_equiv SG1 GA' GB'
 < EqGA'GA: apply public_equiv_symm to EqGAGA'.

Subgoal 7.2:

Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB' E falseE
SNEq : L = public -> false
EqGAG1 : public_equiv SG1 GA G1
EqG1GA' : public_equiv SG1 G1 GA'
EqGAGA' : public_equiv SG1 GA GA'
EqGA'GA : public_equiv SG1 GA' GA
============================
 public_equiv SG1 GA' GB'
 < apply public_equiv_trans to EqGA'GA Rel.

Subgoal 7.2:

Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_s GA (while E S1) GA' @
EvA1 : eval_e GA E trueE
EvA2 : eval_s GA S1 G1 *
EvA3 : eval_s G1 (while E S1) GA' *
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB' E falseE
SNEq : L = public -> false
EqGAG1 : public_equiv SG1 GA G1
EqG1GA' : public_equiv SG1 G1 GA'
EqGAGA' : public_equiv SG1 GA GA'
EqGA'GA : public_equiv SG1 GA' GA
H1 : public_equiv SG1 GA' GB'
============================
 public_equiv SG1 GA' GB'
 < search.

Subgoal 8:

Variables: SG SL SG1 GA' GB GB' S1 E
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG SL (while E S1) SG1
Rel : public_equiv SG GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvB : eval_s GB (while E S1) GB'
EvA1 : eval_e GA' E falseE
============================
 public_equiv SG1 GA' GB'
 < Is: case Is (keep).

Subgoal 8:

Variables: SG SL SG1 GA' GB GB' S1 E
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG SL (while E S1) SG1
Rel : public_equiv SG GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvB : eval_s GB (while E S1) GB'
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
============================
 public_equiv SG1 GA' GB'
 < Sec: case Sec (keep).

Subgoal 8:

Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvB : eval_s GB (while E S1) GB'
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
============================
 public_equiv SG1 GA' GB'
 < EvB: case EvB.

Subgoal 8.1:

Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G1
EvB2 : eval_s G1 (while E S1) GB'
============================
 public_equiv SG1 GA' GB'
 < SNEq: assert L = public -> false.

Subgoal 8.1.1:

Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G1
EvB2 : eval_s G1 (while E S1) GB'
============================
 L = public -> false
 < intros E.

Subgoal 8.1.1:

Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G1
EvB2 : eval_s G1 (while E S1) GB'
E : L = public
============================
 false
 < case E.

Subgoal 8.1.1:

Variables: SL SG1 GA' GB GB' S1 E Sl1 SG2 G1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E public
Sec2 : join public SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G1
EvB2 : eval_s G1 (while E S1) GB'
============================
 false
 < apply level_not_public to Is1 _ _ EvA1 EvB _.

Subgoal 8.1:

Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G1
EvB2 : eval_s G1 (while E S1) GB'
SNEq : L = public -> false
============================
 public_equiv SG1 GA' GB'
 < EqGBG2: apply stmt_not_public_no_public_change to Sec3 _ EvB1.

Subgoal 8.1.2:

Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G1
EvB2 : eval_s G1 (while E S1) GB'
SNEq : L = public -> false
============================
 Sl1 = public -> false
 < intros E.

Subgoal 8.1.2:

Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G1
EvB2 : eval_s G1 (while E S1) GB'
SNEq : L = public -> false
E : Sl1 = public
============================
 false
 < case E.

Subgoal 8.1.2:

Variables: SL SG1 GA' GB GB' S1 E L SG2 G1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL public
Sec3 : secure SG1 public S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G1
EvB2 : eval_s G1 (while E S1) GB'
SNEq : L = public -> false
============================
 false
 < apply join_public to Sec2.

Subgoal 8.1.2:

Variables: SG1 GA' GB GB' S1 E SG2 G1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 public (while E S1) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E public
Sec2 : join public public public
Sec3 : secure SG1 public S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G1
EvB2 : eval_s G1 (while E S1) GB'
SNEq : public = public -> false
============================
 false
 < backchain SNEq.

Subgoal 8.1:

Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G1
EvB2 : eval_s G1 (while E S1) GB'
SNEq : L = public -> false
EqGBG2 : public_equiv SG1 GB G1
============================
 public_equiv SG1 GA' GB'
 < EqGA'G2: apply public_equiv_trans to Rel EqGBG2.

Subgoal 8.1:

Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G1
EvB2 : eval_s G1 (while E S1) GB'
SNEq : L = public -> false
EqGBG2 : public_equiv SG1 GB G1
EqGA'G2 : public_equiv SG1 GA' G1
============================
 public_equiv SG1 GA' GB'
 < EqG2GB': apply while_no_public_change to Sec Sec1 _ EvB2.

Subgoal 8.1:

Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G1
EvB2 : eval_s G1 (while E S1) GB'
SNEq : L = public -> false
EqGBG2 : public_equiv SG1 GB G1
EqGA'G2 : public_equiv SG1 GA' G1
EqG2GB' : public_equiv SG1 G1 GB'
============================
 public_equiv SG1 GA' GB'
 < apply public_equiv_trans to EqGA'G2 EqG2GB'.

Subgoal 8.1:

Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_s GA' (while E S1) GA' @
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB E trueE
EvB1 : eval_s GB S1 G1
EvB2 : eval_s G1 (while E S1) GB'
SNEq : L = public -> false
EqGBG2 : public_equiv SG1 GB G1
EqGA'G2 : public_equiv SG1 GA' G1
EqG2GB' : public_equiv SG1 G1 GB'
H1 : public_equiv SG1 GA' GB'
============================
 public_equiv SG1 GA' GB'
 < search.

Subgoal 8.2:

Variables: SL SG1 GA' GB' S1 E L Sl1 SG2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (while E S1)
Sec : secure SG1 SL (while E S1) SG1
Rel : public_equiv SG1 GA' GB'
EvA : eval_s GA' (while E S1) GA' @
EvA1 : eval_e GA' E falseE
Is1 : is_e E
Is2 : is_s S1
Sec1 : level SG1 E L
Sec2 : join L SL Sl1
Sec3 : secure SG1 Sl1 S1 SG2
EvB : eval_e GB' E falseE
============================
 public_equiv SG1 GA' GB'
 < search.

Subgoal 9:

Variables: SG SL SG1 GA GB GB' V N E Sl Ty
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (secdecl N Ty Sl E)
Sec : secure SG SL (secdecl N Ty Sl E) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty Sl E) ((N, V)::GA) @
EvB : eval_s GB (secdecl N Ty Sl E) GB'
EvA1 : eval_e GA E V
============================
 public_equiv SG1 ((N, V)::GA) GB'
 < EvB: case EvB.

Subgoal 9:

Variables: SG SL SG1 GA GB V N E Sl Ty V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s (secdecl N Ty Sl E)
Sec : secure SG SL (secdecl N Ty Sl E) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty Sl E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
============================
 public_equiv SG1 ((N, V)::GA) ((N, V1)::GB)
 < Is: case Is.

Subgoal 9:

Variables: SG SL SG1 GA GB V N E Sl Ty V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Sec : secure SG SL (secdecl N Ty Sl E) SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty Sl E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl Sl
Is3 : is_e E
============================
 public_equiv SG1 ((N, V)::GA) ((N, V1)::GB)
 < Sec: case Sec.

Subgoal 9.1:

Variables: SG SL GA GB V N E Ty V1 L
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG N
============================
 public_equiv ((N, private)::SG) ((N, V)::GA) ((N, V1)::GB)
 < unfold .

Subgoal 9.1.1:

Variables: SG SL GA GB V N E Ty V1 L
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG N
============================
 forall X V2,
   lookup ((N, private)::SG) X public -> lookup ((N, V)::GA) X V2 -> lookup ((N, V1)::GB) X V2
 < intros LkpSec Lkp.

Subgoal 9.1.1:

Variables: SG SL GA GB V N E Ty V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG N
LkpSec : lookup ((N, private)::SG) X public
Lkp : lookup ((N, V)::GA) X V2
============================
 lookup ((N, V1)::GB) X V2
 < LkpSec: case LkpSec.

Subgoal 9.1.1:

Variables: SG SL GA GB V N E Ty V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG N
Lkp : lookup ((N, V)::GA) X V2
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
============================
 lookup ((N, V1)::GB) X V2
 < Lkp: case Lkp.

Subgoal 9.1.1.1:

Variables: SG SL GA GB E Ty V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl X Ty private E) ((X, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG X
LkpSec : X = X -> false
LkpSec1 : lookup SG X public
============================
 lookup ((X, V1)::GB) X V2
 < apply LkpSec to _.

Subgoal 9.1.1.2:

Variables: SG SL GA GB V N E Ty V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG N
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
Lkp : N = X -> false
Lkp1 : lookup GA X V2
============================
 lookup ((N, V1)::GB) X V2
 < Rel: case Rel.

Subgoal 9.1.1.2:

Variables: SG SL GA GB V N E Ty V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG N
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
Lkp : N = X -> false
Lkp1 : lookup GA X V2
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
 lookup ((N, V1)::GB) X V2
 < apply Rel to LkpSec1 Lkp1.

Subgoal 9.1.1.2:

Variables: SG SL GA GB V N E Ty V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG N
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
Lkp : N = X -> false
Lkp1 : lookup GA X V2
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
H1 : lookup GB X V2
============================
 lookup ((N, V1)::GB) X V2
 < search.

Subgoal 9.1.2:

Variables: SG SL GA GB V N E Ty V1 L
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG N
============================
 forall X V2,
   lookup ((N, private)::SG) X public -> lookup ((N, V1)::GB) X V2 -> lookup ((N, V)::GA) X V2
 < intros LkpSec Lkp.

Subgoal 9.1.2:

Variables: SG SL GA GB V N E Ty V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG N
LkpSec : lookup ((N, private)::SG) X public
Lkp : lookup ((N, V1)::GB) X V2
============================
 lookup ((N, V)::GA) X V2
 < LkpSec: case LkpSec.

Subgoal 9.1.2:

Variables: SG SL GA GB V N E Ty V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG N
Lkp : lookup ((N, V1)::GB) X V2
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
============================
 lookup ((N, V)::GA) X V2
 < Lkp: case Lkp.

Subgoal 9.1.2.1:

Variables: SG SL GA GB V E Ty L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl X Ty private E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V2
Is : is_string X
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG X
LkpSec : X = X -> false
LkpSec1 : lookup SG X public
============================
 lookup ((X, V)::GA) X V2
 < apply LkpSec to _.

Subgoal 9.1.2.2:

Variables: SG SL GA GB V N E Ty V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG N
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
Lkp : N = X -> false
Lkp1 : lookup GB X V2
============================
 lookup ((N, V)::GA) X V2
 < Rel: case Rel.

Subgoal 9.1.2.2:

Variables: SG SL GA GB V N E Ty V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG N
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
Lkp : N = X -> false
Lkp1 : lookup GB X V2
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
 lookup ((N, V)::GA) X V2
 < apply Rel1 to LkpSec1 Lkp1.

Subgoal 9.1.2.2:

Variables: SG SL GA GB V N E Ty V1 L X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl private
Is3 : is_e E
Sec : level SG E L
Sec1 : no_lookup SG N
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
Lkp : N = X -> false
Lkp1 : lookup GB X V2
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
H1 : lookup GA X V2
============================
 lookup ((N, V)::GA) X V2
 < search.

Subgoal 9.2:

Variables: SG GA GB V N E Ty V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty public E) ((N, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG N
============================
 public_equiv ((N, public)::SG) ((N, V)::GA) ((N, V1)::GB)
 < apply level_secure to _ Sec Rel EvA1 EvB.

Subgoal 9.2:

Variables: SG GA GB N E Ty V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG N
============================
 public_equiv ((N, public)::SG) ((N, V1)::GA) ((N, V1)::GB)
 < unfold .

Subgoal 9.2.1:

Variables: SG GA GB N E Ty V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG N
============================
 forall X V,
   lookup ((N, public)::SG) X public -> lookup ((N, V1)::GA) X V -> lookup ((N, V1)::GB) X V
 < intros LkpSec Lkp.

Subgoal 9.2.1:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG N
LkpSec : lookup ((N, public)::SG) X public
Lkp : lookup ((N, V1)::GA) X V2
============================
 lookup ((N, V1)::GB) X V2
 < LkpSec: case LkpSec.

Subgoal 9.2.1.1:

Variables: SG GA GB E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl X Ty public E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
Lkp : lookup ((X, V1)::GA) X V2
============================
 lookup ((X, V1)::GB) X V2
 < Lkp: case Lkp.

Subgoal 9.2.1.1.1:

Variables: SG GA GB E Ty X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl X Ty public E) ((X, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Is : is_string X
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
============================
 lookup ((X, V2)::GB) X V2
 < search.

Subgoal 9.2.1.1.2:

Variables: SG GA GB E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl X Ty public E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
Lkp : X = X -> false
Lkp1 : lookup GA X V2
============================
 lookup ((X, V1)::GB) X V2
 < apply Lkp to _.

Subgoal 9.2.1.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG N
Lkp : lookup ((N, V1)::GA) X V2
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
============================
 lookup ((N, V1)::GB) X V2
 < Lkp: case Lkp.

Subgoal 9.2.1.2.1:

Variables: SG GA GB E Ty X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl X Ty public E) ((X, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Is : is_string X
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpSec : X = X -> false
LkpSec1 : lookup SG X public
============================
 lookup ((X, V2)::GB) X V2
 < apply LkpSec to _.

Subgoal 9.2.1.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG N
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
Lkp : N = X -> false
Lkp1 : lookup GA X V2
============================
 lookup ((N, V1)::GB) X V2
 < Rel: case Rel.

Subgoal 9.2.1.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG N
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
Lkp : N = X -> false
Lkp1 : lookup GA X V2
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
 lookup ((N, V1)::GB) X V2
 < apply Rel to LkpSec1 Lkp1.

Subgoal 9.2.1.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG N
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
Lkp : N = X -> false
Lkp1 : lookup GA X V2
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
H1 : lookup GB X V2
============================
 lookup ((N, V1)::GB) X V2
 < search.

Subgoal 9.2.2:

Variables: SG GA GB N E Ty V1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG N
============================
 forall X V,
   lookup ((N, public)::SG) X public -> lookup ((N, V1)::GB) X V -> lookup ((N, V1)::GA) X V
 < intros LkpSec Lkp.

Subgoal 9.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG N
LkpSec : lookup ((N, public)::SG) X public
Lkp : lookup ((N, V1)::GB) X V2
============================
 lookup ((N, V1)::GA) X V2
 < LkpSec: case LkpSec.

Subgoal 9.2.2.1:

Variables: SG GA GB E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl X Ty public E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
Lkp : lookup ((X, V1)::GB) X V2
============================
 lookup ((X, V1)::GA) X V2
 < Lkp: case Lkp.

Subgoal 9.2.2.1.1:

Variables: SG GA GB E Ty X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl X Ty public E) ((X, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Is : is_string X
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
============================
 lookup ((X, V2)::GA) X V2
 < search.

Subgoal 9.2.2.1.2:

Variables: SG GA GB E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl X Ty public E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
Lkp : X = X -> false
Lkp1 : lookup GB X V2
============================
 lookup ((X, V1)::GA) X V2
 < apply Lkp to _.

Subgoal 9.2.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG N
Lkp : lookup ((N, V1)::GB) X V2
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
============================
 lookup ((N, V1)::GA) X V2
 < Lkp: case Lkp.

Subgoal 9.2.2.2.1:

Variables: SG GA GB E Ty X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl X Ty public E) ((X, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Is : is_string X
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpSec : X = X -> false
LkpSec1 : lookup SG X public
============================
 lookup ((X, V2)::GA) X V2
 < apply LkpSec to _.

Subgoal 9.2.2.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG N
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
Lkp : N = X -> false
Lkp1 : lookup GB X V2
============================
 lookup ((N, V1)::GA) X V2
 < Rel: case Rel.

Subgoal 9.2.2.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG N
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
Lkp : N = X -> false
Lkp1 : lookup GB X V2
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
 lookup ((N, V1)::GA) X V2
 < apply Rel1 to LkpSec1 Lkp1.

Subgoal 9.2.2.2.2:

Variables: SG GA GB N E Ty V1 X V2
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string N
Is1 : is_ty Ty
Is2 : is_sl public
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG N
LkpSec : N = X -> false
LkpSec1 : lookup SG X public
Lkp : N = X -> false
Lkp1 : lookup GB X V2
Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
H1 : lookup GA X V2
============================
 lookup ((N, V1)::GA) X V2
 < search.

Subgoal 10:

Variables: SG SL SG1 GA GA' GB GB' T
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Sec : secure SG SL <unknown K eval_s> SG1
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> T
EvA2 : eval_s GA T GA' *
============================
 public_equiv SG1 GA' GB'
 < Sec: case Sec.

Subgoal 10:

Variables: SG SL SG1 GA GA' GB GB' T S1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> T
EvA2 : eval_s GA T GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
============================
 public_equiv SG1 GA' GB'
 < apply proj_s_unique to EvA1 Sec.

Subgoal 10:

Variables: SG SL SG1 GA GA' GB GB' S1
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
============================
 public_equiv SG1 GA' GB'
 < EvBProj: apply proj_s_eval to EvA1 EvB.

Subgoal 10:

Variables: SG SL SG1 GA GA' GB GB' S1 G'
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
============================
 public_equiv SG1 GA' GB'
 < IsCT: apply proj_s_is to Sec Is.

Subgoal 10:

Variables: SG SL SG1 GA GA' GB GB' S1 G'
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
IsCT : is_s S1
============================
 public_equiv SG1 GA' GB'
 < Equiv: apply IH to _ Sec1 Rel EvA2 EvBProj.

Subgoal 10:

Variables: SG SL SG1 GA GA' GB GB' S1 G'
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
IsCT : is_s S1
Equiv : public_equiv SG1 GA' G'
============================
 public_equiv SG1 GA' GB'
 < LkpGB'G': assert forall X V,
     lookup GB' X V -> lookup G' X V.

Subgoal 10.1:

Variables: SG SL SG1 GA GA' GB GB' S1 G'
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
IsCT : is_s S1
Equiv : public_equiv SG1 GA' G'
============================
 forall X V, lookup GB' X V -> lookup G' X V
 < intros L.

Subgoal 10.1:

Variables: SG SL SG1 GA GA' GB GB' S1 G' X V
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
IsCT : is_s S1
Equiv : public_equiv SG1 GA' G'
L : lookup GB' X V
============================
 lookup G' X V
 < apply proj_s_eval_results to EvA1 EvB EvBProj L.

Subgoal 10.1:

Variables: SG SL SG1 GA GA' GB GB' S1 G' X V
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
IsCT : is_s S1
Equiv : public_equiv SG1 GA' G'
L : lookup GB' X V
H1 : lookup G' X V
============================
 lookup G' X V
 < search.

Subgoal 10:

Variables: SG SL SG1 GA GA' GB GB' S1 G'
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
IsCT : is_s S1
Equiv : public_equiv SG1 GA' G'
LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V
============================
 public_equiv SG1 GA' GB'
 < EqG'GB': assert public_equiv SG1 G' GB'.

Subgoal 10.2:

Variables: SG SL SG1 GA GA' GB GB' S1 G'
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
IsCT : is_s S1
Equiv : public_equiv SG1 GA' G'
LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V
============================
 public_equiv SG1 G' GB'
 < unfold .

Subgoal 10.2.1:

Variables: SG SL SG1 GA GA' GB GB' S1 G'
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
IsCT : is_s S1
Equiv : public_equiv SG1 GA' G'
LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V
============================
 forall X V, lookup SG1 X public -> lookup G' X V -> lookup GB' X V
 < intros LkpSec LkpG'.

Subgoal 10.2.1:

Variables: SG SL SG1 GA GA' GB GB' S1 G' X V
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
IsCT : is_s S1
Equiv : public_equiv SG1 GA' G'
LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V
LkpSec : lookup SG1 X public
LkpG' : lookup G' X V
============================
 lookup GB' X V
 < apply proj_s_eval_results_back to Sec EvB EvBProj LkpG'.

Subgoal 10.2.1:

Variables: SG SL SG1 GA GA' GB GB' S1 G' X V
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
IsCT : is_s S1
Equiv : public_equiv SG1 GA' G'
LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V
LkpSec : lookup SG1 X public
LkpG' : lookup G' X V
H1 : lookup GB' X V
============================
 lookup GB' X V
 < search.

Subgoal 10.2.2:

Variables: SG SL SG1 GA GA' GB GB' S1 G'
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
IsCT : is_s S1
Equiv : public_equiv SG1 GA' G'
LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V
============================
 forall X V, lookup SG1 X public -> lookup GB' X V -> lookup G' X V
 < intros LkpSec LkpGB'.

Subgoal 10.2.2:

Variables: SG SL SG1 GA GA' GB GB' S1 G' X V
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
IsCT : is_s S1
Equiv : public_equiv SG1 GA' G'
LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V
LkpSec : lookup SG1 X public
LkpGB' : lookup GB' X V
============================
 lookup G' X V
 < backchain LkpGB'G'.

Subgoal 10:

Variables: SG SL SG1 GA GA' GB GB' S1 G'
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
IsCT : is_s S1
Equiv : public_equiv SG1 GA' G'
LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V
EqG'GB' : public_equiv SG1 G' GB'
============================
 public_equiv SG1 GA' GB'
 < apply public_equiv_trans to Equiv EqG'GB'.

Subgoal 10:

Variables: SG SL SG1 GA GA' GB GB' S1 G'
IH : forall S SG SL SG1 GA GA' GB GB',
       is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * ->
       eval_s GB S GB' -> public_equiv SG1 GA' GB'
Is : is_s <unknown K eval_s>
Rel : public_equiv SG GA GB
EvA : eval_s GA <unknown K eval_s> GA' @
EvB : eval_s GB <unknown K eval_s> GB'
EvA1 : |{s}- <unknown K eval_s> ~~> S1
EvA2 : eval_s GA S1 GA' *
Sec : |{s}- <unknown K eval_s> ~~> S1
Sec1 : secure SG SL S1 SG1
EvBProj : eval_s GB S1 G'
IsCT : is_s S1
Equiv : public_equiv SG1 GA' G'
LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V
EqG'GB' : public_equiv SG1 G' GB'
H1 : public_equiv SG1 GA' GB'
============================
 public_equiv SG1 GA' GB'
 < search.

Proof completed.
Back to example home