< Module simple_imp:security.
< Prove_Constraint simple_imp:host:proj_e_unique.
Proof completed.
< Prove_Constraint simple_imp:host:proj_e_is.
Proof completed.
< Prove_Constraint simple_imp:host:proj_rf_unique.
Proof completed.
< Prove_Constraint simple_imp:host:proj_rf_is.
Proof completed.
< Prove_Constraint simple_imp:host:proj_c_unique.
Variables: C2 E Ty X S
Hyp : |{c}- declareSec X S Ty E ~~> declare X Ty E
Hyp1 : |{c}- declareSec X S Ty E ~~> C2
============================
declare X Ty E = C2
< case Hyp1.
Variables: E Ty X S
Hyp : |{c}- declareSec X S Ty E ~~> declare X Ty E
============================
declare X Ty E = declare X Ty E
< search.
Proof completed.
< Prove_Constraint simple_imp:host:proj_c_is.
Variables: E Ty X S
Hyp : |{c}- declareSec X S Ty E ~~> declare X Ty E
Hyp1 : is_c (declareSec X S Ty E)
============================
is_c (declare X Ty E)
< case Hyp1.
Variables: E Ty X S
Hyp : |{c}- declareSec X S Ty E ~~> declare X Ty E
H1 : is_string X
H2 : is_seclevel S
H3 : is_ty Ty
H4 : is_e E
============================
is_c (declare X Ty E)
< search.
Proof completed.
< Prove_Constraint simple_imp:host:proj_recFields_unique.
Proof completed.
< Prove_Constraint simple_imp:host:proj_recFields_is.
Proof completed.
< Prove_Constraint simple_imp:host:proj_ty_unique.
Proof completed.
< Prove_Constraint simple_imp:host:proj_ty_is.
Proof completed.
< Prove_Constraint simple_imp:host:proj_value_unique.
Proof completed.
< Prove_Constraint simple_imp:host:proj_value_is.
Proof completed.
< Prove simple_imp:host:vars_join,
simple_imp:host:vars_rf_join.
Proof completed.
< Prove simple_imp:host:vars_unique,
simple_imp:host:vars_rf_unique.
Proof completed.
< Prove_Constraint simple_imp:host:proj_e_vars_exist.
Proof completed.
< Prove_Constraint simple_imp:host:proj_e_vars.
Proof completed.
< Prove_Constraint simple_imp:host:proj_rf_vars_exist.
Proof completed.
< Prove_Constraint simple_imp:host:proj_rf_vars.
Proof completed.
< Prove simple_imp:host:vars_is,
simple_imp:host:vars_rf_is.
Proof completed.
< Prove simple_imp:host:vars_exist,
simple_imp:host:vars_rf_exist.
Proof completed.
< Prove simple_imp:host:typeOf_unique,
simple_imp:host:typeRecFields_unique.
Proof completed.
< Prove simple_imp:host:typeOK_unique.
Subgoal 8:
Variables: G G2 Ty X E S
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G (declareSec X S Ty E) ((X, Ty)::G) @
Ty2 : typeOK G (declareSec X S Ty E) G2
Ty3 : no_lookup G X
Ty4 : typeOf G E Ty
============================
(X, Ty)::G = G2
< Ty2: case Ty2.
Subgoal 8:
Variables: G Ty X E S
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G (declareSec X S Ty E) ((X, Ty)::G) @
Ty3 : no_lookup G X
Ty4 : typeOf G E Ty
Ty2 : no_lookup G X
Ty5 : typeOf G E Ty
============================
(X, Ty)::G = (X, Ty)::G
< apply typeOf_unique to Ty4 Ty5.
Subgoal 8:
Variables: G Ty X E S
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G (declareSec X S Ty E) ((X, Ty)::G) @
Ty3 : no_lookup G X
Ty4 : typeOf G E Ty
Ty2 : no_lookup G X
Ty5 : typeOf G E Ty
============================
(X, Ty)::G = (X, Ty)::G
< search.
Proof completed.
< Prove_Constraint simple_imp:host:proj_eval_e.
Proof completed.
< Prove simple_imp:host:eval_e_unique,
simple_imp:host:eval_rf_unique.
Proof completed.
< Prove simple_imp:host:update_rec_fields_unique.
Proof completed.
< Prove_Constraint simple_imp:host:proj_c_eval.
Variables: G G2 E Ty X S
Hyp : |{c}- declareSec X S Ty E ~~> declare X Ty E
Hyp1 : eval_c G (declareSec X S Ty E) G2
============================
exists G', eval_c G (declare X Ty E) G'
< Ev: case Hyp1.
Variables: G E Ty X S V
Hyp : |{c}- declareSec X S Ty E ~~> declare X Ty E
Ev : eval_e G E V
============================
exists G', eval_c G (declare X Ty E) G'
< search.
Proof completed.
< Add_Ext_Size simple_imp:host:eval_c.
Proof completed.
< Add_Proj_Rel simple_imp:host:eval_c.
Proof completed.
< Prove_Ext_Ind simple_imp:host:eval_c.
Subgoal 10:
Variables: G V X E Ty S
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (declareSec X S Ty E) ((X, V)::G) 1 @@
Acc : acc 1 @
R1 : eval_e G E V
============================
<eval_c {P}> G (declareSec X S Ty E) ((X, V)::G)
< Proj: assert |{c}- declareSec X S Ty E ~~> declare X Ty E.
Subgoal 10:
Variables: G V X E Ty S
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (declareSec X S Ty E) ((X, V)::G) 1 @@
Acc : acc 1 @
R1 : eval_e G E V
Proj : |{c}- declareSec X S Ty E ~~> declare X Ty E
============================
<eval_c {P}> G (declareSec X S Ty E) ((X, V)::G)
< search.
Proof completed.
< Prove simple_imp:host:eval_c_unique.
Subgoal 10:
Variables: G G2 V X E Ty S
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (declareSec X S Ty E) ((X, V)::G) @
Ev2 : eval_c G (declareSec X S Ty E) G2
Ev3 : eval_e G E V
============================
(X, V)::G = G2
< Ev2: case Ev2.
Subgoal 10:
Variables: G V X E Ty S V1
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (declareSec X S Ty E) ((X, V)::G) @
Ev3 : eval_e G E V
Ev2 : eval_e G E V1
============================
(X, V)::G = (X, V1)::G
< apply eval_e_unique to Ev3 Ev2.
Subgoal 10:
Variables: G X E Ty S V1
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (declareSec X S Ty E) ((X, V1)::G) @
Ev3 : eval_e G E V1
Ev2 : eval_e G E V1
============================
(X, V1)::G = (X, V1)::G
< search.
Proof completed.
< Prove_Constraint simple_imp:host:proj_c_eval_results.
Variables: G G1 G2 X V E Ty X1 S
Hyp : |{c}- declareSec X1 S Ty E ~~> declare X1 Ty E
Hyp1 : eval_c G (declareSec X1 S Ty E) G1
Hyp2 : eval_c G (declare X1 Ty E) G2
Hyp3 : lookup G1 X V
============================
lookup G2 X V
< Ev1: case Hyp1.
Variables: G G2 X V E Ty X1 S V1
Hyp : |{c}- declareSec X1 S Ty E ~~> declare X1 Ty E
Hyp2 : eval_c G (declare X1 Ty E) G2
Hyp3 : lookup ((X1, V1)::G) X V
Ev1 : eval_e G E V1
============================
lookup G2 X V
< Ev2: case Hyp2.
Variables: G X V E Ty X1 S V1 V2
Hyp : |{c}- declareSec X1 S Ty E ~~> declare X1 Ty E
Hyp3 : lookup ((X1, V1)::G) X V
Ev1 : eval_e G E V1
Ev2 : eval_e G E V2
============================
lookup ((X1, V2)::G) X V
< apply eval_e_unique to Ev1 Ev2.
Variables: G X V E Ty X1 S V2
Hyp : |{c}- declareSec X1 S Ty E ~~> declare X1 Ty E
Hyp3 : lookup ((X1, V2)::G) X V
Ev1 : eval_e G E V2
Ev2 : eval_e G E V2
============================
lookup ((X1, V2)::G) X V
< search.
Proof completed.
< Prove_Constraint simple_imp:host:proj_c_eval_results_back.
Variables: G G1 G2 X V E Ty X1 S
Hyp : |{c}- declareSec X1 S Ty E ~~> declare X1 Ty E
Hyp1 : eval_c G (declareSec X1 S Ty E) G1
Hyp2 : eval_c G (declare X1 Ty E) G2
Hyp3 : lookup G2 X V
============================
lookup G1 X V
< Ev1: case Hyp1.
Variables: G G2 X V E Ty X1 S V1
Hyp : |{c}- declareSec X1 S Ty E ~~> declare X1 Ty E
Hyp2 : eval_c G (declare X1 Ty E) G2
Hyp3 : lookup G2 X V
Ev1 : eval_e G E V1
============================
lookup ((X1, V1)::G) X V
< Ev2: case Hyp2.
Variables: G X V E Ty X1 S V1 V2
Hyp : |{c}- declareSec X1 S Ty E ~~> declare X1 Ty E
Hyp3 : lookup ((X1, V2)::G) X V
Ev1 : eval_e G E V1
Ev2 : eval_e G E V2
============================
lookup ((X1, V1)::G) X V
< apply eval_e_unique to Ev1 Ev2.
Variables: G X V E Ty X1 S V2
Hyp : |{c}- declareSec X1 S Ty E ~~> declare X1 Ty E
Hyp3 : lookup ((X1, V2)::G) X V
Ev1 : eval_e G E V2
Ev2 : eval_e G E V2
============================
lookup ((X1, V2)::G) X V
< search.
Proof completed.
< Prove simple_imp:host:vars_eval_same_result,
simple_imp:host:vars_equal_rf_same_result.
Proof completed.
< Extensible_Theorem
join_private_left : forall A S,
Join : join A private S ->
S = private
on Join.
Subgoal 1:
IH : forall A S, join A private S * -> S = private
Join : join private private private @
============================
private = private
< search.
Subgoal 2:
Variables: A
IH : forall A S, join A private S * -> S = private
Join : join A private private @
============================
private = private
< search.
Proof completed.
< Extensible_Theorem
join_unique : forall A B S1 S2,
J1 : join A B S1 ->
J2 : join A B S2 ->
S1 = S2
on J1.
Subgoal 1:
Variables: S2
IH : forall A B S1 S2, join A B S1 * -> join A B S2 -> S1 = S2
J1 : join public public public @
J2 : join public public S2
============================
public = S2
< case J2.
Subgoal 1:
IH : forall A B S1 S2, join A B S1 * -> join A B S2 -> S1 = S2
J1 : join public public public @
============================
public = public
< search.
Subgoal 2:
Variables: B S2
IH : forall A B S1 S2, join A B S1 * -> join A B S2 -> S1 = S2
J1 : join private B private @
J2 : join private B S2
============================
private = S2
< case J2.
Subgoal 2.1:
Variables: B
IH : forall A B S1 S2, join A B S1 * -> join A B S2 -> S1 = S2
J1 : join private B private @
============================
private = private
< search.
Subgoal 2.2:
IH : forall A B S1 S2, join A B S1 * -> join A B S2 -> S1 = S2
J1 : join private private private @
============================
private = private
< search.
Subgoal 3:
Variables: A S2
IH : forall A B S1 S2, join A B S1 * -> join A B S2 -> S1 = S2
J1 : join A private private @
J2 : join A private S2
============================
private = S2
< apply join_private_left to J2.
Subgoal 3:
Variables: A
IH : forall A B S1 S2, join A B S1 * -> join A B S2 -> S1 = S2
J1 : join A private private @
J2 : join A private private
============================
private = private
< search.
Proof completed.
< Extensible_Theorem
join_public : forall A B,
J : join A B public ->
A = public /\
B = public
on J.
IH : forall A B, join A B public * -> A = public /\ B = public
J : join public public public @
============================
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,
level_public_vars_rf : forall SG RF V X,
Lev : rf_level SG RF public ->
Vars : vars_rf RF V ->
Mem : mem X V ->
lookup SG X public
on Lev.
Subgoal 1.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
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (num I) public @
Vars : vars (num I) V
Mem : mem X V
============================
lookup SG X public
< case Vars.
Subgoal 1.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
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (num I) public @
Mem : mem X []
============================
lookup SG X public
< case Mem.
Subgoal 1.2:
Variables: SG V X S1 S2 E2 E1
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (plus E1 E2) public @
Vars : vars (plus E1 E2) V
Mem : mem X V
Lev1 : level SG E1 S1 *
Lev2 : level SG E2 S2 *
Lev3 : join S1 S2 public
============================
lookup SG X public
< Vars1: case Vars.
Subgoal 1.2:
Variables: SG V X S1 S2 E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (plus E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 S1 *
Lev2 : level SG E2 S2 *
Lev3 : join S1 S2 public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
============================
lookup SG X public
< apply join_public to Lev3.
Subgoal 1.2:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (plus E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
============================
lookup SG X public
< Or: apply mem_append to Mem Vars3.
Subgoal 1.2:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (plus E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Or : mem X D1 \/ mem X D2
============================
lookup SG X public
< Mem': case Or.
Subgoal 1.2.1:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (plus E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D1
============================
lookup SG X public
< apply IH to Lev1 Vars1 Mem'.
Subgoal 1.2.1:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (plus E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D1
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 1.2.2:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (plus E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D2
============================
lookup SG X public
< apply IH to Lev2 Vars2 Mem'.
Subgoal 1.2.2:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (plus E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D2
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 1.3:
Variables: SG V X X1
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (name X1) public @
Vars : vars (name X1) V
Mem : mem X V
Lev1 : lookup SG X1 public
============================
lookup SG X public
< case Vars.
Subgoal 1.3:
Variables: SG X X1
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (name X1) public @
Mem : mem X [X1]
Lev1 : lookup SG X1 public
============================
lookup SG X public
< Mem': case Mem.
Subgoal 1.3.1:
Variables: SG X1
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (name X1) public @
Lev1 : lookup SG X1 public
============================
lookup SG X1 public
< search.
Subgoal 1.3.2:
Variables: SG X X1
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (name X1) public @
Lev1 : lookup SG X1 public
Mem' : mem X []
============================
lookup SG X public
< case Mem'.
Subgoal 1.4:
Variables: SG V X S1 S2 E2 E1
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (greater E1 E2) public @
Vars : vars (greater E1 E2) V
Mem : mem X V
Lev1 : level SG E1 S1 *
Lev2 : level SG E2 S2 *
Lev3 : join S1 S2 public
============================
lookup SG X public
< Vars1: case Vars.
Subgoal 1.4:
Variables: SG V X S1 S2 E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (greater E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 S1 *
Lev2 : level SG E2 S2 *
Lev3 : join S1 S2 public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
============================
lookup SG X public
< apply join_public to Lev3.
Subgoal 1.4:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (greater E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
============================
lookup SG X public
< Or: apply mem_append to Mem Vars3.
Subgoal 1.4:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (greater E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Or : mem X D1 \/ mem X D2
============================
lookup SG X public
< Mem': case Or.
Subgoal 1.4.1:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (greater E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D1
============================
lookup SG X public
< apply IH to Lev1 Vars1 Mem'.
Subgoal 1.4.1:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (greater E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D1
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 1.4.2:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (greater E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D2
============================
lookup SG X public
< apply IH to Lev2 Vars2 Mem'.
Subgoal 1.4.2:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (greater E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D2
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 1.5:
Variables: SG V X S1 S2 E2 E1
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF 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 S1 *
Lev2 : level SG E2 S2 *
Lev3 : join S1 S2 public
============================
lookup SG X public
< Vars1: case Vars.
Subgoal 1.5:
Variables: SG V X S1 S2 E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (eq E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 S1 *
Lev2 : level SG E2 S2 *
Lev3 : join S1 S2 public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
============================
lookup SG X public
< apply join_public to Lev3.
Subgoal 1.5:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF 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
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
============================
lookup SG X public
< Or: apply mem_append to Mem Vars3.
Subgoal 1.5:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF 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
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Or : mem X D1 \/ mem X D2
============================
lookup SG X public
< Mem': case Or.
Subgoal 1.5.1:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF 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
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D1
============================
lookup SG X public
< apply IH to Lev1 Vars1 Mem'.
Subgoal 1.5.1:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF 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
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D1
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 1.5.2:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF 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
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D2
============================
lookup SG X public
< apply IH to Lev2 Vars2 Mem'.
Subgoal 1.5.2:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF 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
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D2
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 1.6:
Variables: SG V X S1 S2 E2 E1
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (and E1 E2) public @
Vars : vars (and E1 E2) V
Mem : mem X V
Lev1 : level SG E1 S1 *
Lev2 : level SG E2 S2 *
Lev3 : join S1 S2 public
============================
lookup SG X public
< Vars1: case Vars.
Subgoal 1.6:
Variables: SG V X S1 S2 E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (and E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 S1 *
Lev2 : level SG E2 S2 *
Lev3 : join S1 S2 public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
============================
lookup SG X public
< apply join_public to Lev3.
Subgoal 1.6:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (and E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
============================
lookup SG X public
< Or: apply mem_append to Mem Vars3.
Subgoal 1.6:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (and E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Or : mem X D1 \/ mem X D2
============================
lookup SG X public
< Mem': case Or.
Subgoal 1.6.1:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (and E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D1
============================
lookup SG X public
< apply IH to Lev1 Vars1 Mem'.
Subgoal 1.6.1:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (and E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D1
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 1.6.2:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (and E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D2
============================
lookup SG X public
< apply IH to Lev2 Vars2 Mem'.
Subgoal 1.6.2:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (and E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D2
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 1.7:
Variables: SG V X S1 S2 E2 E1
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (or E1 E2) public @
Vars : vars (or E1 E2) V
Mem : mem X V
Lev1 : level SG E1 S1 *
Lev2 : level SG E2 S2 *
Lev3 : join S1 S2 public
============================
lookup SG X public
< Vars1: case Vars.
Subgoal 1.7:
Variables: SG V X S1 S2 E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (or E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 S1 *
Lev2 : level SG E2 S2 *
Lev3 : join S1 S2 public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
============================
lookup SG X public
< apply join_public to Lev3.
Subgoal 1.7:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (or E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
============================
lookup SG X public
< Or: apply mem_append to Mem Vars3.
Subgoal 1.7:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (or E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Or : mem X D1 \/ mem X D2
============================
lookup SG X public
< Mem': case Or.
Subgoal 1.7.1:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (or E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D1
============================
lookup SG X public
< apply IH to Lev1 Vars1 Mem'.
Subgoal 1.7.1:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (or E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D1
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 1.7.2:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (or E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D2
============================
lookup SG X public
< apply IH to Lev2 Vars2 Mem'.
Subgoal 1.7.2:
Variables: SG V X E2 E1 D1 D2
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (or E1 E2) public @
Mem : mem X V
Lev1 : level SG E1 public *
Lev2 : level SG E2 public *
Lev3 : join public public public
Vars1 : vars E1 D1
Vars2 : vars E2 D2
Vars3 : D1 ++ D2 = V
Mem' : mem X D2
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 1.8:
Variables: SG V X
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG true public @
Vars : vars true V
Mem : mem X V
============================
lookup SG X public
< case Vars.
Subgoal 1.8:
Variables: SG X
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG true public @
Mem : mem X []
============================
lookup SG X public
< case Mem.
Subgoal 1.9:
Variables: SG V X
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG false public @
Vars : vars false V
Mem : mem X V
============================
lookup SG X public
< case Vars.
Subgoal 1.9:
Variables: SG X
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG false public @
Mem : mem X []
============================
lookup SG X public
< case Mem.
Subgoal 1.10:
Variables: SG V X Fields
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (recBuild Fields) public @
Vars : vars (recBuild Fields) V
Mem : mem X V
Lev1 : rf_level SG Fields public *
============================
lookup SG X public
< Vars: case Vars.
Subgoal 1.10:
Variables: SG V X Fields
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (recBuild Fields) public @
Mem : mem X V
Lev1 : rf_level SG Fields public *
Vars : vars_rf Fields V
============================
lookup SG X public
< apply IH1 to Lev1 Vars Mem.
Subgoal 1.10:
Variables: SG V X Fields
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (recBuild Fields) public @
Mem : mem X V
Lev1 : rf_level SG Fields public *
Vars : vars_rf Fields V
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 1.11:
Variables: SG V X Field Rec
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (recFieldAccess Rec Field) public @
Vars : vars (recFieldAccess Rec Field) V
Mem : mem X V
Lev1 : level SG Rec public *
============================
lookup SG X public
< Vars: case Vars.
Subgoal 1.11:
Variables: SG V X Field Rec
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (recFieldAccess Rec Field) public @
Mem : mem X V
Lev1 : level SG Rec public *
Vars : vars Rec V
============================
lookup SG X public
< apply IH to Lev1 Vars Mem.
Subgoal 1.11:
Variables: SG V X Field Rec
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : level SG (recFieldAccess Rec Field) public @
Mem : mem X V
Lev1 : level SG Rec public *
Vars : vars Rec V
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 1.12:
Variables: SG V X ET
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF 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> ~~> ET
Lev2 : level SG ET public *
============================
lookup SG X public
< V: apply proj_e_vars_exist to Lev1 Vars.
Subgoal 1.12:
Variables: SG V X ET V'
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF 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> ~~> ET
Lev2 : level SG ET public *
V : vars ET V'
============================
lookup SG X public
< Mem: apply proj_e_vars to Lev1 Vars V Mem.
Subgoal 1.12:
Variables: SG V X ET V'
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF 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> ~~> ET
Lev2 : level SG ET public *
V : vars ET V'
Mem1 : mem X V'
============================
lookup SG X public
< apply IH to Lev2 V Mem1.
Subgoal 1.12:
Variables: SG V X ET V'
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF 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> ~~> ET
Lev2 : level SG ET public *
V : vars ET V'
Mem1 : mem X V'
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 2.1:
Variables: SG V X
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : rf_level SG endRecFieldExprs public @
Vars : vars_rf endRecFieldExprs V
Mem : mem X V
============================
lookup SG X public
< case Vars.
Subgoal 2.1:
Variables: SG X
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : rf_level SG endRecFieldExprs public @
Mem : mem X []
============================
lookup SG X public
< case Mem.
Subgoal 2.2:
Variables: SG V X S1 S2 Rest E L
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : rf_level SG (addRecFieldExprs L E Rest) public @
Vars : vars_rf (addRecFieldExprs L E Rest) V
Mem : mem X V
Lev1 : level SG E S1 *
Lev2 : rf_level SG Rest S2 *
Lev3 : join S1 S2 public
============================
lookup SG X public
< Vars1: case Vars.
Subgoal 2.2:
Variables: SG V X S1 S2 Rest E L DRest DE
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : rf_level SG (addRecFieldExprs L E Rest) public @
Mem : mem X V
Lev1 : level SG E S1 *
Lev2 : rf_level SG Rest S2 *
Lev3 : join S1 S2 public
Vars1 : vars_rf Rest DRest
Vars2 : vars E DE
Vars3 : DE ++ DRest = V
============================
lookup SG X public
< apply join_public to Lev3.
Subgoal 2.2:
Variables: SG V X Rest E L DRest DE
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : rf_level SG (addRecFieldExprs L E Rest) public @
Mem : mem X V
Lev1 : level SG E public *
Lev2 : rf_level SG Rest public *
Lev3 : join public public public
Vars1 : vars_rf Rest DRest
Vars2 : vars E DE
Vars3 : DE ++ DRest = V
============================
lookup SG X public
< Or: apply mem_append to Mem Vars3.
Subgoal 2.2:
Variables: SG V X Rest E L DRest DE
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : rf_level SG (addRecFieldExprs L E Rest) public @
Mem : mem X V
Lev1 : level SG E public *
Lev2 : rf_level SG Rest public *
Lev3 : join public public public
Vars1 : vars_rf Rest DRest
Vars2 : vars E DE
Vars3 : DE ++ DRest = V
Or : mem X DE \/ mem X DRest
============================
lookup SG X public
< Mem': case Or.
Subgoal 2.2.1:
Variables: SG V X Rest E L DRest DE
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : rf_level SG (addRecFieldExprs L E Rest) public @
Mem : mem X V
Lev1 : level SG E public *
Lev2 : rf_level SG Rest public *
Lev3 : join public public public
Vars1 : vars_rf Rest DRest
Vars2 : vars E DE
Vars3 : DE ++ DRest = V
Mem' : mem X DE
============================
lookup SG X public
< apply IH to Lev1 Vars2 Mem'.
Subgoal 2.2.1:
Variables: SG V X Rest E L DRest DE
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : rf_level SG (addRecFieldExprs L E Rest) public @
Mem : mem X V
Lev1 : level SG E public *
Lev2 : rf_level SG Rest public *
Lev3 : join public public public
Vars1 : vars_rf Rest DRest
Vars2 : vars E DE
Vars3 : DE ++ DRest = V
Mem' : mem X DE
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 2.2.2:
Variables: SG V X Rest E L DRest DE
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : rf_level SG (addRecFieldExprs L E Rest) public @
Mem : mem X V
Lev1 : level SG E public *
Lev2 : rf_level SG Rest public *
Lev3 : join public public public
Vars1 : vars_rf Rest DRest
Vars2 : vars E DE
Vars3 : DE ++ DRest = V
Mem' : mem X DRest
============================
lookup SG X public
< apply IH1 to Lev2 Vars1 Mem'.
Subgoal 2.2.2:
Variables: SG V X Rest E L DRest DE
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : rf_level SG (addRecFieldExprs L E Rest) public @
Mem : mem X V
Lev1 : level SG E public *
Lev2 : rf_level SG Rest public *
Lev3 : join public public public
Vars1 : vars_rf Rest DRest
Vars2 : vars E DE
Vars3 : DE ++ DRest = V
Mem' : mem X DRest
H1 : lookup SG X public
============================
lookup SG X public
< search.
Subgoal 2.3:
Variables: SG V X RFT
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : rf_level SG <unknown I recFieldExprs> public @
Vars : vars_rf <unknown I recFieldExprs> V
Mem : mem X V
Lev1 : |{recFieldExprs}- <unknown I recFieldExprs> ~~> RFT
Lev2 : rf_level SG RFT public *
============================
lookup SG X public
< V: apply proj_rf_vars_exist to Lev1 Vars.
Subgoal 2.3:
Variables: SG V X RFT V'
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : rf_level SG <unknown I recFieldExprs> public @
Vars : vars_rf <unknown I recFieldExprs> V
Mem : mem X V
Lev1 : |{recFieldExprs}- <unknown I recFieldExprs> ~~> RFT
Lev2 : rf_level SG RFT public *
V : vars_rf RFT V'
============================
lookup SG X public
< Mem: apply proj_rf_vars to Lev1 Vars V Mem.
Subgoal 2.3:
Variables: SG V X RFT V'
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : rf_level SG <unknown I recFieldExprs> public @
Vars : vars_rf <unknown I recFieldExprs> V
Mem : mem X V
Lev1 : |{recFieldExprs}- <unknown I recFieldExprs> ~~> RFT
Lev2 : rf_level SG RFT public *
V : vars_rf RFT V'
Mem1 : mem X V'
============================
lookup SG X public
< apply IH1 to Lev2 V Mem1.
Subgoal 2.3:
Variables: SG V X RFT V'
IH : forall SG E V X,
level SG E public * -> vars E V -> mem X V -> lookup SG X public
IH1 : forall SG RF V X,
rf_level SG RF public * -> vars_rf RF V -> mem X V -> lookup SG X public
Lev : rf_level SG <unknown I recFieldExprs> public @
Vars : vars_rf <unknown I recFieldExprs> V
Mem : mem X V
Lev1 : |{recFieldExprs}- <unknown I recFieldExprs> ~~> RFT
Lev2 : rf_level SG RFT public *
V : vars_rf RFT V'
Mem1 : mem X V'
H1 : lookup SG X public
============================
lookup SG X public
< search.
Proof completed.
< Define public_equiv :
(list (pair (string) seclevel)) ->
(list (pair (string) value)) ->
(list (pair (string) value)) ->
prop by
public_equiv S G1 G2 :=
((forall X V1 V2,
lookup S X public -> lookup G1 X V1 -> lookup G2 X V2 -> V1 = V2) /\
(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 V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
PEAB1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB2 : 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 V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
PEAB1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V1 V2,
lookup SG X public -> lookup GB X V1 -> lookup GC X V2 -> V1 = V2
PEBC1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC2 : 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 V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
PEAB1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V1 V2,
lookup SG X public -> lookup GB X V1 -> lookup GC X V2 -> V1 = V2
PEBC1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC2 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V
============================
forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GC X V2 -> V1 = V2
< intros LkpSec LkpA LkpC.
Subgoal 1:
Variables: SG GA GB GC X V1 V2
PEAB : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
PEAB1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V1 V2,
lookup SG X public -> lookup GB X V1 -> lookup GC X V2 -> V1 = V2
PEBC1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC2 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V
LkpSec : lookup SG X public
LkpA : lookup GA X V1
LkpC : lookup GC X V2
============================
V1 = V2
< LkpB: apply PEAB1 to LkpSec LkpA.
Subgoal 1:
Variables: SG GA GB GC X V1 V2
PEAB : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
PEAB1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V1 V2,
lookup SG X public -> lookup GB X V1 -> lookup GC X V2 -> V1 = V2
PEBC1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC2 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V
LkpSec : lookup SG X public
LkpA : lookup GA X V1
LkpC : lookup GC X V2
LkpB : lookup GB X V1
============================
V1 = V2
< apply PEBC to LkpSec LkpB LkpC.
Subgoal 1:
Variables: SG GA GB GC X V2
PEAB : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
PEAB1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V1 V2,
lookup SG X public -> lookup GB X V1 -> lookup GC X V2 -> V1 = V2
PEBC1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC2 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V
LkpSec : lookup SG X public
LkpA : lookup GA X V2
LkpC : lookup GC X V2
LkpB : lookup GB X V2
============================
V2 = V2
< search.
Subgoal 2:
Variables: SG GA GB GC
PEAB : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
PEAB1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V1 V2,
lookup SG X public -> lookup GB X V1 -> lookup GC X V2 -> V1 = V2
PEBC1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC2 : 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 2:
Variables: SG GA GB GC X V
PEAB : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
PEAB1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V1 V2,
lookup SG X public -> lookup GB X V1 -> lookup GC X V2 -> V1 = V2
PEBC1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC2 : 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 PEAB1 to LkpSec LkpA.
Subgoal 2:
Variables: SG GA GB GC X V
PEAB : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
PEAB1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V1 V2,
lookup SG X public -> lookup GB X V1 -> lookup GC X V2 -> V1 = V2
PEBC1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC2 : 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 PEBC1 to LkpSec LkpB.
Subgoal 2:
Variables: SG GA GB GC X V
PEAB : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
PEAB1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V1 V2,
lookup SG X public -> lookup GB X V1 -> lookup GC X V2 -> V1 = V2
PEBC1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC2 : 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 3:
Variables: SG GA GB GC
PEAB : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
PEAB1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V1 V2,
lookup SG X public -> lookup GB X V1 -> lookup GC X V2 -> V1 = V2
PEBC1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC2 : 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 3:
Variables: SG GA GB GC X V
PEAB : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
PEAB1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V1 V2,
lookup SG X public -> lookup GB X V1 -> lookup GC X V2 -> V1 = V2
PEBC1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC2 : 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 PEBC2 to LkpSec LkpC.
Subgoal 3:
Variables: SG GA GB GC X V
PEAB : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
PEAB1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V1 V2,
lookup SG X public -> lookup GB X V1 -> lookup GC X V2 -> V1 = V2
PEBC1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC2 : 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 PEAB2 to LkpSec LkpB.
Subgoal 3:
Variables: SG GA GB GC X V
PEAB : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
PEAB1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
PEAB2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
PEBC : forall X V1 V2,
lookup SG X public -> lookup GB X V1 -> lookup GC X V2 -> V1 = V2
PEBC1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V
PEBC2 : 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 V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : 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 V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
forall X V1 V2,
lookup SG X public -> lookup GB X V1 -> lookup GA X V2 -> V1 = V2
< intros LkpSec LkpB LkpA.
Subgoal 1:
Variables: SG GA GB X V1 V2
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpB : lookup GB X V1
LkpA : lookup GA X V2
============================
V1 = V2
< apply Rel to LkpSec LkpA LkpB.
Subgoal 1:
Variables: SG GA GB X V1
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpB : lookup GB X V1
LkpA : lookup GA X V1
============================
V1 = V1
< search.
Subgoal 2:
Variables: SG GA GB
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : 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 GA GB X V
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : 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 Rel2 to LkpSec LkpB.
Subgoal 2:
Variables: SG GA GB X V
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : 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 3:
Variables: SG GA GB
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : 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 3:
Variables: SG GA GB X V
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : 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 Rel1 to LkpSec LkpA.
Subgoal 3:
Variables: SG GA GB X V
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : 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 V1 V2, lookup SG X public -> lookup G X V1 -> lookup G X V2 -> V1 = V2
< intros LkpSec Lkp1 Lkp2.
Subgoal 1:
Variables: SG G X V1 V2
LkpSec : lookup SG X public
Lkp1 : lookup G X V1
Lkp2 : lookup G X V2
============================
V1 = V2
< apply lookup_unique to Lkp1 Lkp2.
Subgoal 1:
Variables: SG G X V2
LkpSec : lookup SG X public
Lkp1 : lookup G X V2
Lkp2 : lookup G X V2
============================
V2 = V2
< 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.
Subgoal 3:
Variables: SG G
============================
forall X V, lookup SG X public -> lookup G X V -> lookup G X V
< intros.
Subgoal 3:
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 V1 V2,
lookup SG X public -> lookup G1 X V1 -> lookup G2 X V2 -> V1 = V2
Equiv1 : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V
Equiv2 : 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 V1 V2,
lookup SG X public -> lookup G1 X V1 -> lookup G2 X V2 -> V1 = V2
Equiv1 : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V
Equiv2 : 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 V1 V2,
lookup SG X public -> lookup G1 X V1 -> lookup G2 X V2 -> V1 = V2
Equiv1 : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V
Equiv2 : 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 V1 V2,
lookup SG X public -> lookup G1 X V1 -> lookup G2 X V2 -> V1 = V2
Equiv1 : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V
Equiv2 : 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
< apply Equiv to LkpS Lkp1 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 V1 V2,
lookup SG X public -> lookup G1 X V1 -> lookup G2 X V2 -> V1 = V2
Equiv1 : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V
Equiv2 : 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
============================
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 V1 V2,
lookup SG X public -> lookup G1 X V1 -> lookup G2 X V2 -> V1 = V2
Equiv1 : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V
Equiv2 : 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,
level_rf_unique : forall SG RF S1 S2,
LevA : rf_level SG RF S1 ->
LevB : rf_level SG RF S2 ->
S1 = S2
on LevA.
Subgoal 1.1:
Variables: SG S2 I
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (num I) public @
LevB : level SG (num I) S2
============================
public = S2
< case LevB.
Subgoal 1.1:
Variables: SG I
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (num I) public @
============================
public = public
< search.
Subgoal 1.2:
Variables: SG S1 S2 S3 S4 E2 E1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (plus E1 E2) S1 @
LevB : level SG (plus E1 E2) S2
LevA1 : level SG E1 S3 *
LevA2 : level SG E2 S4 *
LevA3 : join S3 S4 S1
============================
S1 = S2
< LevB: case LevB.
Subgoal 1.2:
Variables: SG S1 S2 S3 S4 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (plus E1 E2) S1 @
LevA1 : level SG E1 S3 *
LevA2 : level SG E2 S4 *
LevA3 : join S3 S4 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply IH to LevA1 LevB.
Subgoal 1.2:
Variables: SG S1 S2 S4 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (plus E1 E2) S1 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S4 *
LevA3 : join S5 S4 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply IH to LevA2 LevB1.
Subgoal 1.2:
Variables: SG S1 S2 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (plus E1 E2) S1 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S6 *
LevA3 : join S5 S6 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply join_unique to LevA3 LevB2.
Subgoal 1.2:
Variables: SG S2 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (plus E1 E2) S2 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S6 *
LevA3 : join S5 S6 S2
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S2 = S2
< search.
Subgoal 1.3:
Variables: SG S1 S2 X
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (name X) S1 @
LevB : level SG (name X) S2
LevA1 : lookup SG X S1
============================
S1 = S2
< LevB: case LevB.
Subgoal 1.3:
Variables: SG S1 S2 X
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (name X) S1 @
LevA1 : lookup SG X S1
LevB : lookup SG X S2
============================
S1 = S2
< apply lookup_unique to LevA1 LevB.
Subgoal 1.3:
Variables: SG S2 X
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (name X) S2 @
LevA1 : lookup SG X S2
LevB : lookup SG X S2
============================
S2 = S2
< search.
Subgoal 1.4:
Variables: SG S1 S2 S3 S4 E2 E1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (greater E1 E2) S1 @
LevB : level SG (greater E1 E2) S2
LevA1 : level SG E1 S3 *
LevA2 : level SG E2 S4 *
LevA3 : join S3 S4 S1
============================
S1 = S2
< LevB: case LevB.
Subgoal 1.4:
Variables: SG S1 S2 S3 S4 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (greater E1 E2) S1 @
LevA1 : level SG E1 S3 *
LevA2 : level SG E2 S4 *
LevA3 : join S3 S4 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply IH to LevA1 LevB.
Subgoal 1.4:
Variables: SG S1 S2 S4 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (greater E1 E2) S1 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S4 *
LevA3 : join S5 S4 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply IH to LevA2 LevB1.
Subgoal 1.4:
Variables: SG S1 S2 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (greater E1 E2) S1 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S6 *
LevA3 : join S5 S6 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply join_unique to LevA3 LevB2.
Subgoal 1.4:
Variables: SG S2 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (greater E1 E2) S2 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S6 *
LevA3 : join S5 S6 S2
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S2 = S2
< search.
Subgoal 1.5:
Variables: SG S1 S2 S3 S4 E2 E1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (eq E1 E2) S1 @
LevB : level SG (eq E1 E2) S2
LevA1 : level SG E1 S3 *
LevA2 : level SG E2 S4 *
LevA3 : join S3 S4 S1
============================
S1 = S2
< LevB: case LevB.
Subgoal 1.5:
Variables: SG S1 S2 S3 S4 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (eq E1 E2) S1 @
LevA1 : level SG E1 S3 *
LevA2 : level SG E2 S4 *
LevA3 : join S3 S4 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply IH to LevA1 LevB.
Subgoal 1.5:
Variables: SG S1 S2 S4 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (eq E1 E2) S1 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S4 *
LevA3 : join S5 S4 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply IH to LevA2 LevB1.
Subgoal 1.5:
Variables: SG S1 S2 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (eq E1 E2) S1 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S6 *
LevA3 : join S5 S6 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply join_unique to LevA3 LevB2.
Subgoal 1.5:
Variables: SG S2 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (eq E1 E2) S2 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S6 *
LevA3 : join S5 S6 S2
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S2 = S2
< search.
Subgoal 1.6:
Variables: SG S1 S2 S3 S4 E2 E1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (and E1 E2) S1 @
LevB : level SG (and E1 E2) S2
LevA1 : level SG E1 S3 *
LevA2 : level SG E2 S4 *
LevA3 : join S3 S4 S1
============================
S1 = S2
< LevB: case LevB.
Subgoal 1.6:
Variables: SG S1 S2 S3 S4 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (and E1 E2) S1 @
LevA1 : level SG E1 S3 *
LevA2 : level SG E2 S4 *
LevA3 : join S3 S4 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply IH to LevA1 LevB.
Subgoal 1.6:
Variables: SG S1 S2 S4 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (and E1 E2) S1 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S4 *
LevA3 : join S5 S4 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply IH to LevA2 LevB1.
Subgoal 1.6:
Variables: SG S1 S2 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (and E1 E2) S1 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S6 *
LevA3 : join S5 S6 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply join_unique to LevA3 LevB2.
Subgoal 1.6:
Variables: SG S2 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (and E1 E2) S2 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S6 *
LevA3 : join S5 S6 S2
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S2 = S2
< search.
Subgoal 1.7:
Variables: SG S1 S2 S3 S4 E2 E1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (or E1 E2) S1 @
LevB : level SG (or E1 E2) S2
LevA1 : level SG E1 S3 *
LevA2 : level SG E2 S4 *
LevA3 : join S3 S4 S1
============================
S1 = S2
< LevB: case LevB.
Subgoal 1.7:
Variables: SG S1 S2 S3 S4 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (or E1 E2) S1 @
LevA1 : level SG E1 S3 *
LevA2 : level SG E2 S4 *
LevA3 : join S3 S4 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply IH to LevA1 LevB.
Subgoal 1.7:
Variables: SG S1 S2 S4 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (or E1 E2) S1 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S4 *
LevA3 : join S5 S4 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply IH to LevA2 LevB1.
Subgoal 1.7:
Variables: SG S1 S2 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (or E1 E2) S1 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S6 *
LevA3 : join S5 S6 S1
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply join_unique to LevA3 LevB2.
Subgoal 1.7:
Variables: SG S2 E2 E1 S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (or E1 E2) S2 @
LevA1 : level SG E1 S5 *
LevA2 : level SG E2 S6 *
LevA3 : join S5 S6 S2
LevB : level SG E1 S5
LevB1 : level SG E2 S6
LevB2 : join S5 S6 S2
============================
S2 = S2
< search.
Subgoal 1.8:
Variables: SG S2
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG true public @
LevB : level SG true S2
============================
public = S2
< case LevB.
Subgoal 1.8:
Variables: SG
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG true public @
============================
public = public
< search.
Subgoal 1.9:
Variables: SG S2
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG false public @
LevB : level SG false S2
============================
public = S2
< case LevB.
Subgoal 1.9:
Variables: SG
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG false public @
============================
public = public
< search.
Subgoal 1.10:
Variables: SG S1 S2 Fields
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (recBuild Fields) S1 @
LevB : level SG (recBuild Fields) S2
LevA1 : rf_level SG Fields S1 *
============================
S1 = S2
< LevB: case LevB.
Subgoal 1.10:
Variables: SG S1 S2 Fields
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (recBuild Fields) S1 @
LevA1 : rf_level SG Fields S1 *
LevB : rf_level SG Fields S2
============================
S1 = S2
< apply IH1 to LevA1 LevB.
Subgoal 1.10:
Variables: SG S2 Fields
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (recBuild Fields) S2 @
LevA1 : rf_level SG Fields S2 *
LevB : rf_level SG Fields S2
============================
S2 = S2
< search.
Subgoal 1.11:
Variables: SG S1 S2 Field Rec
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (recFieldAccess Rec Field) S1 @
LevB : level SG (recFieldAccess Rec Field) S2
LevA1 : level SG Rec S1 *
============================
S1 = S2
< LevB: case LevB.
Subgoal 1.11:
Variables: SG S1 S2 Field Rec
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (recFieldAccess Rec Field) S1 @
LevA1 : level SG Rec S1 *
LevB : level SG Rec S2
============================
S1 = S2
< apply IH to LevA1 LevB.
Subgoal 1.11:
Variables: SG S2 Field Rec
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG (recFieldAccess Rec Field) S2 @
LevA1 : level SG Rec S2 *
LevB : level SG Rec S2
============================
S2 = S2
< search.
Subgoal 1.12:
Variables: SG S1 S2 ET
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG <unknown I e> S1 @
LevB : level SG <unknown I e> S2
LevA1 : |{e}- <unknown I e> ~~> ET
LevA2 : level SG ET S1 *
============================
S1 = S2
< LevB: case LevB.
Subgoal 1.12:
Variables: SG S1 S2 ET ET1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG <unknown I e> S1 @
LevA1 : |{e}- <unknown I e> ~~> ET
LevA2 : level SG ET S1 *
LevB : |{e}- <unknown I e> ~~> ET1
LevB1 : level SG ET1 S2
============================
S1 = S2
< apply proj_e_unique to LevA1 LevB.
Subgoal 1.12:
Variables: SG S1 S2 ET1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG <unknown I e> S1 @
LevA1 : |{e}- <unknown I e> ~~> ET1
LevA2 : level SG ET1 S1 *
LevB : |{e}- <unknown I e> ~~> ET1
LevB1 : level SG ET1 S2
============================
S1 = S2
< apply IH to LevA2 LevB1.
Subgoal 1.12:
Variables: SG S2 ET1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : level SG <unknown I e> S2 @
LevA1 : |{e}- <unknown I e> ~~> ET1
LevA2 : level SG ET1 S2 *
LevB : |{e}- <unknown I e> ~~> ET1
LevB1 : level SG ET1 S2
============================
S2 = S2
< search.
Subgoal 2.1:
Variables: SG S2
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : rf_level SG endRecFieldExprs public @
LevB : rf_level SG endRecFieldExprs S2
============================
public = S2
< case LevB.
Subgoal 2.1:
Variables: SG
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : rf_level SG endRecFieldExprs public @
============================
public = public
< search.
Subgoal 2.2:
Variables: SG S1 S2 S3 S4 Rest E L
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : rf_level SG (addRecFieldExprs L E Rest) S1 @
LevB : rf_level SG (addRecFieldExprs L E Rest) S2
LevA1 : level SG E S3 *
LevA2 : rf_level SG Rest S4 *
LevA3 : join S3 S4 S1
============================
S1 = S2
< LevB: case LevB.
Subgoal 2.2:
Variables: SG S1 S2 S3 S4 Rest E L S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : rf_level SG (addRecFieldExprs L E Rest) S1 @
LevA1 : level SG E S3 *
LevA2 : rf_level SG Rest S4 *
LevA3 : join S3 S4 S1
LevB : level SG E S5
LevB1 : rf_level SG Rest S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply IH to LevA1 LevB.
Subgoal 2.2:
Variables: SG S1 S2 S4 Rest E L S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : rf_level SG (addRecFieldExprs L E Rest) S1 @
LevA1 : level SG E S5 *
LevA2 : rf_level SG Rest S4 *
LevA3 : join S5 S4 S1
LevB : level SG E S5
LevB1 : rf_level SG Rest S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply IH1 to LevA2 LevB1.
Subgoal 2.2:
Variables: SG S1 S2 Rest E L S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : rf_level SG (addRecFieldExprs L E Rest) S1 @
LevA1 : level SG E S5 *
LevA2 : rf_level SG Rest S6 *
LevA3 : join S5 S6 S1
LevB : level SG E S5
LevB1 : rf_level SG Rest S6
LevB2 : join S5 S6 S2
============================
S1 = S2
< apply join_unique to LevA3 LevB2.
Subgoal 2.2:
Variables: SG S2 Rest E L S5 S6
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : rf_level SG (addRecFieldExprs L E Rest) S2 @
LevA1 : level SG E S5 *
LevA2 : rf_level SG Rest S6 *
LevA3 : join S5 S6 S2
LevB : level SG E S5
LevB1 : rf_level SG Rest S6
LevB2 : join S5 S6 S2
============================
S2 = S2
< search.
Subgoal 2.3:
Variables: SG S1 S2 RFT
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : rf_level SG <unknown I recFieldExprs> S1 @
LevB : rf_level SG <unknown I recFieldExprs> S2
LevA1 : |{recFieldExprs}- <unknown I recFieldExprs> ~~> RFT
LevA2 : rf_level SG RFT S1 *
============================
S1 = S2
< LevB: case LevB.
Subgoal 2.3:
Variables: SG S1 S2 RFT RFT1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : rf_level SG <unknown I recFieldExprs> S1 @
LevA1 : |{recFieldExprs}- <unknown I recFieldExprs> ~~> RFT
LevA2 : rf_level SG RFT S1 *
LevB : |{recFieldExprs}- <unknown I recFieldExprs> ~~> RFT1
LevB1 : rf_level SG RFT1 S2
============================
S1 = S2
< apply proj_rf_unique to LevA1 LevB.
Subgoal 2.3:
Variables: SG S1 S2 RFT1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : rf_level SG <unknown I recFieldExprs> S1 @
LevA1 : |{recFieldExprs}- <unknown I recFieldExprs> ~~> RFT1
LevA2 : rf_level SG RFT1 S1 *
LevB : |{recFieldExprs}- <unknown I recFieldExprs> ~~> RFT1
LevB1 : rf_level SG RFT1 S2
============================
S1 = S2
< apply IH1 to LevA2 LevB1.
Subgoal 2.3:
Variables: SG S2 RFT1
IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2
IH1 : forall SG RF S1 S2, rf_level SG RF S1 * -> rf_level SG RF S2 -> S1 = S2
LevA : rf_level SG <unknown I recFieldExprs> S2 @
LevA1 : |{recFieldExprs}- <unknown I recFieldExprs> ~~> RFT1
LevA2 : rf_level SG RFT1 S2 *
LevB : |{recFieldExprs}- <unknown I recFieldExprs> ~~> RFT1
LevB1 : rf_level SG RFT1 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 PC SG SG2 G G2 C X,
Sec : secure PC SG C SG2 ->
Ev : eval_c G C G2 ->
LkpSec : lookup SG X public ->
lookup SG2 X public
on Ev.
Subgoal 1:
Variables: PC SG SG2 G2 X
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure PC SG noop SG2
Ev : eval_c G2 noop G2 @
LkpSec : lookup SG X public
============================
lookup SG2 X public
< case Sec.
Subgoal 1:
Variables: PC SG2 G2 X
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G2 noop G2 @
LkpSec : lookup SG2 X public
============================
lookup SG2 X public
< search.
Subgoal 2:
Variables: PC SG SG2 G G2 X G1 C2 C1
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure PC SG (seq C1 C2) SG2
Ev : eval_c G (seq C1 C2) G2 @
LkpSec : lookup SG X public
Ev1 : eval_c G C1 G1 *
Ev2 : eval_c G1 C2 G2 *
============================
lookup SG2 X public
< Sec: case Sec.
Subgoal 2:
Variables: PC SG SG2 G G2 X G1 C2 C1 G3
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (seq C1 C2) G2 @
LkpSec : lookup SG X public
Ev1 : eval_c G C1 G1 *
Ev2 : eval_c G1 C2 G2 *
Sec : secure PC SG C1 G3
Sec1 : secure PC G3 C2 SG2
============================
lookup SG2 X public
< apply IH to Sec Ev1 _.
Subgoal 2:
Variables: PC SG SG2 G G2 X G1 C2 C1 G3
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (seq C1 C2) G2 @
LkpSec : lookup SG X public
Ev1 : eval_c G C1 G1 *
Ev2 : eval_c G1 C2 G2 *
Sec : secure PC SG C1 G3
Sec1 : secure PC G3 C2 SG2
H1 : lookup G3 X public
============================
lookup SG2 X public
< apply IH to Sec1 Ev2 _.
Subgoal 2:
Variables: PC SG SG2 G G2 X G1 C2 C1 G3
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (seq C1 C2) G2 @
LkpSec : lookup SG X public
Ev1 : eval_c G C1 G1 *
Ev2 : eval_c G1 C2 G2 *
Sec : secure PC SG C1 G3
Sec1 : secure PC G3 C2 SG2
H1 : lookup G3 X public
H2 : lookup SG2 X public
============================
lookup SG2 X public
< search.
Subgoal 3:
Variables: PC SG SG2 G X V X1 E Ty
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure PC SG (declare X1 Ty E) SG2
Ev : eval_c G (declare X1 Ty E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
============================
lookup SG2 X public
< Sec: case Sec.
Subgoal 3:
Variables: SG G X V X1 E Ty
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declare X1 Ty E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E public
Sec1 : no_lookup SG X1
============================
lookup ((X1, public)::SG) X public
< assert X1 = X -> false.
Subgoal 3.1:
Variables: SG G X V X1 E Ty
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declare X1 Ty E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E public
Sec1 : no_lookup SG X1
============================
X1 = X -> false
< intros Eq.
Subgoal 3.1:
Variables: SG G X V X1 E Ty
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declare X1 Ty E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E public
Sec1 : no_lookup SG X1
Eq : X1 = X
============================
false
< case Eq.
Subgoal 3.1:
Variables: SG G X V E Ty
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declare X Ty E) ((X, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E public
Sec1 : no_lookup SG X
============================
false
< apply no_lookup to Sec1 LkpSec.
Subgoal 3:
Variables: SG G X V X1 E Ty
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declare X1 Ty E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E public
Sec1 : no_lookup SG X1
H1 : X1 = X -> false
============================
lookup ((X1, public)::SG) X public
< search.
Subgoal 4:
Variables: PC SG SG2 G X V X1 E
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure PC SG (assign X1 E) SG2
Ev : eval_c G (assign X1 E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
============================
lookup SG2 X public
< case Sec.
Subgoal 4.1:
Variables: SG2 G X V X1 E
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (assign X1 E) ((X1, V)::G) @
LkpSec : lookup SG2 X public
Ev1 : eval_e G E V
H1 : level SG2 E public
H2 : lookup SG2 X1 public
============================
lookup SG2 X public
< search.
Subgoal 4.2:
Variables: PC SG2 G X V X1 E S
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (assign X1 E) ((X1, V)::G) @
LkpSec : lookup SG2 X public
Ev1 : eval_e G E V
H1 : level SG2 E S
H2 : lookup SG2 X1 private
============================
lookup SG2 X public
< search.
Subgoal 5:
Variables: PC SG SG2 G G2 X Else Then Cond
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure PC SG (ifThenElse Cond Then Else) SG2
Ev : eval_c G (ifThenElse Cond Then Else) G2 @
LkpSec : lookup SG X public
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Then G2 *
============================
lookup SG2 X public
< Sec: case Sec.
Subgoal 5:
Variables: PC SG2 G G2 X Else Then Cond S NewPC GTh GEl
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (ifThenElse Cond Then Else) G2 @
LkpSec : lookup SG2 X public
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Then G2 *
Sec : level SG2 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG2 Then GTh
Sec3 : secure NewPC SG2 Else GEl
============================
lookup SG2 X public
< apply IH to Sec2 Ev2 _.
Subgoal 5:
Variables: PC SG2 G G2 X Else Then Cond S NewPC GTh GEl
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (ifThenElse Cond Then Else) G2 @
LkpSec : lookup SG2 X public
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Then G2 *
Sec : level SG2 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG2 Then GTh
Sec3 : secure NewPC SG2 Else GEl
H1 : lookup GTh X public
============================
lookup SG2 X public
< search.
Subgoal 6:
Variables: PC SG SG2 G G2 X Else Then Cond
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure PC SG (ifThenElse Cond Then Else) SG2
Ev : eval_c G (ifThenElse Cond Then Else) G2 @
LkpSec : lookup SG X public
Ev1 : eval_e G Cond falseVal
Ev2 : eval_c G Else G2 *
============================
lookup SG2 X public
< Sec: case Sec.
Subgoal 6:
Variables: PC SG2 G G2 X Else Then Cond S NewPC GTh GEl
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (ifThenElse Cond Then Else) G2 @
LkpSec : lookup SG2 X public
Ev1 : eval_e G Cond falseVal
Ev2 : eval_c G Else G2 *
Sec : level SG2 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG2 Then GTh
Sec3 : secure NewPC SG2 Else GEl
============================
lookup SG2 X public
< apply IH to Sec3 Ev2 _.
Subgoal 6:
Variables: PC SG2 G G2 X Else Then Cond S NewPC GTh GEl
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (ifThenElse Cond Then Else) G2 @
LkpSec : lookup SG2 X public
Ev1 : eval_e G Cond falseVal
Ev2 : eval_c G Else G2 *
Sec : level SG2 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG2 Then GTh
Sec3 : secure NewPC SG2 Else GEl
H1 : lookup GEl X public
============================
lookup SG2 X public
< search.
Subgoal 7:
Variables: PC SG SG2 G2 X Body Cond
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure PC SG (while Cond Body) SG2
Ev : eval_c G2 (while Cond Body) G2 @
LkpSec : lookup SG X public
Ev1 : eval_e G2 Cond falseVal
============================
lookup SG2 X public
< case Sec.
Subgoal 7:
Variables: PC SG2 G2 X Body Cond S NewPC G1
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G2 (while Cond Body) G2 @
LkpSec : lookup SG2 X public
Ev1 : eval_e G2 Cond falseVal
H1 : level SG2 Cond S
H2 : join PC S NewPC
H3 : secure NewPC SG2 Body G1
============================
lookup SG2 X public
< search.
Subgoal 8:
Variables: PC SG SG2 G G2 X G1 Body Cond
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure PC SG (while Cond Body) SG2
Ev : eval_c G (while Cond Body) G2 @
LkpSec : lookup SG X public
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G1 *
Ev3 : eval_c G1 (while Cond Body) G2 *
============================
lookup SG2 X public
< Sec: case Sec (keep).
Subgoal 8:
Variables: PC SG2 G G2 X G1 Body Cond S NewPC G3
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure PC SG2 (while Cond Body) SG2
Ev : eval_c G (while Cond Body) G2 @
LkpSec : lookup SG2 X public
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G1 *
Ev3 : eval_c G1 (while Cond Body) G2 *
Sec1 : level SG2 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG2 Body G3
============================
lookup SG2 X public
< apply IH to Sec3 Ev2 _.
Subgoal 8:
Variables: PC SG2 G G2 X G1 Body Cond S NewPC G3
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure PC SG2 (while Cond Body) SG2
Ev : eval_c G (while Cond Body) G2 @
LkpSec : lookup SG2 X public
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G1 *
Ev3 : eval_c G1 (while Cond Body) G2 *
Sec1 : level SG2 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG2 Body G3
H1 : lookup G3 X public
============================
lookup SG2 X public
< apply IH to Sec Ev3 _.
Subgoal 8:
Variables: PC SG2 G G2 X G1 Body Cond S NewPC G3
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure PC SG2 (while Cond Body) SG2
Ev : eval_c G (while Cond Body) G2 @
LkpSec : lookup SG2 X public
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G1 *
Ev3 : eval_c G1 (while Cond Body) G2 *
Sec1 : level SG2 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG2 Body G3
H1 : lookup G3 X public
H2 : lookup SG2 X public
============================
lookup SG2 X public
< search.
Subgoal 9:
Variables: PC SG SG2 G X V Fields Result Rec E RecFields
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure PC SG (recUpdate Rec RecFields E) SG2
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
============================
lookup SG2 X public
< case Sec.
Subgoal 9.1:
Variables: SG2 G X V Fields Result Rec E RecFields
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
LkpSec : lookup SG2 X public
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
H1 : level SG2 E public
H2 : lookup SG2 Rec public
============================
lookup SG2 X public
< search.
Subgoal 9.2:
Variables: PC SG2 G X V Fields Result Rec E RecFields S
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
LkpSec : lookup SG2 X public
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
H1 : level SG2 E S
H2 : lookup SG2 Rec private
============================
lookup SG2 X public
< search.
Subgoal 10:
Variables: PC SG SG2 G X V X1 E Ty S
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure PC SG (declareSec X1 S Ty E) SG2
Ev : eval_c G (declareSec X1 S Ty E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
============================
lookup SG2 X public
< Sec: case Sec.
Subgoal 10.1:
Variables: PC SG G X V X1 E Ty S1
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declareSec X1 private Ty E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E S1
Sec1 : no_lookup SG X1
============================
lookup ((X1, private)::SG) X public
< assert X1 = X -> false.
Subgoal 10.1.1:
Variables: PC SG G X V X1 E Ty S1
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declareSec X1 private Ty E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E S1
Sec1 : no_lookup SG X1
============================
X1 = X -> false
< intros Eq.
Subgoal 10.1.1:
Variables: PC SG G X V X1 E Ty S1
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declareSec X1 private Ty E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E S1
Sec1 : no_lookup SG X1
Eq : X1 = X
============================
false
< case Eq.
Subgoal 10.1.1:
Variables: PC SG G X V E Ty S1
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declareSec X private Ty E) ((X, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E S1
Sec1 : no_lookup SG X
============================
false
< apply no_lookup to Sec1 LkpSec.
Subgoal 10.1:
Variables: PC SG G X V X1 E Ty S1
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declareSec X1 private Ty E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E S1
Sec1 : no_lookup SG X1
H1 : X1 = X -> false
============================
lookup ((X1, private)::SG) X public
< search.
Subgoal 10.2:
Variables: SG G X V X1 E Ty
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declareSec X1 public Ty E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E public
Sec1 : no_lookup SG X1
============================
lookup ((X1, public)::SG) X public
< assert X1 = X -> false.
Subgoal 10.2.1:
Variables: SG G X V X1 E Ty
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declareSec X1 public Ty E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E public
Sec1 : no_lookup SG X1
============================
X1 = X -> false
< intros Eq.
Subgoal 10.2.1:
Variables: SG G X V X1 E Ty
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declareSec X1 public Ty E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E public
Sec1 : no_lookup SG X1
Eq : X1 = X
============================
false
< case Eq.
Subgoal 10.2.1:
Variables: SG G X V E Ty
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declareSec X public Ty E) ((X, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E public
Sec1 : no_lookup SG X
============================
false
< apply no_lookup to Sec1 LkpSec.
Subgoal 10.2:
Variables: SG G X V X1 E Ty
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G (declareSec X1 public Ty E) ((X1, V)::G) @
LkpSec : lookup SG X public
Ev1 : eval_e G E V
Sec : level SG E public
Sec1 : no_lookup SG X1
H1 : X1 = X -> false
============================
lookup ((X1, public)::SG) X public
< search.
Subgoal 11:
Variables: PC SG SG2 G G2 X T
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Sec : secure PC SG <unknown K eval_c> SG2
Ev : eval_c G <unknown K eval_c> G2 @
LkpSec : lookup SG X public
Ev1 : |{c}- <unknown K eval_c> ~~> T
Ev2 : eval_c G T G2 *
============================
lookup SG2 X public
< Sec: case Sec.
Subgoal 11:
Variables: PC SG SG2 G G2 X T CT
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G <unknown K eval_c> G2 @
LkpSec : lookup SG X public
Ev1 : |{c}- <unknown K eval_c> ~~> T
Ev2 : eval_c G T G2 *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG2
============================
lookup SG2 X public
< apply proj_c_unique to Ev1 Sec.
Subgoal 11:
Variables: PC SG SG2 G G2 X CT
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G <unknown K eval_c> G2 @
LkpSec : lookup SG X public
Ev1 : |{c}- <unknown K eval_c> ~~> CT
Ev2 : eval_c G CT G2 *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG2
============================
lookup SG2 X public
< apply IH to Sec1 Ev2 _.
Subgoal 11:
Variables: PC SG SG2 G G2 X CT
IH : forall PC SG SG2 G G2 C X,
secure PC SG C SG2 -> eval_c G C G2 * -> lookup SG X public -> lookup SG2 X public
Ev : eval_c G <unknown K eval_c> G2 @
LkpSec : lookup SG X public
Ev1 : |{c}- <unknown K eval_c> ~~> CT
Ev2 : eval_c G CT G2 *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT 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 V1 V2,
lookup SG' X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Eq1 : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq2 : 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 V1 V2,
lookup SG' X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Eq1 : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq2 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V
============================
forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
< intros LkpSec LkpA LkpB.
Subgoal 1:
Variables: SG SG' GA GB X V1 V2
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V1 V2,
lookup SG' X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Eq1 : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq2 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpA : lookup GA X V1
LkpB : lookup GB X V2
============================
V1 = V2
< LkpSG': apply LkpEquiv to LkpSec.
Subgoal 1:
Variables: SG SG' GA GB X V1 V2
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V1 V2,
lookup SG' X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Eq1 : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq2 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpA : lookup GA X V1
LkpB : lookup GB X V2
LkpSG' : lookup SG' X public
============================
V1 = V2
< apply Eq to LkpSG' LkpA LkpB.
Subgoal 1:
Variables: SG SG' GA GB X V2
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V1 V2,
lookup SG' X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Eq1 : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq2 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG X public
LkpA : lookup GA X V2
LkpB : lookup GB X V2
LkpSG' : lookup SG' X public
============================
V2 = V2
< search.
Subgoal 2:
Variables: SG SG' GA GB
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V1 V2,
lookup SG' X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Eq1 : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq2 : 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 SG' GA GB X V
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V1 V2,
lookup SG' X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Eq1 : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq2 : 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 2:
Variables: SG SG' GA GB X V
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V1 V2,
lookup SG' X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Eq1 : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq2 : 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 Eq1 to LkpSG' LkpA.
Subgoal 2:
Variables: SG SG' GA GB X V
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V1 V2,
lookup SG' X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Eq1 : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq2 : 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 3:
Variables: SG SG' GA GB
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V1 V2,
lookup SG' X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Eq1 : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq2 : 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 3:
Variables: SG SG' GA GB X V
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V1 V2,
lookup SG' X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Eq1 : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq2 : 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 3:
Variables: SG SG' GA GB X V
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V1 V2,
lookup SG' X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Eq1 : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq2 : 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 Eq2 to LkpSG' LkpB.
Subgoal 3:
Variables: SG SG' GA GB X V
LkpEquiv : forall X, lookup SG X public -> lookup SG' X public
Eq : forall X V1 V2,
lookup SG' X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Eq1 : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V
Eq2 : 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 C S SG SG1 G G1,
Sec : secure S SG C SG1 ->
NEq : (S = public -> false) ->
Ev : eval_c G C G1 ->
public_equiv SG G G1
on Ev.
Subgoal 1:
Variables: S SG SG1 G1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG noop SG1
NEq : S = public -> false
Ev : eval_c G1 noop G1 @
============================
public_equiv SG G1 G1
< unfold .
Subgoal 1.1:
Variables: S SG SG1 G1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG noop SG1
NEq : S = public -> false
Ev : eval_c G1 noop G1 @
============================
forall X V1 V2,
lookup SG X public -> lookup G1 X V1 -> lookup G1 X V2 -> V1 = V2
< intros LkpSec LkpA LkpB.
Subgoal 1.1:
Variables: S SG SG1 G1 X V1 V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG noop SG1
NEq : S = public -> false
Ev : eval_c G1 noop G1 @
LkpSec : lookup SG X public
LkpA : lookup G1 X V1
LkpB : lookup G1 X V2
============================
V1 = V2
< apply lookup_unique to LkpA LkpB.
Subgoal 1.1:
Variables: S SG SG1 G1 X V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG noop SG1
NEq : S = public -> false
Ev : eval_c G1 noop G1 @
LkpSec : lookup SG X public
LkpA : lookup G1 X V2
LkpB : lookup G1 X V2
============================
V2 = V2
< search.
Subgoal 1.2:
Variables: S SG SG1 G1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG noop SG1
NEq : S = public -> false
Ev : eval_c G1 noop G1 @
============================
forall X V, lookup SG X public -> lookup G1 X V -> lookup G1 X V
< intros.
Subgoal 1.2:
Variables: S SG SG1 G1 X V
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG noop SG1
NEq : S = public -> false
Ev : eval_c G1 noop G1 @
H1 : lookup SG X public
H2 : lookup G1 X V
============================
lookup G1 X V
< search.
Subgoal 1.3:
Variables: S SG SG1 G1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG noop SG1
NEq : S = public -> false
Ev : eval_c G1 noop G1 @
============================
forall X V, lookup SG X public -> lookup G1 X V -> lookup G1 X V
< intros.
Subgoal 1.3:
Variables: S SG SG1 G1 X V
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG noop SG1
NEq : S = public -> false
Ev : eval_c G1 noop G1 @
H1 : lookup SG X public
H2 : lookup G1 X V
============================
lookup G1 X V
< search.
Subgoal 2:
Variables: S SG SG1 G G1 G2 C2 C1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (seq C1 C2) SG1
NEq : S = public -> false
Ev : eval_c G (seq C1 C2) G1 @
Ev1 : eval_c G C1 G2 *
Ev2 : eval_c G2 C2 G1 *
============================
public_equiv SG G G1
< Sec: case Sec.
Subgoal 2:
Variables: S SG SG1 G G1 G2 C2 C1 G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (seq C1 C2) G1 @
Ev1 : eval_c G C1 G2 *
Ev2 : eval_c G2 C2 G1 *
Sec : secure S SG C1 G3
Sec1 : secure S G3 C2 SG1
============================
public_equiv SG G G1
< EqGG2: apply IH to _ _ Ev1.
Subgoal 2:
Variables: S SG SG1 G G1 G2 C2 C1 G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (seq C1 C2) G1 @
Ev1 : eval_c G C1 G2 *
Ev2 : eval_c G2 C2 G1 *
Sec : secure S SG C1 G3
Sec1 : secure S G3 C2 SG1
EqGG2 : public_equiv SG G G2
============================
public_equiv SG G G1
< EqG2G1: apply IH to _ _ Ev2.
Subgoal 2:
Variables: S SG SG1 G G1 G2 C2 C1 G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (seq C1 C2) G1 @
Ev1 : eval_c G C1 G2 *
Ev2 : eval_c G2 C2 G1 *
Sec : secure S SG C1 G3
Sec1 : secure S G3 C2 SG1
EqGG2 : public_equiv SG G G2
EqG2G1 : public_equiv G3 G2 G1
============================
public_equiv SG G G1
< LkpEq1: assert forall X,
lookup SG X public -> lookup G3 X public.
Subgoal 2.1:
Variables: S SG SG1 G G1 G2 C2 C1 G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (seq C1 C2) G1 @
Ev1 : eval_c G C1 G2 *
Ev2 : eval_c G2 C2 G1 *
Sec : secure S SG C1 G3
Sec1 : secure S G3 C2 SG1
EqGG2 : public_equiv SG G G2
EqG2G1 : public_equiv G3 G2 G1
============================
forall X, lookup SG X public -> lookup G3 X public
< intros Lkp.
Subgoal 2.1:
Variables: S SG SG1 G G1 G2 C2 C1 G3 X
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (seq C1 C2) G1 @
Ev1 : eval_c G C1 G2 *
Ev2 : eval_c G2 C2 G1 *
Sec : secure S SG C1 G3
Sec1 : secure S G3 C2 SG1
EqGG2 : public_equiv SG G G2
EqG2G1 : public_equiv G3 G2 G1
Lkp : lookup SG X public
============================
lookup G3 X public
< apply stmt_public_branch to Sec Ev1 Lkp.
Subgoal 2.1:
Variables: S SG SG1 G G1 G2 C2 C1 G3 X
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (seq C1 C2) G1 @
Ev1 : eval_c G C1 G2 *
Ev2 : eval_c G2 C2 G1 *
Sec : secure S SG C1 G3
Sec1 : secure S G3 C2 SG1
EqGG2 : public_equiv SG G G2
EqG2G1 : public_equiv G3 G2 G1
Lkp : lookup SG X public
H1 : lookup G3 X public
============================
lookup G3 X public
< search.
Subgoal 2:
Variables: S SG SG1 G G1 G2 C2 C1 G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (seq C1 C2) G1 @
Ev1 : eval_c G C1 G2 *
Ev2 : eval_c G2 C2 G1 *
Sec : secure S SG C1 G3
Sec1 : secure S G3 C2 SG1
EqGG2 : public_equiv SG G G2
EqG2G1 : public_equiv G3 G2 G1
LkpEq1 : forall X, lookup SG X public -> lookup G3 X public
============================
public_equiv SG G G1
< Eq2: apply public_equiv_swap to LkpEq1 EqG2G1.
Subgoal 2:
Variables: S SG SG1 G G1 G2 C2 C1 G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (seq C1 C2) G1 @
Ev1 : eval_c G C1 G2 *
Ev2 : eval_c G2 C2 G1 *
Sec : secure S SG C1 G3
Sec1 : secure S G3 C2 SG1
EqGG2 : public_equiv SG G G2
EqG2G1 : public_equiv G3 G2 G1
LkpEq1 : forall X, lookup SG X public -> lookup G3 X public
Eq2 : public_equiv SG G2 G1
============================
public_equiv SG G G1
< apply public_equiv_trans to EqGG2 Eq2.
Subgoal 2:
Variables: S SG SG1 G G1 G2 C2 C1 G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (seq C1 C2) G1 @
Ev1 : eval_c G C1 G2 *
Ev2 : eval_c G2 C2 G1 *
Sec : secure S SG C1 G3
Sec1 : secure S G3 C2 SG1
EqGG2 : public_equiv SG G G2
EqG2G1 : public_equiv G3 G2 G1
LkpEq1 : forall X, lookup SG X public -> lookup G3 X public
Eq2 : public_equiv SG G2 G1
H1 : public_equiv SG G G1
============================
public_equiv SG G G1
< search.
Subgoal 3:
Variables: S SG SG1 G V X E Ty
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (declare X Ty E) SG1
NEq : S = public -> false
Ev : eval_c G (declare X Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
============================
public_equiv SG G ((X, V)::G)
< Sec: case Sec.
Subgoal 3:
Variables: SG G V X E Ty
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : public = public -> false
Ev : eval_c G (declare X Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E public
Sec1 : no_lookup SG X
============================
public_equiv SG G ((X, V)::G)
< apply NEq to _.
Subgoal 4:
Variables: S SG SG1 G V X E
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (assign X E) SG1
NEq : S = public -> false
Ev : eval_c G (assign X E) ((X, V)::G) @
Ev1 : eval_e G E V
============================
public_equiv SG G ((X, V)::G)
< Sec: case Sec.
Subgoal 4.1:
Variables: SG1 G V X E
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : public = public -> false
Ev : eval_c G (assign X E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG1 E public
Sec1 : lookup SG1 X public
============================
public_equiv SG1 G ((X, V)::G)
< apply NEq to _.
Subgoal 4.2:
Variables: S SG1 G V X E S1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
============================
public_equiv SG1 G ((X, V)::G)
< unfold .
Subgoal 4.2.1:
Variables: S SG1 G V X E S1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
============================
forall X1 V1 V2,
lookup SG1 X1 public -> lookup G X1 V1 -> lookup ((X, V)::G) X1 V2 -> V1 = V2
< intros LkpSec LkpA LkpB.
Subgoal 4.2.1:
Variables: S SG1 G V X E S1 X1 V1 V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpA : lookup G X1 V1
LkpB : lookup ((X, V)::G) X1 V2
============================
V1 = V2
< LkpB: case LkpB.
Subgoal 4.2.1.1:
Variables: S SG1 G E S1 X1 V1 V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X1 E) ((X1, V2)::G) @
Ev1 : eval_e G E V2
Sec : level SG1 E S1
Sec1 : lookup SG1 X1 private
LkpSec : lookup SG1 X1 public
LkpA : lookup G X1 V1
============================
V1 = V2
< apply lookup_unique to Sec1 LkpSec.
Subgoal 4.2.1.2:
Variables: S SG1 G V X E S1 X1 V1 V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpA : lookup G X1 V1
LkpB : X = X1 -> false
LkpB1 : lookup G X1 V2
============================
V1 = V2
< apply lookup_unique to LkpA LkpB1.
Subgoal 4.2.1.2:
Variables: S SG1 G V X E S1 X1 V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpA : lookup G X1 V2
LkpB : X = X1 -> false
LkpB1 : lookup G X1 V2
============================
V2 = V2
< search.
Subgoal 4.2.2:
Variables: S SG1 G V X E S1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
============================
forall X1 V1,
lookup SG1 X1 public -> lookup G X1 V1 -> lookup ((X, V)::G) X1 V1
< intros LkpSec LkpG.
Subgoal 4.2.2:
Variables: S SG1 G V X E S1 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpG : lookup G X1 V1
============================
lookup ((X, V)::G) X1 V1
< Or: apply lookup_eq_or_not to Sec1 LkpSec.
Subgoal 4.2.2:
Variables: S SG1 G V X E S1 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpG : lookup G X1 V1
Or : X = X1 \/ (X = X1 -> false)
============================
lookup ((X, V)::G) X1 V1
< Eq: case Or.
Subgoal 4.2.2.1:
Variables: S SG1 G V E S1 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X1 E) ((X1, V)::G) @
Ev1 : eval_e G E V
Sec : level SG1 E S1
Sec1 : lookup SG1 X1 private
LkpSec : lookup SG1 X1 public
LkpG : lookup G X1 V1
============================
lookup ((X1, V)::G) X1 V1
< apply lookup_unique to Sec1 LkpSec.
Subgoal 4.2.2.2:
Variables: S SG1 G V X E S1 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpG : lookup G X1 V1
Eq : X = X1 -> false
============================
lookup ((X, V)::G) X1 V1
< search.
Subgoal 4.2.3:
Variables: S SG1 G V X E S1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
============================
forall X1 V1,
lookup SG1 X1 public -> lookup ((X, V)::G) X1 V1 -> lookup G X1 V1
< intros LkpSec LkpG+.
Subgoal 4.2.3:
Variables: S SG1 G V X E S1 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpG+ : lookup ((X, V)::G) X1 V1
============================
lookup G X1 V1
< Lkp: case LkpG+.
Subgoal 4.2.3.1:
Variables: S SG1 G E S1 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X1 E) ((X1, V1)::G) @
Ev1 : eval_e G E V1
Sec : level SG1 E S1
Sec1 : lookup SG1 X1 private
LkpSec : lookup SG1 X1 public
============================
lookup G X1 V1
< apply lookup_unique to Sec1 LkpSec.
Subgoal 4.2.3.2:
Variables: S SG1 G V X E S1 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (assign X E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
Lkp : X = X1 -> false
Lkp1 : lookup G X1 V1
============================
lookup G X1 V1
< search.
Subgoal 5:
Variables: S SG SG1 G G1 Else Then Cond
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (ifThenElse Cond Then Else) SG1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Then G1 *
============================
public_equiv SG G G1
< Sec: case Sec.
Subgoal 5:
Variables: S SG1 G G1 Else Then Cond S1 NewPC GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Then G1 *
Sec : level SG1 Cond S1
Sec1 : join S S1 NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
============================
public_equiv SG1 G G1
< assert NewPC = public -> false.
Subgoal 5.1:
Variables: S SG1 G G1 Else Then Cond S1 NewPC GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Then G1 *
Sec : level SG1 Cond S1
Sec1 : join S S1 NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
============================
NewPC = public -> false
< intros Eq.
Subgoal 5.1:
Variables: S SG1 G G1 Else Then Cond S1 NewPC GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Then G1 *
Sec : level SG1 Cond S1
Sec1 : join S S1 NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
Eq : NewPC = public
============================
false
< case Eq.
Subgoal 5.1:
Variables: S SG1 G G1 Else Then Cond S1 GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Then G1 *
Sec : level SG1 Cond S1
Sec1 : join S S1 public
Sec2 : secure public SG1 Then GTh
Sec3 : secure public SG1 Else GEl
============================
false
< backchain NEq.
Subgoal 5.1:
Variables: S SG1 G G1 Else Then Cond S1 GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Then G1 *
Sec : level SG1 Cond S1
Sec1 : join S S1 public
Sec2 : secure public SG1 Then GTh
Sec3 : secure public SG1 Else GEl
============================
S = public
< apply join_public to Sec1.
Subgoal 5.1:
Variables: SG1 G G1 Else Then Cond GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : public = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Then G1 *
Sec : level SG1 Cond public
Sec1 : join public public public
Sec2 : secure public SG1 Then GTh
Sec3 : secure public SG1 Else GEl
============================
public = public
< search.
Subgoal 5:
Variables: S SG1 G G1 Else Then Cond S1 NewPC GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Then G1 *
Sec : level SG1 Cond S1
Sec1 : join S S1 NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
H1 : NewPC = public -> false
============================
public_equiv SG1 G G1
< apply IH to Sec2 _ Ev2.
Subgoal 5:
Variables: S SG1 G G1 Else Then Cond S1 NewPC GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Then G1 *
Sec : level SG1 Cond S1
Sec1 : join S S1 NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
H1 : NewPC = public -> false
H2 : public_equiv SG1 G G1
============================
public_equiv SG1 G G1
< search.
Subgoal 6:
Variables: S SG SG1 G G1 Else Then Cond
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (ifThenElse Cond Then Else) SG1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond falseVal
Ev2 : eval_c G Else G1 *
============================
public_equiv SG G G1
< Sec: case Sec.
Subgoal 6:
Variables: S SG1 G G1 Else Then Cond S1 NewPC GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond falseVal
Ev2 : eval_c G Else G1 *
Sec : level SG1 Cond S1
Sec1 : join S S1 NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
============================
public_equiv SG1 G G1
< assert NewPC = public -> false.
Subgoal 6.1:
Variables: S SG1 G G1 Else Then Cond S1 NewPC GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond falseVal
Ev2 : eval_c G Else G1 *
Sec : level SG1 Cond S1
Sec1 : join S S1 NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
============================
NewPC = public -> false
< intros Eq.
Subgoal 6.1:
Variables: S SG1 G G1 Else Then Cond S1 NewPC GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond falseVal
Ev2 : eval_c G Else G1 *
Sec : level SG1 Cond S1
Sec1 : join S S1 NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
Eq : NewPC = public
============================
false
< case Eq.
Subgoal 6.1:
Variables: S SG1 G G1 Else Then Cond S1 GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond falseVal
Ev2 : eval_c G Else G1 *
Sec : level SG1 Cond S1
Sec1 : join S S1 public
Sec2 : secure public SG1 Then GTh
Sec3 : secure public SG1 Else GEl
============================
false
< backchain NEq.
Subgoal 6.1:
Variables: S SG1 G G1 Else Then Cond S1 GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond falseVal
Ev2 : eval_c G Else G1 *
Sec : level SG1 Cond S1
Sec1 : join S S1 public
Sec2 : secure public SG1 Then GTh
Sec3 : secure public SG1 Else GEl
============================
S = public
< apply join_public to Sec1.
Subgoal 6.1:
Variables: SG1 G G1 Else Then Cond GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : public = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond falseVal
Ev2 : eval_c G Else G1 *
Sec : level SG1 Cond public
Sec1 : join public public public
Sec2 : secure public SG1 Then GTh
Sec3 : secure public SG1 Else GEl
============================
public = public
< search.
Subgoal 6:
Variables: S SG1 G G1 Else Then Cond S1 NewPC GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond falseVal
Ev2 : eval_c G Else G1 *
Sec : level SG1 Cond S1
Sec1 : join S S1 NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
H1 : NewPC = public -> false
============================
public_equiv SG1 G G1
< apply IH to Sec3 _ Ev2.
Subgoal 6:
Variables: S SG1 G G1 Else Then Cond S1 NewPC GTh GEl
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (ifThenElse Cond Then Else) G1 @
Ev1 : eval_e G Cond falseVal
Ev2 : eval_c G Else G1 *
Sec : level SG1 Cond S1
Sec1 : join S S1 NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
H1 : NewPC = public -> false
H2 : public_equiv SG1 G G1
============================
public_equiv SG1 G G1
< search.
Subgoal 7:
Variables: S SG SG1 G1 Body Cond
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G1 (while Cond Body) G1 @
Ev1 : eval_e G1 Cond falseVal
============================
public_equiv SG G1 G1
< unfold .
Subgoal 7.1:
Variables: S SG SG1 G1 Body Cond
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G1 (while Cond Body) G1 @
Ev1 : eval_e G1 Cond falseVal
============================
forall X V1 V2,
lookup SG X public -> lookup G1 X V1 -> lookup G1 X V2 -> V1 = V2
< intros LkpSec LkpA LkpB.
Subgoal 7.1:
Variables: S SG SG1 G1 Body Cond X V1 V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G1 (while Cond Body) G1 @
Ev1 : eval_e G1 Cond falseVal
LkpSec : lookup SG X public
LkpA : lookup G1 X V1
LkpB : lookup G1 X V2
============================
V1 = V2
< apply lookup_unique to LkpA LkpB.
Subgoal 7.1:
Variables: S SG SG1 G1 Body Cond X V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G1 (while Cond Body) G1 @
Ev1 : eval_e G1 Cond falseVal
LkpSec : lookup SG X public
LkpA : lookup G1 X V2
LkpB : lookup G1 X V2
============================
V2 = V2
< search.
Subgoal 7.2:
Variables: S SG SG1 G1 Body Cond
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G1 (while Cond Body) G1 @
Ev1 : eval_e G1 Cond falseVal
============================
forall X V, lookup SG X public -> lookup G1 X V -> lookup G1 X V
< intros LkpSec LkpG1.
Subgoal 7.2:
Variables: S SG SG1 G1 Body Cond X V
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G1 (while Cond Body) G1 @
Ev1 : eval_e G1 Cond falseVal
LkpSec : lookup SG X public
LkpG1 : lookup G1 X V
============================
lookup G1 X V
< search.
Subgoal 7.3:
Variables: S SG SG1 G1 Body Cond
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G1 (while Cond Body) G1 @
Ev1 : eval_e G1 Cond falseVal
============================
forall X V, lookup SG X public -> lookup G1 X V -> lookup G1 X V
< intros LkpSec LkpG1.
Subgoal 7.3:
Variables: S SG SG1 G1 Body Cond X V
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G1 (while Cond Body) G1 @
Ev1 : eval_e G1 Cond falseVal
LkpSec : lookup SG X public
LkpG1 : lookup G1 X V
============================
lookup G1 X V
< search.
Subgoal 8:
Variables: S SG SG1 G G1 G2 Body Cond
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G (while Cond Body) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G2 *
Ev3 : eval_c G2 (while Cond Body) G1 *
============================
public_equiv SG G G1
< Sec: case Sec (keep).
Subgoal 8:
Variables: S SG1 G G1 G2 Body Cond S1 NewPC G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG1 (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G (while Cond Body) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G2 *
Ev3 : eval_c G2 (while Cond Body) G1 *
Sec1 : level SG1 Cond S1
Sec2 : join S S1 NewPC
Sec3 : secure NewPC SG1 Body G3
============================
public_equiv SG1 G G1
< assert NewPC = public -> false.
Subgoal 8.1:
Variables: S SG1 G G1 G2 Body Cond S1 NewPC G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG1 (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G (while Cond Body) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G2 *
Ev3 : eval_c G2 (while Cond Body) G1 *
Sec1 : level SG1 Cond S1
Sec2 : join S S1 NewPC
Sec3 : secure NewPC SG1 Body G3
============================
NewPC = public -> false
< intros Eq.
Subgoal 8.1:
Variables: S SG1 G G1 G2 Body Cond S1 NewPC G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG1 (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G (while Cond Body) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G2 *
Ev3 : eval_c G2 (while Cond Body) G1 *
Sec1 : level SG1 Cond S1
Sec2 : join S S1 NewPC
Sec3 : secure NewPC SG1 Body G3
Eq : NewPC = public
============================
false
< case Eq.
Subgoal 8.1:
Variables: S SG1 G G1 G2 Body Cond S1 G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG1 (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G (while Cond Body) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G2 *
Ev3 : eval_c G2 (while Cond Body) G1 *
Sec1 : level SG1 Cond S1
Sec2 : join S S1 public
Sec3 : secure public SG1 Body G3
============================
false
< backchain NEq.
Subgoal 8.1:
Variables: S SG1 G G1 G2 Body Cond S1 G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG1 (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G (while Cond Body) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G2 *
Ev3 : eval_c G2 (while Cond Body) G1 *
Sec1 : level SG1 Cond S1
Sec2 : join S S1 public
Sec3 : secure public SG1 Body G3
============================
S = public
< apply join_public to Sec2.
Subgoal 8.1:
Variables: SG1 G G1 G2 Body Cond G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure public SG1 (while Cond Body) SG1
NEq : public = public -> false
Ev : eval_c G (while Cond Body) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G2 *
Ev3 : eval_c G2 (while Cond Body) G1 *
Sec1 : level SG1 Cond public
Sec2 : join public public public
Sec3 : secure public SG1 Body G3
============================
public = public
< search.
Subgoal 8:
Variables: S SG1 G G1 G2 Body Cond S1 NewPC G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG1 (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G (while Cond Body) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G2 *
Ev3 : eval_c G2 (while Cond Body) G1 *
Sec1 : level SG1 Cond S1
Sec2 : join S S1 NewPC
Sec3 : secure NewPC SG1 Body G3
H1 : NewPC = public -> false
============================
public_equiv SG1 G G1
< EqGG2: apply IH to Sec3 _ Ev2.
Subgoal 8:
Variables: S SG1 G G1 G2 Body Cond S1 NewPC G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG1 (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G (while Cond Body) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G2 *
Ev3 : eval_c G2 (while Cond Body) G1 *
Sec1 : level SG1 Cond S1
Sec2 : join S S1 NewPC
Sec3 : secure NewPC SG1 Body G3
H1 : NewPC = public -> false
EqGG2 : public_equiv SG1 G G2
============================
public_equiv SG1 G G1
< EqG2G1: apply IH to _ _ Ev3.
Subgoal 8:
Variables: S SG1 G G1 G2 Body Cond S1 NewPC G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG1 (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G (while Cond Body) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G2 *
Ev3 : eval_c G2 (while Cond Body) G1 *
Sec1 : level SG1 Cond S1
Sec2 : join S S1 NewPC
Sec3 : secure NewPC SG1 Body G3
H1 : NewPC = 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 8:
Variables: S SG1 G G1 G2 Body Cond S1 NewPC G3
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG1 (while Cond Body) SG1
NEq : S = public -> false
Ev : eval_c G (while Cond Body) G1 @
Ev1 : eval_e G Cond trueVal
Ev2 : eval_c G Body G2 *
Ev3 : eval_c G2 (while Cond Body) G1 *
Sec1 : level SG1 Cond S1
Sec2 : join S S1 NewPC
Sec3 : secure NewPC SG1 Body G3
H1 : NewPC = 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 9:
Variables: S SG SG1 G V Fields Result Rec E RecFields
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (recUpdate Rec RecFields E) SG1
NEq : S = public -> false
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
============================
public_equiv SG G ((Rec, recVal Result)::G)
< Sec: case Sec.
Subgoal 9.1:
Variables: SG1 G V Fields Result Rec E RecFields
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : public = public -> false
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
============================
public_equiv SG1 G ((Rec, recVal Result)::G)
< apply NEq to _.
Subgoal 9.2:
Variables: S SG1 G V Fields Result Rec E RecFields S1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 Rec private
============================
public_equiv SG1 G ((Rec, recVal Result)::G)
< unfold .
Subgoal 9.2.1:
Variables: S SG1 G V Fields Result Rec E RecFields S1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 Rec private
============================
forall X V1 V2,
lookup SG1 X public -> lookup G X V1 -> lookup ((Rec, recVal Result)::G) X V2 ->
V1 = V2
< intros LkpSec LkpA LkpB.
Subgoal 9.2.1:
Variables: S SG1 G V Fields Result Rec E RecFields S1 X V1 V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
LkpA : lookup G X V1
LkpB : lookup ((Rec, recVal Result)::G) X V2
============================
V1 = V2
< LkpB: case LkpB.
Subgoal 9.2.1.1:
Variables: S SG1 G V Fields Result E RecFields S1 X V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate X RecFields E) ((X, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G X (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X public
LkpA : lookup G X V1
============================
V1 = recVal Result
< apply lookup_unique to Sec1 LkpSec.
Subgoal 9.2.1.2:
Variables: S SG1 G V Fields Result Rec E RecFields S1 X V1 V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
LkpA : lookup G X V1
LkpB : Rec = X -> false
LkpB1 : lookup G X V2
============================
V1 = V2
< apply lookup_unique to LkpA LkpB1.
Subgoal 9.2.1.2:
Variables: S SG1 G V Fields Result Rec E RecFields S1 X V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
LkpA : lookup G X V2
LkpB : Rec = X -> false
LkpB1 : lookup G X V2
============================
V2 = V2
< search.
Subgoal 9.2.2:
Variables: S SG1 G V Fields Result Rec E RecFields S1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 Rec private
============================
forall X V,
lookup SG1 X public -> lookup G X V -> lookup ((Rec, recVal Result)::G) X V
< intros LkpSec LkpG.
Subgoal 9.2.2:
Variables: S SG1 G V Fields Result Rec E RecFields S1 X V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
LkpG : lookup G X V1
============================
lookup ((Rec, recVal Result)::G) X V1
< Or: apply lookup_eq_or_not to Sec1 LkpSec.
Subgoal 9.2.2:
Variables: S SG1 G V Fields Result Rec E RecFields S1 X V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
LkpG : lookup G X V1
Or : Rec = X \/ (Rec = X -> false)
============================
lookup ((Rec, recVal Result)::G) X V1
< Eq: case Or.
Subgoal 9.2.2.1:
Variables: S SG1 G V Fields Result E RecFields S1 X V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate X RecFields E) ((X, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G X (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X public
LkpG : lookup G X V1
============================
lookup ((X, recVal Result)::G) X V1
< apply lookup_unique to Sec1 LkpSec.
Subgoal 9.2.2.2:
Variables: S SG1 G V Fields Result Rec E RecFields S1 X V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
LkpG : lookup G X V1
Eq : Rec = X -> false
============================
lookup ((Rec, recVal Result)::G) X V1
< search.
Subgoal 9.2.3:
Variables: S SG1 G V Fields Result Rec E RecFields S1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 Rec private
============================
forall X V,
lookup SG1 X public -> lookup ((Rec, recVal Result)::G) X V -> lookup G X V
< intros LkpSec LkpG+.
Subgoal 9.2.3:
Variables: S SG1 G V Fields Result Rec E RecFields S1 X V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
LkpG+ : lookup ((Rec, recVal Result)::G) X V1
============================
lookup G X V1
< Lkp: case LkpG+.
Subgoal 9.2.3.1:
Variables: S SG1 G V Fields Result E RecFields S1 X
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate X RecFields E) ((X, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G X (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X public
============================
lookup G X (recVal Result)
< apply lookup_unique to Sec1 LkpSec.
Subgoal 9.2.3.2:
Variables: S SG1 G V Fields Result Rec E RecFields S1 X V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev1 : eval_e G E V
Ev2 : lookup G Rec (recVal Fields)
Ev3 : update_rec_fields RecFields Fields V Result
Sec : level SG1 E S1
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
Lkp : Rec = X -> false
Lkp1 : lookup G X V1
============================
lookup G X V1
< search.
Subgoal 10:
Variables: S SG SG1 G V X E Ty S1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG (declareSec X S1 Ty E) SG1
NEq : S = public -> false
Ev : eval_c G (declareSec X S1 Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
============================
public_equiv SG G ((X, V)::G)
< Sec: case Sec.
Subgoal 10.1:
Variables: S SG G V X E Ty S2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X private Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E S2
Sec1 : no_lookup SG X
============================
public_equiv SG G ((X, V)::G)
< unfold .
Subgoal 10.1.1:
Variables: S SG G V X E Ty S2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X private Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E S2
Sec1 : no_lookup SG X
============================
forall X1 V1 V2,
lookup SG X1 public -> lookup G X1 V1 -> lookup ((X, V)::G) X1 V2 -> V1 = V2
< intros LkpSec LkpA LkpB.
Subgoal 10.1.1:
Variables: S SG G V X E Ty S2 X1 V1 V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X private Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E S2
Sec1 : no_lookup SG X
LkpSec : lookup SG X1 public
LkpA : lookup G X1 V1
LkpB : lookup ((X, V)::G) X1 V2
============================
V1 = V2
< LkpB: case LkpB.
Subgoal 10.1.1.1:
Variables: S SG G E Ty S2 X1 V1 V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X1 private Ty E) ((X1, V2)::G) @
Ev1 : eval_e G E V2
Sec : level SG E S2
Sec1 : no_lookup SG X1
LkpSec : lookup SG X1 public
LkpA : lookup G X1 V1
============================
V1 = V2
< apply no_lookup to Sec1 LkpSec.
Subgoal 10.1.1.2:
Variables: S SG G V X E Ty S2 X1 V1 V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X private Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E S2
Sec1 : no_lookup SG X
LkpSec : lookup SG X1 public
LkpA : lookup G X1 V1
LkpB : X = X1 -> false
LkpB1 : lookup G X1 V2
============================
V1 = V2
< apply lookup_unique to LkpA LkpB1.
Subgoal 10.1.1.2:
Variables: S SG G V X E Ty S2 X1 V2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X private Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E S2
Sec1 : no_lookup SG X
LkpSec : lookup SG X1 public
LkpA : lookup G X1 V2
LkpB : X = X1 -> false
LkpB1 : lookup G X1 V2
============================
V2 = V2
< search.
Subgoal 10.1.2:
Variables: S SG G V X E Ty S2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X private Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E S2
Sec1 : no_lookup SG X
============================
forall X1 V1, lookup SG X1 public -> lookup G X1 V1 -> lookup ((X, V)::G) X1 V1
< intros LkpSec LkpG.
Subgoal 10.1.2:
Variables: S SG G V X E Ty S2 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X private Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E S2
Sec1 : no_lookup SG X
LkpSec : lookup SG X1 public
LkpG : lookup G X1 V1
============================
lookup ((X, V)::G) X1 V1
< assert X = X1 -> false.
Subgoal 10.1.2.1:
Variables: S SG G V X E Ty S2 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X private Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E S2
Sec1 : no_lookup SG X
LkpSec : lookup SG X1 public
LkpG : lookup G X1 V1
============================
X = X1 -> false
< intros Eq.
Subgoal 10.1.2.1:
Variables: S SG G V X E Ty S2 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X private Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E S2
Sec1 : no_lookup SG X
LkpSec : lookup SG X1 public
LkpG : lookup G X1 V1
Eq : X = X1
============================
false
< case Eq.
Subgoal 10.1.2.1:
Variables: S SG G V E Ty S2 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X1 private Ty E) ((X1, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E S2
Sec1 : no_lookup SG X1
LkpSec : lookup SG X1 public
LkpG : lookup G X1 V1
============================
false
< apply no_lookup to Sec1 LkpSec.
Subgoal 10.1.2:
Variables: S SG G V X E Ty S2 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X private Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E S2
Sec1 : no_lookup SG X
LkpSec : lookup SG X1 public
LkpG : lookup G X1 V1
H1 : X = X1 -> false
============================
lookup ((X, V)::G) X1 V1
< search.
Subgoal 10.1.3:
Variables: S SG G V X E Ty S2
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X private Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E S2
Sec1 : no_lookup SG X
============================
forall X1 V1, lookup SG X1 public -> lookup ((X, V)::G) X1 V1 -> lookup G X1 V1
< intros LkpSec LkpG+.
Subgoal 10.1.3:
Variables: S SG G V X E Ty S2 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X private Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E S2
Sec1 : no_lookup SG X
LkpSec : lookup SG X1 public
LkpG+ : lookup ((X, V)::G) X1 V1
============================
lookup G X1 V1
< Lkp: case LkpG+.
Subgoal 10.1.3.1:
Variables: S SG G E Ty S2 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X1 private Ty E) ((X1, V1)::G) @
Ev1 : eval_e G E V1
Sec : level SG E S2
Sec1 : no_lookup SG X1
LkpSec : lookup SG X1 public
============================
lookup G X1 V1
< apply no_lookup to Sec1 LkpSec.
Subgoal 10.1.3.2:
Variables: S SG G V X E Ty S2 X1 V1
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G (declareSec X private Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E S2
Sec1 : no_lookup SG X
LkpSec : lookup SG X1 public
Lkp : X = X1 -> false
Lkp1 : lookup G X1 V1
============================
lookup G X1 V1
< search.
Subgoal 10.2:
Variables: SG G V X E Ty
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : public = public -> false
Ev : eval_c G (declareSec X public Ty E) ((X, V)::G) @
Ev1 : eval_e G E V
Sec : level SG E public
Sec1 : no_lookup SG X
============================
public_equiv SG G ((X, V)::G)
< apply NEq to _.
Subgoal 11:
Variables: S SG SG1 G G1 T
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
Sec : secure S SG <unknown K eval_c> SG1
NEq : S = public -> false
Ev : eval_c G <unknown K eval_c> G1 @
Ev1 : |{c}- <unknown K eval_c> ~~> T
Ev2 : eval_c G T G1 *
============================
public_equiv SG G G1
< Sec: case Sec.
Subgoal 11:
Variables: S SG SG1 G G1 T CT
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G <unknown K eval_c> G1 @
Ev1 : |{c}- <unknown K eval_c> ~~> T
Ev2 : eval_c G T G1 *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure S SG CT SG1
============================
public_equiv SG G G1
< apply proj_c_unique to Ev1 Sec.
Subgoal 11:
Variables: S SG SG1 G G1 CT
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G <unknown K eval_c> G1 @
Ev1 : |{c}- <unknown K eval_c> ~~> CT
Ev2 : eval_c G CT G1 *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure S SG CT SG1
============================
public_equiv SG G G1
< apply IH to _ _ Ev2.
Subgoal 11:
Variables: S SG SG1 G G1 CT
IH : forall C S SG SG1 G G1,
secure S SG C SG1 -> (S = public -> false) -> eval_c G C G1 * -> public_equiv SG G G1
NEq : S = public -> false
Ev : eval_c G <unknown K eval_c> G1 @
Ev1 : |{c}- <unknown K eval_c> ~~> CT
Ev2 : eval_c G CT G1 *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure S SG CT SG1
H1 : public_equiv SG G G1
============================
public_equiv SG G G1
< search.
Proof completed.
< Theorem while_no_public_change :
forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 -> public_equiv SG G G2.
============================
forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 -> public_equiv SG G G2
< induction on 4.
IH : forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 * -> public_equiv SG G G2
============================
forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 @ -> public_equiv SG G G2
< intros Sec Lev NEq Ev.
Variables: PC SG SG' Cond Body S G G2
IH : forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 * -> public_equiv SG G G2
Sec : secure PC SG (while Cond Body) SG'
Lev : level SG Cond S
NEq : S = public -> false
Ev : eval_c G (while Cond Body) G2 @
============================
public_equiv SG G G2
< Ev: case Ev.
Subgoal 1:
Variables: PC SG SG' Cond Body S G2
IH : forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 * -> public_equiv SG G G2
Sec : secure PC SG (while Cond Body) SG'
Lev : level SG Cond S
NEq : S = public -> false
Ev : eval_e G2 Cond falseVal
============================
public_equiv SG G2 G2
< backchain public_equiv_refl.
Subgoal 2:
Variables: PC SG SG' Cond Body S G G2 G1
IH : forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 * -> public_equiv SG G G2
Sec : secure PC SG (while Cond Body) SG'
Lev : level SG Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueVal
Ev1 : eval_c G Body G1 *
Ev2 : eval_c G1 (while Cond Body) G2 *
============================
public_equiv SG G G2
< EqG1G2: apply IH to Sec Lev NEq Ev2.
Subgoal 2:
Variables: PC SG SG' Cond Body S G G2 G1
IH : forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 * -> public_equiv SG G G2
Sec : secure PC SG (while Cond Body) SG'
Lev : level SG Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueVal
Ev1 : eval_c G Body G1 *
Ev2 : eval_c G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG G1 G2
============================
public_equiv SG G G2
< Sec: case Sec.
Subgoal 2:
Variables: PC SG' Cond Body S G G2 G1 S1 NewPC G3
IH : forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueVal
Ev1 : eval_c G Body G1 *
Ev2 : eval_c G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond S1
Sec1 : join PC S1 NewPC
Sec2 : secure NewPC SG' Body G3
============================
public_equiv SG' G G2
< EqGG1: apply stmt_not_public_no_public_change to Sec2 _ Ev1.
Subgoal 2.1:
Variables: PC SG' Cond Body S G G2 G1 S1 NewPC G3
IH : forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueVal
Ev1 : eval_c G Body G1 *
Ev2 : eval_c G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond S1
Sec1 : join PC S1 NewPC
Sec2 : secure NewPC SG' Body G3
============================
NewPC = public -> false
< intros Eq.
Subgoal 2.1:
Variables: PC SG' Cond Body S G G2 G1 S1 NewPC G3
IH : forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueVal
Ev1 : eval_c G Body G1 *
Ev2 : eval_c G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond S1
Sec1 : join PC S1 NewPC
Sec2 : secure NewPC SG' Body G3
Eq : NewPC = public
============================
false
< case Eq.
Subgoal 2.1:
Variables: PC SG' Cond Body S G G2 G1 S1 G3
IH : forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueVal
Ev1 : eval_c G Body G1 *
Ev2 : eval_c G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond S1
Sec1 : join PC S1 public
Sec2 : secure public SG' Body G3
============================
false
< apply join_public to Sec1.
Subgoal 2.1:
Variables: SG' Cond Body S G G2 G1 G3
IH : forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueVal
Ev1 : eval_c G Body G1 *
Ev2 : eval_c G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond public
Sec1 : join public public public
Sec2 : secure public SG' Body G3
============================
false
< apply level_unique to Lev Sec.
Subgoal 2.1:
Variables: SG' Cond Body G G2 G1 G3
IH : forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond public
NEq : public = public -> false
Ev : eval_e G Cond trueVal
Ev1 : eval_c G Body G1 *
Ev2 : eval_c G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond public
Sec1 : join public public public
Sec2 : secure public SG' Body G3
============================
false
< backchain NEq.
Subgoal 2:
Variables: PC SG' Cond Body S G G2 G1 S1 NewPC G3
IH : forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueVal
Ev1 : eval_c G Body G1 *
Ev2 : eval_c G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond S1
Sec1 : join PC S1 NewPC
Sec2 : secure NewPC SG' Body G3
EqGG1 : public_equiv SG' G G1
============================
public_equiv SG' G G2
< apply public_equiv_trans to EqGG1 EqG1G2.
Subgoal 2:
Variables: PC SG' Cond Body S G G2 G1 S1 NewPC G3
IH : forall PC SG SG' Cond Body S G G2,
secure PC SG (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) ->
eval_c G (while Cond Body) G2 * -> public_equiv SG G G2
Lev : level SG' Cond S
NEq : S = public -> false
Ev : eval_e G Cond trueVal
Ev1 : eval_c G Body G1 *
Ev2 : eval_c G1 (while Cond Body) G2 *
EqG1G2 : public_equiv SG' G1 G2
Sec : level SG' Cond S1
Sec1 : join PC S1 NewPC
Sec2 : secure NewPC SG' Body G3
EqGG1 : public_equiv SG' G G1
H1 : public_equiv SG' G G2
============================
public_equiv SG' G G2
< search.
Proof completed.
< Extensible_Theorem
stmt_secure : forall C PC SG SG1 GA GA' GB GB',
Is : is_c C ->
Sec : secure PC SG C SG1 ->
Rel : public_equiv SG GA GB ->
EvA : eval_c GA C GA' ->
EvB : eval_c GB C GB' ->
public_equiv SG1 GA' GB'
on EvA.
Subgoal 1:
Variables: PC SG SG1 GA' GB GB'
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c noop
Sec : secure PC SG noop SG1
Rel : public_equiv SG GA' GB
EvA : eval_c GA' noop GA' @
EvB : eval_c GB noop GB'
============================
public_equiv SG1 GA' GB'
< case EvB.
Subgoal 1:
Variables: PC SG SG1 GA' GB'
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c noop
Sec : secure PC SG noop SG1
Rel : public_equiv SG GA' GB'
EvA : eval_c GA' noop GA' @
============================
public_equiv SG1 GA' GB'
< case Sec.
Subgoal 1:
Variables: PC SG1 GA' GB'
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c noop
Rel : public_equiv SG1 GA' GB'
EvA : eval_c GA' noop GA' @
============================
public_equiv SG1 GA' GB'
< search.
Subgoal 2:
Variables: PC SG SG1 GA GA' GB GB' G1 C2 C1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (seq C1 C2)
Sec : secure PC SG (seq C1 C2) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (seq C1 C2) GA' @
EvB : eval_c GB (seq C1 C2) GB'
EvA1 : eval_c GA C1 G1 *
EvA2 : eval_c G1 C2 GA' *
============================
public_equiv SG1 GA' GB'
< EvB: case EvB.
Subgoal 2:
Variables: PC SG SG1 GA GA' GB GB' G1 C2 C1 G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (seq C1 C2)
Sec : secure PC SG (seq C1 C2) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (seq C1 C2) GA' @
EvA1 : eval_c GA C1 G1 *
EvA2 : eval_c G1 C2 GA' *
EvB : eval_c GB C1 G2
EvB1 : eval_c G2 C2 GB'
============================
public_equiv SG1 GA' GB'
< Sec: case Sec.
Subgoal 2:
Variables: PC SG SG1 GA GA' GB GB' G1 C2 C1 G2 G3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (seq C1 C2)
Rel : public_equiv SG GA GB
EvA : eval_c GA (seq C1 C2) GA' @
EvA1 : eval_c GA C1 G1 *
EvA2 : eval_c G1 C2 GA' *
EvB : eval_c GB C1 G2
EvB1 : eval_c G2 C2 GB'
Sec : secure PC SG C1 G3
Sec1 : secure PC G3 C2 SG1
============================
public_equiv SG1 GA' GB'
< Is: case Is.
Subgoal 2:
Variables: PC SG SG1 GA GA' GB GB' G1 C2 C1 G2 G3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (seq C1 C2) GA' @
EvA1 : eval_c GA C1 G1 *
EvA2 : eval_c G1 C2 GA' *
EvB : eval_c GB C1 G2
EvB1 : eval_c G2 C2 GB'
Sec : secure PC SG C1 G3
Sec1 : secure PC G3 C2 SG1
Is : is_c C1
Is1 : is_c C2
============================
public_equiv SG1 GA' GB'
< apply IH to _ _ _ EvA1 EvB.
Subgoal 2:
Variables: PC SG SG1 GA GA' GB GB' G1 C2 C1 G2 G3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (seq C1 C2) GA' @
EvA1 : eval_c GA C1 G1 *
EvA2 : eval_c G1 C2 GA' *
EvB : eval_c GB C1 G2
EvB1 : eval_c G2 C2 GB'
Sec : secure PC SG C1 G3
Sec1 : secure PC G3 C2 SG1
Is : is_c C1
Is1 : is_c C2
H1 : public_equiv G3 G1 G2
============================
public_equiv SG1 GA' GB'
< apply IH to _ _ _ EvA2 EvB1.
Subgoal 2:
Variables: PC SG SG1 GA GA' GB GB' G1 C2 C1 G2 G3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (seq C1 C2) GA' @
EvA1 : eval_c GA C1 G1 *
EvA2 : eval_c G1 C2 GA' *
EvB : eval_c GB C1 G2
EvB1 : eval_c G2 C2 GB'
Sec : secure PC SG C1 G3
Sec1 : secure PC G3 C2 SG1
Is : is_c C1
Is1 : is_c C2
H1 : public_equiv G3 G1 G2
H2 : public_equiv SG1 GA' GB'
============================
public_equiv SG1 GA' GB'
< search.
Subgoal 3:
Variables: PC SG SG1 GA GB GB' V X E Ty
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (declare X Ty E)
Sec : secure PC SG (declare X Ty E) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X Ty E) ((X, V)::GA) @
EvB : eval_c GB (declare X Ty E) GB'
EvA1 : eval_e GA E V
============================
public_equiv SG1 ((X, V)::GA) GB'
< EvB: case EvB.
Subgoal 3:
Variables: PC SG SG1 GA GB V X E Ty V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (declare X Ty E)
Sec : secure PC SG (declare X Ty E) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
============================
public_equiv SG1 ((X, V)::GA) ((X, V1)::GB)
< Sec: case Sec.
Subgoal 3:
Variables: SG GA GB V X E Ty V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (declare X Ty E)
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG X
============================
public_equiv ((X, public)::SG) ((X, V)::GA) ((X, V1)::GB)
< Is: case Is.
Subgoal 3:
Variables: SG GA GB V X E Ty V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
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
============================
public_equiv ((X, public)::SG) ((X, V)::GA) ((X, V1)::GB)
< apply level_secure to _ _ Rel EvA1 EvB.
Subgoal 3:
Variables: SG GA GB X E Ty V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare 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
============================
public_equiv ((X, public)::SG) ((X, V1)::GA) ((X, V1)::GB)
< unfold .
Subgoal 3.1:
Variables: SG GA GB X E Ty V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare 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
============================
forall X1 V2 V3,
lookup ((X, public)::SG) X1 public -> lookup ((X, V1)::GA) X1 V2 -> lookup ((X, V1)::GB) X1 V3 ->
V2 = V3
< intros LkpSec LkpA LkpB.
Subgoal 3.1:
Variables: SG GA GB X E Ty V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare 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
LkpSec : lookup ((X, public)::SG) X1 public
LkpA : lookup ((X, V1)::GA) X1 V2
LkpB : lookup ((X, V1)::GB) X1 V3
============================
V2 = V3
< LkpA: case LkpA.
Subgoal 3.1.1:
Variables: SG GA GB E Ty X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X1 Ty E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Sec : level SG E public
Sec1 : no_lookup SG X1
Is : is_string X1
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : lookup ((X1, public)::SG) X1 public
LkpB : lookup ((X1, V2)::GB) X1 V3
============================
V2 = V3
< LkpB: case LkpB.
Subgoal 3.1.1.1:
Variables: SG GA GB E Ty X1 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X1 Ty E) ((X1, V3)::GA) @
EvA1 : eval_e GA E V3
EvB : eval_e GB E V3
Sec : level SG E public
Sec1 : no_lookup SG X1
Is : is_string X1
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : lookup ((X1, public)::SG) X1 public
============================
V3 = V3
< search.
Subgoal 3.1.1.2:
Variables: SG GA GB E Ty X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X1 Ty E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Sec : level SG E public
Sec1 : no_lookup SG X1
Is : is_string X1
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : lookup ((X1, public)::SG) X1 public
LkpB : X1 = X1 -> false
LkpB1 : lookup GB X1 V3
============================
V2 = V3
< apply LkpB to _.
Subgoal 3.1.2:
Variables: SG GA GB X E Ty V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare 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
LkpSec : lookup ((X, public)::SG) X1 public
LkpB : lookup ((X, V1)::GB) X1 V3
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
============================
V2 = V3
< LkpB: case LkpB.
Subgoal 3.1.2.1:
Variables: SG GA GB E Ty X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X1 Ty E) ((X1, V3)::GA) @
EvA1 : eval_e GA E V3
EvB : eval_e GB E V3
Sec : level SG E public
Sec1 : no_lookup SG X1
Is : is_string X1
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : lookup ((X1, public)::SG) X1 public
LkpA : X1 = X1 -> false
LkpA1 : lookup GA X1 V2
============================
V2 = V3
< apply LkpA to _.
Subgoal 3.1.2.2:
Variables: SG GA GB X E Ty V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare 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
LkpSec : lookup ((X, public)::SG) X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
============================
V2 = V3
< Rel: case Rel.
Subgoal 3.1.2.2:
Variables: SG GA GB X E Ty V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declare 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
LkpSec : lookup ((X, public)::SG) X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
V2 = V3
< LkpSec: case LkpSec.
Subgoal 3.1.2.2.1:
Variables: SG GA GB E Ty V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declare X1 Ty E) ((X1, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG X1
Is : is_string X1
Is1 : is_ty Ty
Is2 : is_e E
LkpA : X1 = X1 -> false
LkpA1 : lookup GA X1 V2
LkpB : X1 = X1 -> false
LkpB1 : lookup GB X1 V3
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
V2 = V3
< apply LkpA to _.
Subgoal 3.1.2.2.2:
Variables: SG GA GB X E Ty V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declare 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 = X1 -> false
LkpA1 : lookup GA X1 V2
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
============================
V2 = V3
< apply Rel to LkpSec1 LkpA1 LkpB1.
Subgoal 3.1.2.2.2:
Variables: SG GA GB X E Ty V1 X1 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declare 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 = X1 -> false
LkpA1 : lookup GA X1 V3
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
============================
V3 = V3
< search.
Subgoal 3.2:
Variables: SG GA GB X E Ty V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare 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
============================
forall X1 V,
lookup ((X, public)::SG) X1 public -> lookup ((X, V1)::GA) X1 V -> lookup ((X, V1)::GB) X1 V
< intros LkpSec LkpA.
Subgoal 3.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare 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
LkpSec : lookup ((X, public)::SG) X1 public
LkpA : lookup ((X, V1)::GA) X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< LkpSec: case LkpSec.
Subgoal 3.2.1:
Variables: SG GA GB E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X1 Ty E) ((X1, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG X1
Is : is_string X1
Is1 : is_ty Ty
Is2 : is_e E
LkpA : lookup ((X1, V1)::GA) X1 V2
============================
lookup ((X1, V1)::GB) X1 V2
< LkpA: case LkpA.
Subgoal 3.2.1.1:
Variables: SG GA GB E Ty X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X1 Ty E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Sec : level SG E public
Sec1 : no_lookup SG X1
Is : is_string X1
Is1 : is_ty Ty
Is2 : is_e E
============================
lookup ((X1, V2)::GB) X1 V2
< search.
Subgoal 3.2.1.2:
Variables: SG GA GB E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X1 Ty E) ((X1, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG X1
Is : is_string X1
Is1 : is_ty Ty
Is2 : is_e E
LkpA : X1 = X1 -> false
LkpA1 : lookup GA X1 V2
============================
lookup ((X1, V1)::GB) X1 V2
< apply LkpA to _.
Subgoal 3.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare 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) X1 V2
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
============================
lookup ((X, V1)::GB) X1 V2
< LkpA: case LkpA.
Subgoal 3.2.2.1:
Variables: SG GA GB E Ty X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X1 Ty E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Sec : level SG E public
Sec1 : no_lookup SG X1
Is : is_string X1
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : X1 = X1 -> false
LkpSec1 : lookup SG X1 public
============================
lookup ((X1, V2)::GB) X1 V2
< apply LkpSec to _.
Subgoal 3.2.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare 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
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< Rel: case Rel.
Subgoal 3.2.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declare 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
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
lookup ((X, V1)::GB) X1 V2
< apply Rel1 to LkpSec1 LkpA1.
Subgoal 3.2.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declare 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
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
H1 : lookup GB X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< search.
Subgoal 3.3:
Variables: SG GA GB X E Ty V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare 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
============================
forall X1 V,
lookup ((X, public)::SG) X1 public -> lookup ((X, V1)::GB) X1 V -> lookup ((X, V1)::GA) X1 V
< intros LkpSec LkpB.
Subgoal 3.3:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare 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
LkpSec : lookup ((X, public)::SG) X1 public
LkpB : lookup ((X, V1)::GB) X1 V2
============================
lookup ((X, V1)::GA) X1 V2
< LkpSec: case LkpSec.
Subgoal 3.3.1:
Variables: SG GA GB E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X1 Ty E) ((X1, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG X1
Is : is_string X1
Is1 : is_ty Ty
Is2 : is_e E
LkpB : lookup ((X1, V1)::GB) X1 V2
============================
lookup ((X1, V1)::GA) X1 V2
< LkpB: case LkpB.
Subgoal 3.3.1.1:
Variables: SG GA GB E Ty X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X1 Ty E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Sec : level SG E public
Sec1 : no_lookup SG X1
Is : is_string X1
Is1 : is_ty Ty
Is2 : is_e E
============================
lookup ((X1, V2)::GA) X1 V2
< search.
Subgoal 3.3.1.2:
Variables: SG GA GB E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X1 Ty E) ((X1, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Sec : level SG E public
Sec1 : no_lookup SG X1
Is : is_string X1
Is1 : is_ty Ty
Is2 : is_e E
LkpB : X1 = X1 -> false
LkpB1 : lookup GB X1 V2
============================
lookup ((X1, V1)::GA) X1 V2
< apply LkpB to _.
Subgoal 3.3.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare 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) X1 V2
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
============================
lookup ((X, V1)::GA) X1 V2
< LkpB: case LkpB.
Subgoal 3.3.2.1:
Variables: SG GA GB E Ty X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare X1 Ty E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Sec : level SG E public
Sec1 : no_lookup SG X1
Is : is_string X1
Is1 : is_ty Ty
Is2 : is_e E
LkpSec : X1 = X1 -> false
LkpSec1 : lookup SG X1 public
============================
lookup ((X1, V2)::GA) X1 V2
< apply LkpSec to _.
Subgoal 3.3.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declare 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
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V2
============================
lookup ((X, V1)::GA) X1 V2
< Rel: case Rel.
Subgoal 3.3.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declare 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
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V2
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
lookup ((X, V1)::GA) X1 V2
< apply Rel2 to LkpSec1 LkpB1.
Subgoal 3.3.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declare 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
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V2
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
H1 : lookup GA X1 V2
============================
lookup ((X, V1)::GA) X1 V2
< search.
Subgoal 4:
Variables: PC SG SG1 GA GB GB' V X E
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (assign X E)
Sec : secure PC SG (assign X E) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvB : eval_c GB (assign X E) GB'
EvA1 : eval_e GA E V
============================
public_equiv SG1 ((X, V)::GA) GB'
< EvB: case EvB.
Subgoal 4:
Variables: PC SG SG1 GA GB V X E V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (assign X E)
Sec : secure PC SG (assign X E) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
============================
public_equiv SG1 ((X, V)::GA) ((X, V1)::GB)
< Is: case Is.
Subgoal 4:
Variables: PC SG SG1 GA GB V X E V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Sec : secure PC SG (assign X E) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
============================
public_equiv SG1 ((X, V)::GA) ((X, V1)::GB)
< Sec: case Sec.
Subgoal 4.1:
Variables: SG1 GA GB V X E V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
============================
public_equiv SG1 ((X, V)::GA) ((X, V1)::GB)
< apply level_secure to _ Sec Rel EvA1 EvB.
Subgoal 4.1:
Variables: SG1 GA GB X E V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
============================
public_equiv SG1 ((X, V1)::GA) ((X, V1)::GB)
< unfold .
Subgoal 4.1.1:
Variables: SG1 GA GB X E V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
============================
forall X1 V2 V3,
lookup SG1 X1 public -> lookup ((X, V1)::GA) X1 V2 -> lookup ((X, V1)::GB) X1 V3 ->
V2 = V3
< intros LkpSec LkpA LkpB.
Subgoal 4.1.1:
Variables: SG1 GA GB X E V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X1 public
LkpA : lookup ((X, V1)::GA) X1 V2
LkpB : lookup ((X, V1)::GB) X1 V3
============================
V2 = V3
< LkpA: case LkpA.
Subgoal 4.1.1.1:
Variables: SG1 GA GB E X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X1 E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Is : is_string X1
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X1 public
LkpSec : lookup SG1 X1 public
LkpB : lookup ((X1, V2)::GB) X1 V3
============================
V2 = V3
< LkpB: case LkpB.
Subgoal 4.1.1.1.1:
Variables: SG1 GA GB E X1 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X1 E) ((X1, V3)::GA) @
EvA1 : eval_e GA E V3
EvB : eval_e GB E V3
Is : is_string X1
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X1 public
LkpSec : lookup SG1 X1 public
============================
V3 = V3
< search.
Subgoal 4.1.1.1.2:
Variables: SG1 GA GB E X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X1 E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Is : is_string X1
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X1 public
LkpSec : lookup SG1 X1 public
LkpB : X1 = X1 -> false
LkpB1 : lookup GB X1 V3
============================
V2 = V3
< apply LkpB to _.
Subgoal 4.1.1.2:
Variables: SG1 GA GB X E V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X1 public
LkpB : lookup ((X, V1)::GB) X1 V3
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
============================
V2 = V3
< LkpB: case LkpB.
Subgoal 4.1.1.2.1:
Variables: SG1 GA GB E X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X1 E) ((X1, V3)::GA) @
EvA1 : eval_e GA E V3
EvB : eval_e GB E V3
Is : is_string X1
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X1 public
LkpSec : lookup SG1 X1 public
LkpA : X1 = X1 -> false
LkpA1 : lookup GA X1 V2
============================
V2 = V3
< apply LkpA to _.
Subgoal 4.1.1.2.2:
Variables: SG1 GA GB X E V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
============================
V2 = V3
< Rel: case Rel.
Subgoal 4.1.1.2.2:
Variables: SG1 GA GB X E V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
V2 = V3
< apply Rel to LkpSec LkpA1 LkpB1.
Subgoal 4.1.1.2.2:
Variables: SG1 GA GB X E V1 X1 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V3
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
V3 = V3
< search.
Subgoal 4.1.2:
Variables: SG1 GA GB X E V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
============================
forall X1 V,
lookup SG1 X1 public -> lookup ((X, V1)::GA) X1 V -> lookup ((X, V1)::GB) X1 V
< intros LkpSec LkpA.
Subgoal 4.1.2:
Variables: SG1 GA GB X E V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X1 public
LkpA : lookup ((X, V1)::GA) X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< LkpA: case LkpA.
Subgoal 4.1.2.1:
Variables: SG1 GA GB E X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X1 E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Is : is_string X1
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X1 public
LkpSec : lookup SG1 X1 public
============================
lookup ((X1, V2)::GB) X1 V2
< search.
Subgoal 4.1.2.2:
Variables: SG1 GA GB X E V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< Rel: case Rel.
Subgoal 4.1.2.2:
Variables: SG1 GA GB X E V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
lookup ((X, V1)::GB) X1 V2
< apply Rel1 to LkpSec LkpA1.
Subgoal 4.1.2.2:
Variables: SG1 GA GB X E V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
H1 : lookup GB X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< search.
Subgoal 4.1.3:
Variables: SG1 GA GB X E V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
============================
forall X1 V,
lookup SG1 X1 public -> lookup ((X, V1)::GB) X1 V -> lookup ((X, V1)::GA) X1 V
< intros LkpSec LkpB.
Subgoal 4.1.3:
Variables: SG1 GA GB X E V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X1 public
LkpB : lookup ((X, V1)::GB) X1 V2
============================
lookup ((X, V1)::GA) X1 V2
< LkpB: case LkpB.
Subgoal 4.1.3.1:
Variables: SG1 GA GB E X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X1 E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Is : is_string X1
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X1 public
LkpSec : lookup SG1 X1 public
============================
lookup ((X1, V2)::GA) X1 V2
< search.
Subgoal 4.1.3.2:
Variables: SG1 GA GB X E V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X1 public
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V2
============================
lookup ((X, V1)::GA) X1 V2
< Rel: case Rel.
Subgoal 4.1.3.2:
Variables: SG1 GA GB X E V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X1 public
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V2
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
lookup ((X, V1)::GA) X1 V2
< apply Rel2 to LkpSec LkpB1.
Subgoal 4.1.3.2:
Variables: SG1 GA GB X E V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (assign X E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
LkpSec : lookup SG1 X1 public
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V2
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
H1 : lookup GA X1 V2
============================
lookup ((X, V1)::GA) X1 V2
< search.
Subgoal 4.2:
Variables: PC SG1 GA GB V X E V1 S
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
============================
public_equiv SG1 ((X, V)::GA) ((X, V1)::GB)
< unfold .
Subgoal 4.2.1:
Variables: PC SG1 GA GB V X E V1 S
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
============================
forall X1 V2 V3,
lookup SG1 X1 public -> lookup ((X, V)::GA) X1 V2 -> lookup ((X, V1)::GB) X1 V3 ->
V2 = V3
< intros LkpSec LkpA LkpB.
Subgoal 4.2.1:
Variables: PC SG1 GA GB V X E V1 S X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpA : lookup ((X, V)::GA) X1 V2
LkpB : lookup ((X, V1)::GB) X1 V3
============================
V2 = V3
< LkpA: case LkpA.
Subgoal 4.2.1.1:
Variables: PC SG1 GA GB E V1 S X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X1 E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V1
Is : is_string X1
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X1 private
LkpSec : lookup SG1 X1 public
LkpB : lookup ((X1, V1)::GB) X1 V3
============================
V2 = V3
< LkpB: case LkpB.
Subgoal 4.2.1.1.1:
Variables: PC SG1 GA GB E S X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X1 E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V3
Is : is_string X1
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X1 private
LkpSec : lookup SG1 X1 public
============================
V2 = V3
< apply lookup_unique to Sec1 LkpSec.
Subgoal 4.2.1.1.2:
Variables: PC SG1 GA GB E V1 S X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X1 E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V1
Is : is_string X1
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X1 private
LkpSec : lookup SG1 X1 public
LkpB : X1 = X1 -> false
LkpB1 : lookup GB X1 V3
============================
V2 = V3
< apply LkpB to _.
Subgoal 4.2.1.2:
Variables: PC SG1 GA GB V X E V1 S X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpB : lookup ((X, V1)::GB) X1 V3
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
============================
V2 = V3
< LkpB: case LkpB.
Subgoal 4.2.1.2.1:
Variables: PC SG1 GA GB V E S X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X1 E) ((X1, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V3
Is : is_string X1
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X1 private
LkpSec : lookup SG1 X1 public
LkpA : X1 = X1 -> false
LkpA1 : lookup GA X1 V2
============================
V2 = V3
< apply LkpA to _.
Subgoal 4.2.1.2.2:
Variables: PC SG1 GA GB V X E V1 S X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
============================
V2 = V3
< Rel: case Rel.
Subgoal 4.2.1.2.2:
Variables: PC SG1 GA GB V X E V1 S X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
V2 = V3
< apply Rel to LkpSec LkpA1 LkpB1.
Subgoal 4.2.1.2.2:
Variables: PC SG1 GA GB V X E V1 S X1 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V3
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
V3 = V3
< search.
Subgoal 4.2.2:
Variables: PC SG1 GA GB V X E V1 S
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
============================
forall X1 V2,
lookup SG1 X1 public -> lookup ((X, V)::GA) X1 V2 -> lookup ((X, V1)::GB) X1 V2
< intros LkpSec LkpA.
Subgoal 4.2.2:
Variables: PC SG1 GA GB V X E V1 S X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpA : lookup ((X, V)::GA) X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< LkpA: case LkpA.
Subgoal 4.2.2.1:
Variables: PC SG1 GA GB E V1 S X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X1 E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V1
Is : is_string X1
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X1 private
LkpSec : lookup SG1 X1 public
============================
lookup ((X1, V1)::GB) X1 V2
< apply lookup_unique to Sec1 LkpSec.
Subgoal 4.2.2.2:
Variables: PC SG1 GA GB V X E V1 S X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< Rel: case Rel.
Subgoal 4.2.2.2:
Variables: PC SG1 GA GB V X E V1 S X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
lookup ((X, V1)::GB) X1 V2
< apply Rel1 to LkpSec LkpA1.
Subgoal 4.2.2.2:
Variables: PC SG1 GA GB V X E V1 S X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
H1 : lookup GB X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< search.
Subgoal 4.2.3:
Variables: PC SG1 GA GB V X E V1 S
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
============================
forall X1 V2,
lookup SG1 X1 public -> lookup ((X, V1)::GB) X1 V2 -> lookup ((X, V)::GA) X1 V2
< intros LkpSec LkpB.
Subgoal 4.2.3:
Variables: PC SG1 GA GB V X E V1 S X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpB : lookup ((X, V1)::GB) X1 V2
============================
lookup ((X, V)::GA) X1 V2
< LkpB: case LkpB.
Subgoal 4.2.3.1:
Variables: PC SG1 GA GB V E S X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X1 E) ((X1, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V2
Is : is_string X1
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X1 private
LkpSec : lookup SG1 X1 public
============================
lookup ((X1, V)::GA) X1 V2
< apply lookup_unique to Sec1 LkpSec.
Subgoal 4.2.3.2:
Variables: PC SG1 GA GB V X E V1 S X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V2
============================
lookup ((X, V)::GA) X1 V2
< Rel: case Rel.
Subgoal 4.2.3.2:
Variables: PC SG1 GA GB V X E V1 S X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V2
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
lookup ((X, V)::GA) X1 V2
< apply Rel2 to LkpSec LkpB1.
Subgoal 4.2.3.2:
Variables: PC SG1 GA GB V X E V1 S X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (assign X E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X1 public
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V2
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
H1 : lookup GA X1 V2
============================
lookup ((X, V)::GA) X1 V2
< search.
Subgoal 5:
Variables: PC SG SG1 GA GA' GB GB' Else Then Cond
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (ifThenElse Cond Then Else)
Sec : secure PC SG (ifThenElse Cond Then Else) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvB : eval_c GB (ifThenElse Cond Then Else) GB'
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
============================
public_equiv SG1 GA' GB'
< Is: case Is.
Subgoal 5:
Variables: PC SG SG1 GA GA' GB GB' Else Then Cond
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Sec : secure PC SG (ifThenElse Cond Then Else) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvB : eval_c GB (ifThenElse Cond Then Else) GB'
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
============================
public_equiv SG1 GA' GB'
< Sec: case Sec.
Subgoal 5:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvB : eval_c GB (ifThenElse Cond Then Else) GB'
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
============================
public_equiv SG1 GA' GB'
< EvB: case EvB.
Subgoal 5.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
============================
public_equiv SG1 GA' GB'
< EqGA'GB': apply IH to _ _ _ EvA2 EvB1.
Subgoal 5.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
EqGA'GB' : public_equiv GTh GA' GB'
============================
public_equiv SG1 GA' GB'
< LkpEq: assert forall X,
lookup SG1 X public -> lookup GTh X public.
Subgoal 5.1.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
EqGA'GB' : public_equiv GTh GA' GB'
============================
forall X, lookup SG1 X public -> lookup GTh X public
< intros Lkp.
Subgoal 5.1.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl X
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
EqGA'GB' : public_equiv GTh GA' GB'
Lkp : lookup SG1 X public
============================
lookup GTh X public
< apply stmt_public_branch to Sec2 EvA2 Lkp.
Subgoal 5.1.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl X
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
EqGA'GB' : public_equiv GTh GA' GB'
Lkp : lookup SG1 X public
H1 : lookup GTh X public
============================
lookup GTh X public
< search.
Subgoal 5.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
EqGA'GB' : public_equiv GTh GA' GB'
LkpEq : forall X, lookup SG1 X public -> lookup GTh X public
============================
public_equiv SG1 GA' GB'
< apply public_equiv_swap to LkpEq EqGA'GB'.
Subgoal 5.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
EqGA'GB' : public_equiv GTh GA' GB'
LkpEq : forall X, lookup SG1 X public -> lookup GTh X public
H1 : public_equiv SG1 GA' GB'
============================
public_equiv SG1 GA' GB'
< search.
Subgoal 5.2:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
============================
public_equiv SG1 GA' GB'
< NEq: assert S = public -> false.
Subgoal 5.2.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
============================
S = public -> false
< intros Eq.
Subgoal 5.2.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
Eq : S = public
============================
false
< case Eq.
Subgoal 5.2.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond public
Sec1 : join PC public NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
============================
false
< apply level_not_public to Is _ _ EvA1 EvB _.
Subgoal 5.2:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : S = public -> false
============================
public_equiv SG1 GA' GB'
< EqGAGA': apply stmt_not_public_no_public_change to Sec2 _ EvA2.
Subgoal 5.2.2:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : S = public -> false
============================
NewPC = public -> false
< intros E.
Subgoal 5.2.2:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : S = public -> false
E : NewPC = public
============================
false
< case E.
Subgoal 5.2.2:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S public
Sec2 : secure public SG1 Then GTh
Sec3 : secure public SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : S = public -> false
============================
false
< apply join_public to Sec1.
Subgoal 5.2.2:
Variables: SG1 GA GA' GB GB' Else Then Cond GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond public
Sec1 : join public public public
Sec2 : secure public SG1 Then GTh
Sec3 : secure public SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : public = public -> false
============================
false
< backchain NEq.
Subgoal 5.2:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : S = 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: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : S = public -> false
EqGAGA' : public_equiv SG1 GA GA'
============================
NewPC = public -> false
< intros E.
Subgoal 5.2.3:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : S = public -> false
EqGAGA' : public_equiv SG1 GA GA'
E : NewPC = public
============================
false
< case E.
Subgoal 5.2.3:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S public
Sec2 : secure public SG1 Then GTh
Sec3 : secure public SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : S = public -> false
EqGAGA' : public_equiv SG1 GA GA'
============================
false
< apply join_public to Sec1.
Subgoal 5.2.3:
Variables: SG1 GA GA' GB GB' Else Then Cond GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond public
Sec1 : join public public public
Sec2 : secure public SG1 Then GTh
Sec3 : secure public SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : public = public -> false
EqGAGA' : public_equiv SG1 GA GA'
============================
false
< backchain NEq.
Subgoal 5.2:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : S = 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: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : S = 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: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : S = 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: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : S = 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: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Then GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
NEq : S = 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: PC SG SG1 GA GA' GB GB' Else Then Cond
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (ifThenElse Cond Then Else)
Sec : secure PC SG (ifThenElse Cond Then Else) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvB : eval_c GB (ifThenElse Cond Then Else) GB'
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
============================
public_equiv SG1 GA' GB'
< Is: case Is.
Subgoal 6:
Variables: PC SG SG1 GA GA' GB GB' Else Then Cond
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Sec : secure PC SG (ifThenElse Cond Then Else) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvB : eval_c GB (ifThenElse Cond Then Else) GB'
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
============================
public_equiv SG1 GA' GB'
< Sec: case Sec.
Subgoal 6:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvB : eval_c GB (ifThenElse Cond Then Else) GB'
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
============================
public_equiv SG1 GA' GB'
< EvB: case EvB.
Subgoal 6.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
============================
public_equiv SG1 GA' GB'
< NEq: assert S = public -> false.
Subgoal 6.1.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
============================
S = public -> false
< intros Eq.
Subgoal 6.1.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
Eq : S = public
============================
false
< case Eq.
Subgoal 6.1.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond public
Sec1 : join PC public NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
============================
false
< apply level_not_public to Is _ _ EvA1 EvB _.
Subgoal 6.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : S = public -> false
============================
public_equiv SG1 GA' GB'
< EqGAGA': apply stmt_not_public_no_public_change to Sec3 _ EvA2.
Subgoal 6.1.2:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : S = public -> false
============================
NewPC = public -> false
< intros E.
Subgoal 6.1.2:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : S = public -> false
E : NewPC = public
============================
false
< case E.
Subgoal 6.1.2:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S public
Sec2 : secure public SG1 Then GTh
Sec3 : secure public SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : S = public -> false
============================
false
< apply join_public to Sec1.
Subgoal 6.1.2:
Variables: SG1 GA GA' GB GB' Else Then Cond GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond public
Sec1 : join public public public
Sec2 : secure public SG1 Then GTh
Sec3 : secure public SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : public = public -> false
============================
false
< backchain NEq.
Subgoal 6.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : S = 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: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : S = public -> false
EqGAGA' : public_equiv SG1 GA GA'
============================
NewPC = public -> false
< intros E.
Subgoal 6.1.3:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : S = public -> false
EqGAGA' : public_equiv SG1 GA GA'
E : NewPC = public
============================
false
< case E.
Subgoal 6.1.3:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S public
Sec2 : secure public SG1 Then GTh
Sec3 : secure public SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : S = public -> false
EqGAGA' : public_equiv SG1 GA GA'
============================
false
< apply join_public to Sec1.
Subgoal 6.1.3:
Variables: SG1 GA GA' GB GB' Else Then Cond GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond public
Sec1 : join public public public
Sec2 : secure public SG1 Then GTh
Sec3 : secure public SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : public = public -> false
EqGAGA' : public_equiv SG1 GA GA'
============================
false
< backchain NEq.
Subgoal 6.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : S = 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: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : S = 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: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : S = 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: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : S = 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: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Then GB'
NEq : S = 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: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
============================
public_equiv SG1 GA' GB'
< EqGA'GB': apply IH to _ _ _ EvA2 EvB1.
Subgoal 6.2:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
EqGA'GB' : public_equiv GEl GA' GB'
============================
public_equiv SG1 GA' GB'
< LkpEq: assert forall X,
lookup SG1 X public -> lookup GEl X public.
Subgoal 6.2.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
EqGA'GB' : public_equiv GEl GA' GB'
============================
forall X, lookup SG1 X public -> lookup GEl X public
< intros Lkp.
Subgoal 6.2.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl X
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
EqGA'GB' : public_equiv GEl GA' GB'
Lkp : lookup SG1 X public
============================
lookup GEl X public
< apply stmt_public_branch to Sec3 EvA2 Lkp.
Subgoal 6.2.1:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl X
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
EqGA'GB' : public_equiv GEl GA' GB'
Lkp : lookup SG1 X public
H1 : lookup GEl X public
============================
lookup GEl X public
< search.
Subgoal 6.2:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
EqGA'GB' : public_equiv GEl GA' GB'
LkpEq : forall X, lookup SG1 X public -> lookup GEl X public
============================
public_equiv SG1 GA' GB'
< apply public_equiv_swap to LkpEq EqGA'GB'.
Subgoal 6.2:
Variables: PC SG1 GA GA' GB GB' Else Then Cond S NewPC GTh GEl
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (ifThenElse Cond Then Else) GA' @
EvA1 : eval_e GA Cond falseVal
EvA2 : eval_c GA Else GA' *
Is : is_e Cond
Is1 : is_c Then
Is2 : is_c Else
Sec : level SG1 Cond S
Sec1 : join PC S NewPC
Sec2 : secure NewPC SG1 Then GTh
Sec3 : secure NewPC SG1 Else GEl
EvB : eval_e GB Cond falseVal
EvB1 : eval_c GB Else GB'
EqGA'GB' : public_equiv GEl GA' GB'
LkpEq : forall X, lookup SG1 X public -> lookup GEl X public
H1 : public_equiv SG1 GA' GB'
============================
public_equiv SG1 GA' GB'
< search.
Subgoal 7:
Variables: PC SG SG1 GA' GB GB' Body Cond
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG (while Cond Body) SG1
Rel : public_equiv SG GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvB : eval_c GB (while Cond Body) GB'
EvA1 : eval_e GA' Cond falseVal
============================
public_equiv SG1 GA' GB'
< Is: case Is (keep).
Subgoal 7:
Variables: PC SG SG1 GA' GB GB' Body Cond
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG (while Cond Body) SG1
Rel : public_equiv SG GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvB : eval_c GB (while Cond Body) GB'
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
============================
public_equiv SG1 GA' GB'
< Sec: case Sec (keep).
Subgoal 7:
Variables: PC SG1 GA' GB GB' Body Cond S NewPC G1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvB : eval_c GB (while Cond Body) GB'
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G1
============================
public_equiv SG1 GA' GB'
< EvB: case EvB.
Subgoal 7.1:
Variables: PC SG1 GA' GB' Body Cond S NewPC G1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB'
EvA : eval_c GA' (while Cond Body) GA' @
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G1
EvB : eval_e GB' Cond falseVal
============================
public_equiv SG1 GA' GB'
< search.
Subgoal 7.2:
Variables: PC SG1 GA' GB GB' Body Cond S NewPC G1 G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G1
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G2
EvB2 : eval_c G2 (while Cond Body) GB'
============================
public_equiv SG1 GA' GB'
< SNEq: assert S = public -> false.
Subgoal 7.2.1:
Variables: PC SG1 GA' GB GB' Body Cond S NewPC G1 G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G1
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G2
EvB2 : eval_c G2 (while Cond Body) GB'
============================
S = public -> false
< intros Eq.
Subgoal 7.2.1:
Variables: PC SG1 GA' GB GB' Body Cond S NewPC G1 G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G1
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G2
EvB2 : eval_c G2 (while Cond Body) GB'
Eq : S = public
============================
false
< case Eq.
Subgoal 7.2.1:
Variables: PC SG1 GA' GB GB' Body Cond NewPC G1 G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond public
Sec2 : join PC public NewPC
Sec3 : secure NewPC SG1 Body G1
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G2
EvB2 : eval_c G2 (while Cond Body) GB'
============================
false
< apply level_not_public to Is1 _ _ EvA1 EvB _.
Subgoal 7.2:
Variables: PC SG1 GA' GB GB' Body Cond S NewPC G1 G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G1
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G2
EvB2 : eval_c G2 (while Cond Body) GB'
SNEq : S = public -> false
============================
public_equiv SG1 GA' GB'
< EqGBG2: apply stmt_not_public_no_public_change to Sec3 _ EvB1.
Subgoal 7.2.2:
Variables: PC SG1 GA' GB GB' Body Cond S NewPC G1 G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G1
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G2
EvB2 : eval_c G2 (while Cond Body) GB'
SNEq : S = public -> false
============================
NewPC = public -> false
< intros Eq.
Subgoal 7.2.2:
Variables: PC SG1 GA' GB GB' Body Cond S NewPC G1 G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G1
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G2
EvB2 : eval_c G2 (while Cond Body) GB'
SNEq : S = public -> false
Eq : NewPC = public
============================
false
< case Eq.
Subgoal 7.2.2:
Variables: PC SG1 GA' GB GB' Body Cond S G1 G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S public
Sec3 : secure public SG1 Body G1
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G2
EvB2 : eval_c G2 (while Cond Body) GB'
SNEq : S = public -> false
============================
false
< apply join_public to Sec2.
Subgoal 7.2.2:
Variables: SG1 GA' GB GB' Body Cond G1 G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure public SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond public
Sec2 : join public public public
Sec3 : secure public SG1 Body G1
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G2
EvB2 : eval_c G2 (while Cond Body) GB'
SNEq : public = public -> false
============================
false
< backchain SNEq.
Subgoal 7.2:
Variables: PC SG1 GA' GB GB' Body Cond S NewPC G1 G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G1
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G2
EvB2 : eval_c G2 (while Cond Body) GB'
SNEq : S = public -> false
EqGBG2 : public_equiv SG1 GB G2
============================
public_equiv SG1 GA' GB'
< EqGA'G2: apply public_equiv_trans to Rel EqGBG2.
Subgoal 7.2:
Variables: PC SG1 GA' GB GB' Body Cond S NewPC G1 G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G1
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G2
EvB2 : eval_c G2 (while Cond Body) GB'
SNEq : S = public -> false
EqGBG2 : public_equiv SG1 GB G2
EqGA'G2 : public_equiv SG1 GA' G2
============================
public_equiv SG1 GA' GB'
< EqG2GB': apply while_no_public_change to Sec Sec1 _ EvB2.
Subgoal 7.2:
Variables: PC SG1 GA' GB GB' Body Cond S NewPC G1 G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G1
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G2
EvB2 : eval_c G2 (while Cond Body) GB'
SNEq : S = public -> false
EqGBG2 : public_equiv SG1 GB G2
EqGA'G2 : public_equiv SG1 GA' G2
EqG2GB' : public_equiv SG1 G2 GB'
============================
public_equiv SG1 GA' GB'
< apply public_equiv_trans to EqGA'G2 EqG2GB'.
Subgoal 7.2:
Variables: PC SG1 GA' GB GB' Body Cond S NewPC G1 G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA' GB
EvA : eval_c GA' (while Cond Body) GA' @
EvA1 : eval_e GA' Cond falseVal
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G1
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G2
EvB2 : eval_c G2 (while Cond Body) GB'
SNEq : S = public -> false
EqGBG2 : public_equiv SG1 GB G2
EqGA'G2 : public_equiv SG1 GA' G2
EqG2GB' : public_equiv SG1 G2 GB'
H1 : public_equiv SG1 GA' GB'
============================
public_equiv SG1 GA' GB'
< search.
Subgoal 8:
Variables: PC SG SG1 GA GA' GB GB' G1 Body Cond
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG (while Cond Body) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (while Cond Body) GA' @
EvB : eval_c GB (while Cond Body) GB'
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
============================
public_equiv SG1 GA' GB'
< Is: case Is (keep).
Subgoal 8:
Variables: PC SG SG1 GA GA' GB GB' G1 Body Cond
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG (while Cond Body) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (while Cond Body) GA' @
EvB : eval_c GB (while Cond Body) GB'
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
============================
public_equiv SG1 GA' GB'
< Sec: case Sec (keep).
Subgoal 8:
Variables: PC SG1 GA GA' GB GB' G1 Body Cond S NewPC G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (while Cond Body) GA' @
EvB : eval_c GB (while Cond Body) GB'
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
============================
public_equiv SG1 GA' GB'
< EvB: case EvB.
Subgoal 8.1:
Variables: PC SG1 GA GA' GB' G1 Body Cond S NewPC G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB' Cond falseVal
============================
public_equiv SG1 GA' GB'
< SNEq: assert S = public -> false.
Subgoal 8.1.1:
Variables: PC SG1 GA GA' GB' G1 Body Cond S NewPC G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB' Cond falseVal
============================
S = public -> false
< intros Eq.
Subgoal 8.1.1:
Variables: PC SG1 GA GA' GB' G1 Body Cond S NewPC G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB' Cond falseVal
Eq : S = public
============================
false
< case Eq.
Subgoal 8.1.1:
Variables: PC SG1 GA GA' GB' G1 Body Cond NewPC G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond public
Sec2 : join PC public NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB' Cond falseVal
============================
false
< apply level_not_public to Is1 _ _ EvA1 EvB _.
Subgoal 8.1:
Variables: PC SG1 GA GA' GB' G1 Body Cond S NewPC G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB' Cond falseVal
SNEq : S = public -> false
============================
public_equiv SG1 GA' GB'
< EqGAG1: apply stmt_not_public_no_public_change to Sec3 _ EvA2.
Subgoal 8.1.2:
Variables: PC SG1 GA GA' GB' G1 Body Cond S NewPC G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB' Cond falseVal
SNEq : S = public -> false
============================
NewPC = public -> false
< intros Eq.
Subgoal 8.1.2:
Variables: PC SG1 GA GA' GB' G1 Body Cond S NewPC G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB' Cond falseVal
SNEq : S = public -> false
Eq : NewPC = public
============================
false
< case Eq.
Subgoal 8.1.2:
Variables: PC SG1 GA GA' GB' G1 Body Cond S G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S public
Sec3 : secure public SG1 Body G2
EvB : eval_e GB' Cond falseVal
SNEq : S = public -> false
============================
false
< apply join_public to Sec2.
Subgoal 8.1.2:
Variables: SG1 GA GA' GB' G1 Body Cond G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure public SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond public
Sec2 : join public public public
Sec3 : secure public SG1 Body G2
EvB : eval_e GB' Cond falseVal
SNEq : public = public -> false
============================
false
< backchain SNEq.
Subgoal 8.1:
Variables: PC SG1 GA GA' GB' G1 Body Cond S NewPC G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB' Cond falseVal
SNEq : S = public -> false
EqGAG1 : public_equiv SG1 GA G1
============================
public_equiv SG1 GA' GB'
< EqG1GA': apply while_no_public_change to Sec Sec1 _ EvA3.
Subgoal 8.1:
Variables: PC SG1 GA GA' GB' G1 Body Cond S NewPC G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB' Cond falseVal
SNEq : S = 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 8.1:
Variables: PC SG1 GA GA' GB' G1 Body Cond S NewPC G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB' Cond falseVal
SNEq : S = 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 8.1:
Variables: PC SG1 GA GA' GB' G1 Body Cond S NewPC G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB' Cond falseVal
SNEq : S = 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 8.1:
Variables: PC SG1 GA GA' GB' G1 Body Cond S NewPC G2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB'
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB' Cond falseVal
SNEq : S = 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.2:
Variables: PC SG1 GA GA' GB GB' G1 Body Cond S NewPC G2 G3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G3
EvB2 : eval_c G3 (while Cond Body) GB'
============================
public_equiv SG1 GA' GB'
< EqG1G3: apply IH to _ _ _ EvA2 EvB1.
Subgoal 8.2:
Variables: PC SG1 GA GA' GB GB' G1 Body Cond S NewPC G2 G3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G3
EvB2 : eval_c G3 (while Cond Body) GB'
EqG1G3 : public_equiv G2 G1 G3
============================
public_equiv SG1 GA' GB'
< LEq: assert forall X,
lookup SG1 X public -> lookup G2 X public.
Subgoal 8.2.1:
Variables: PC SG1 GA GA' GB GB' G1 Body Cond S NewPC G2 G3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G3
EvB2 : eval_c G3 (while Cond Body) GB'
EqG1G3 : public_equiv G2 G1 G3
============================
forall X, lookup SG1 X public -> lookup G2 X public
< intros Lkp.
Subgoal 8.2.1:
Variables: PC SG1 GA GA' GB GB' G1 Body Cond S NewPC G2 G3 X
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G3
EvB2 : eval_c G3 (while Cond Body) GB'
EqG1G3 : public_equiv G2 G1 G3
Lkp : lookup SG1 X public
============================
lookup G2 X public
< apply stmt_public_branch to Sec3 EvA2 Lkp.
Subgoal 8.2.1:
Variables: PC SG1 GA GA' GB GB' G1 Body Cond S NewPC G2 G3 X
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G3
EvB2 : eval_c G3 (while Cond Body) GB'
EqG1G3 : public_equiv G2 G1 G3
Lkp : lookup SG1 X public
H1 : lookup G2 X public
============================
lookup G2 X public
< search.
Subgoal 8.2:
Variables: PC SG1 GA GA' GB GB' G1 Body Cond S NewPC G2 G3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G3
EvB2 : eval_c G3 (while Cond Body) GB'
EqG1G3 : public_equiv G2 G1 G3
LEq : forall X, lookup SG1 X public -> lookup G2 X public
============================
public_equiv SG1 GA' GB'
< apply public_equiv_swap to LEq EqG1G3.
Subgoal 8.2:
Variables: PC SG1 GA GA' GB GB' G1 Body Cond S NewPC G2 G3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G3
EvB2 : eval_c G3 (while Cond Body) GB'
EqG1G3 : public_equiv G2 G1 G3
LEq : forall X, lookup SG1 X public -> lookup G2 X public
H1 : public_equiv SG1 G1 G3
============================
public_equiv SG1 GA' GB'
< EqG1GA': apply IH to Is Sec _ EvA3 EvB2.
Subgoal 8.2:
Variables: PC SG1 GA GA' GB GB' G1 Body Cond S NewPC G2 G3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (while Cond Body)
Sec : secure PC SG1 (while Cond Body) SG1
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (while Cond Body) GA' @
EvA1 : eval_e GA Cond trueVal
EvA2 : eval_c GA Body G1 *
EvA3 : eval_c G1 (while Cond Body) GA' *
Is1 : is_e Cond
Is2 : is_c Body
Sec1 : level SG1 Cond S
Sec2 : join PC S NewPC
Sec3 : secure NewPC SG1 Body G2
EvB : eval_e GB Cond trueVal
EvB1 : eval_c GB Body G3
EvB2 : eval_c G3 (while Cond Body) GB'
EqG1G3 : public_equiv G2 G1 G3
LEq : forall X, lookup SG1 X public -> lookup G2 X public
H1 : public_equiv SG1 G1 G3
EqG1GA' : public_equiv SG1 GA' GB'
============================
public_equiv SG1 GA' GB'
< search.
Subgoal 9:
Variables: PC SG SG1 GA GB GB' V Fields Result Rec E RecFields
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (recUpdate Rec RecFields E)
Sec : secure PC SG (recUpdate Rec RecFields E) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvB : eval_c GB (recUpdate Rec RecFields E) GB'
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
============================
public_equiv SG1 ((Rec, recVal Result)::GA) GB'
< EvB: case EvB.
Subgoal 9:
Variables: PC SG SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (recUpdate Rec RecFields E)
Sec : secure PC SG (recUpdate Rec RecFields E) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
============================
public_equiv SG1 ((Rec, recVal Result)::GA) ((Rec, recVal Result1)::GB)
< Is: case Is.
Subgoal 9:
Variables: PC SG SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Sec : secure PC SG (recUpdate Rec RecFields E) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
============================
public_equiv SG1 ((Rec, recVal Result)::GA) ((Rec, recVal Result1)::GB)
< Sec: case Sec.
Subgoal 9.1:
Variables: SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
============================
public_equiv SG1 ((Rec, recVal Result)::GA) ((Rec, recVal Result1)::GB)
< apply level_secure to _ Sec Rel EvA1 EvB.
Subgoal 9.1:
Variables: SG1 GA GB Fields Result Rec E RecFields V1 Fields1 Result1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V1 Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
============================
public_equiv SG1 ((Rec, recVal Result)::GA) ((Rec, recVal Result1)::GB)
< Rel: case Rel.
Subgoal 9.1:
Variables: SG1 GA GB Fields Result Rec E RecFields V1 Fields1 Result1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V1 Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
public_equiv SG1 ((Rec, recVal Result)::GA) ((Rec, recVal Result1)::GB)
< apply Rel to Sec1 EvA2 EvB1.
Subgoal 9.1:
Variables: SG1 GA GB Result Rec E RecFields V1 Fields1 Result1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
public_equiv SG1 ((Rec, recVal Result)::GA) ((Rec, recVal Result1)::GB)
< apply update_rec_fields_unique to EvA3 EvB2.
Subgoal 9.1:
Variables: SG1 GA GB Rec E RecFields V1 Fields1 Result1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
public_equiv SG1 ((Rec, recVal Result1)::GA) ((Rec, recVal Result1)::GB)
< unfold .
Subgoal 9.1.1:
Variables: SG1 GA GB Rec E RecFields V1 Fields1 Result1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
forall X V1 V2,
lookup SG1 X public -> lookup ((Rec, recVal Result1)::GA) X V1 -> lookup ((Rec, recVal Result1)::GB) X V2 ->
V1 = V2
< intros LkpSec LkpA LkpB.
Subgoal 9.1.1:
Variables: SG1 GA GB Rec E RecFields V1 Fields1 Result1 X V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
LkpA : lookup ((Rec, recVal Result1)::GA) X V2
LkpB : lookup ((Rec, recVal Result1)::GB) X V3
============================
V2 = V3
< LkpA: case LkpA.
Subgoal 9.1.1.1:
Variables: SG1 GA GB E RecFields V1 Fields1 Result1 X V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate X RecFields E) ((X, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA X (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB X (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string X
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
LkpB : lookup ((X, recVal Result1)::GB) X V3
============================
recVal Result1 = V3
< LkpB: case LkpB.
Subgoal 9.1.1.1.1:
Variables: SG1 GA GB E RecFields V1 Fields1 Result1 X
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate X RecFields E) ((X, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA X (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB X (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string X
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
============================
recVal Result1 = recVal Result1
< search.
Subgoal 9.1.1.1.2:
Variables: SG1 GA GB E RecFields V1 Fields1 Result1 X V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate X RecFields E) ((X, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA X (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB X (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string X
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
LkpB : X = X -> false
LkpB1 : lookup GB X V3
============================
recVal Result1 = V3
< apply LkpB to _.
Subgoal 9.1.1.2:
Variables: SG1 GA GB Rec E RecFields V1 Fields1 Result1 X V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
LkpB : lookup ((Rec, recVal Result1)::GB) X V3
LkpA : Rec = X -> false
LkpA1 : lookup GA X V2
============================
V2 = V3
< LkpB: case LkpB.
Subgoal 9.1.1.2.1:
Variables: SG1 GA GB E RecFields V1 Fields1 Result1 X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate X RecFields E) ((X, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA X (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB X (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string X
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
LkpA : X = X -> false
LkpA1 : lookup GA X V2
============================
V2 = recVal Result1
< apply LkpA to _.
Subgoal 9.1.1.2.2:
Variables: SG1 GA GB Rec E RecFields V1 Fields1 Result1 X V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
LkpA : Rec = X -> false
LkpA1 : lookup GA X V2
LkpB : Rec = X -> false
LkpB1 : lookup GB X V3
============================
V2 = V3
< apply Rel to LkpSec LkpA1 LkpB1.
Subgoal 9.1.1.2.2:
Variables: SG1 GA GB Rec E RecFields V1 Fields1 Result1 X V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
LkpA : Rec = X -> false
LkpA1 : lookup GA X V3
LkpB : Rec = X -> false
LkpB1 : lookup GB X V3
============================
V3 = V3
< search.
Subgoal 9.1.2:
Variables: SG1 GA GB Rec E RecFields V1 Fields1 Result1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
forall X V,
lookup SG1 X public -> lookup ((Rec, recVal Result1)::GA) X V -> lookup ((Rec, recVal Result1)::GB) X V
< intros LkpSec Lkp.
Subgoal 9.1.2:
Variables: SG1 GA GB Rec E RecFields V1 Fields1 Result1 X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
Lkp : lookup ((Rec, recVal Result1)::GA) X V2
============================
lookup ((Rec, recVal Result1)::GB) X V2
< Lkp: case Lkp.
Subgoal 9.1.2.1:
Variables: SG1 GA GB E RecFields V1 Fields1 Result1 X
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate X RecFields E) ((X, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA X (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB X (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string X
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
============================
lookup ((X, recVal Result1)::GB) X (recVal Result1)
< search.
Subgoal 9.1.2.2:
Variables: SG1 GA GB Rec E RecFields V1 Fields1 Result1 X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
Lkp : Rec = X -> false
Lkp1 : lookup GA X V2
============================
lookup ((Rec, recVal Result1)::GB) X V2
< apply Rel1 to LkpSec Lkp1.
Subgoal 9.1.2.2:
Variables: SG1 GA GB Rec E RecFields V1 Fields1 Result1 X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
Lkp : Rec = X -> false
Lkp1 : lookup GA X V2
H1 : lookup GB X V2
============================
lookup ((Rec, recVal Result1)::GB) X V2
< search.
Subgoal 9.1.3:
Variables: SG1 GA GB Rec E RecFields V1 Fields1 Result1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
forall X V,
lookup SG1 X public -> lookup ((Rec, recVal Result1)::GB) X V -> lookup ((Rec, recVal Result1)::GA) X V
< intros LkpSec Lkp.
Subgoal 9.1.3:
Variables: SG1 GA GB Rec E RecFields V1 Fields1 Result1 X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
Lkp : lookup ((Rec, recVal Result1)::GB) X V2
============================
lookup ((Rec, recVal Result1)::GA) X V2
< Lkp: case Lkp.
Subgoal 9.1.3.1:
Variables: SG1 GA GB E RecFields V1 Fields1 Result1 X
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate X RecFields E) ((X, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA X (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB X (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string X
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 X public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
============================
lookup ((X, recVal Result1)::GA) X (recVal Result1)
< search.
Subgoal 9.1.3.2:
Variables: SG1 GA GB Rec E RecFields V1 Fields1 Result1 X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
Lkp : Rec = X -> false
Lkp1 : lookup GB X V2
============================
lookup ((Rec, recVal Result1)::GA) X V2
< apply Rel2 to LkpSec Lkp1.
Subgoal 9.1.3.2:
Variables: SG1 GA GB Rec E RecFields V1 Fields1 Result1 X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result1)::GA) @
EvA1 : eval_e GA E V1
EvA2 : lookup GA Rec (recVal Fields1)
EvA3 : update_rec_fields RecFields Fields1 V1 Result1
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E public
Sec1 : lookup SG1 Rec public
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
LkpSec : lookup SG1 X public
Lkp : Rec = X -> false
Lkp1 : lookup GB X V2
H1 : lookup GA X V2
============================
lookup ((Rec, recVal Result1)::GA) X V2
< search.
Subgoal 9.2:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
============================
public_equiv SG1 ((Rec, recVal Result)::GA) ((Rec, recVal Result1)::GB)
< unfold .
Subgoal 9.2.1:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
============================
forall X V1 V2,
lookup SG1 X public -> lookup ((Rec, recVal Result)::GA) X V1 -> lookup ((Rec, recVal Result1)::GB) X V2 ->
V1 = V2
< intros LkpSec LkpA LkpB.
Subgoal 9.2.1:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S X V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
LkpA : lookup ((Rec, recVal Result)::GA) X V2
LkpB : lookup ((Rec, recVal Result1)::GB) X V3
============================
V2 = V3
< LkpA: case LkpA.
Subgoal 9.2.1.1:
Variables: PC SG1 GA GB V Fields Result E RecFields V1 Fields1 Result1 S X V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate X RecFields E) ((X, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA X (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB X (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string X
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X public
LkpB : lookup ((X, recVal Result1)::GB) X V3
============================
recVal Result = V3
< apply lookup_unique to Sec1 LkpSec.
Subgoal 9.2.1.2:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S X V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
LkpB : lookup ((Rec, recVal Result1)::GB) X V3
LkpA : Rec = X -> false
LkpA1 : lookup GA X V2
============================
V2 = V3
< LkpB: case LkpB.
Subgoal 9.2.1.2.1:
Variables: PC SG1 GA GB V Fields Result E RecFields V1 Fields1 Result1 S X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate X RecFields E) ((X, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA X (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB X (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string X
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X public
LkpA : X = X -> false
LkpA1 : lookup GA X V2
============================
V2 = recVal Result1
< apply LkpA to _.
Subgoal 9.2.1.2.2:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S X V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
LkpA : Rec = X -> false
LkpA1 : lookup GA X V2
LkpB : Rec = X -> false
LkpB1 : lookup GB X V3
============================
V2 = V3
< Rel: case Rel.
Subgoal 9.2.1.2.2:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S X V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
LkpA : Rec = X -> false
LkpA1 : lookup GA X V2
LkpB : Rec = X -> false
LkpB1 : lookup GB X V3
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
V2 = V3
< apply Rel to LkpSec LkpA1 LkpB1.
Subgoal 9.2.1.2.2:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S X V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
LkpA : Rec = X -> false
LkpA1 : lookup GA X V3
LkpB : Rec = X -> false
LkpB1 : lookup GB X V3
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
V3 = V3
< search.
Subgoal 9.2.2:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
============================
forall X V,
lookup SG1 X public -> lookup ((Rec, recVal Result)::GA) X V -> lookup ((Rec, recVal Result1)::GB) X V
< intros LkpSec Lkp.
Subgoal 9.2.2:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
Lkp : lookup ((Rec, recVal Result)::GA) X V2
============================
lookup ((Rec, recVal Result1)::GB) X V2
< Lkp: case Lkp.
Subgoal 9.2.2.1:
Variables: PC SG1 GA GB V Fields Result E RecFields V1 Fields1 Result1 S X
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate X RecFields E) ((X, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA X (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB X (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string X
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X public
============================
lookup ((X, recVal Result1)::GB) X (recVal Result)
< apply lookup_unique to Sec1 LkpSec.
Subgoal 9.2.2.2:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
Lkp : Rec = X -> false
Lkp1 : lookup GA X V2
============================
lookup ((Rec, recVal Result1)::GB) X V2
< Rel: case Rel.
Subgoal 9.2.2.2:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
Lkp : Rec = X -> false
Lkp1 : lookup GA X V2
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
lookup ((Rec, recVal Result1)::GB) X V2
< apply Rel1 to LkpSec Lkp1.
Subgoal 9.2.2.2:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
Lkp : Rec = X -> false
Lkp1 : lookup GA X V2
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
H1 : lookup GB X V2
============================
lookup ((Rec, recVal Result1)::GB) X V2
< search.
Subgoal 9.2.3:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
============================
forall X V,
lookup SG1 X public -> lookup ((Rec, recVal Result1)::GB) X V -> lookup ((Rec, recVal Result)::GA) X V
< intros LkpSec Lkp.
Subgoal 9.2.3:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
Lkp : lookup ((Rec, recVal Result1)::GB) X V2
============================
lookup ((Rec, recVal Result)::GA) X V2
< Lkp: case Lkp.
Subgoal 9.2.3.1:
Variables: PC SG1 GA GB V Fields Result E RecFields V1 Fields1 Result1 S X
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate X RecFields E) ((X, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA X (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB X (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string X
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 X private
LkpSec : lookup SG1 X public
============================
lookup ((X, recVal Result)::GA) X (recVal Result1)
< apply lookup_unique to Sec1 LkpSec.
Subgoal 9.2.3.2:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG1 GA GB
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
Lkp : Rec = X -> false
Lkp1 : lookup GB X V2
============================
lookup ((Rec, recVal Result)::GA) X V2
< Rel: case Rel.
Subgoal 9.2.3.2:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
Lkp : Rec = X -> false
Lkp1 : lookup GB X V2
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
============================
lookup ((Rec, recVal Result)::GA) X V2
< apply Rel2 to LkpSec Lkp1.
Subgoal 9.2.3.2:
Variables: PC SG1 GA GB V Fields Result Rec E RecFields V1 Fields1 Result1 S X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (recUpdate Rec RecFields E) ((Rec, recVal Result)::GA) @
EvA1 : eval_e GA E V
EvA2 : lookup GA Rec (recVal Fields)
EvA3 : update_rec_fields RecFields Fields V Result
EvB : eval_e GB E V1
EvB1 : lookup GB Rec (recVal Fields1)
EvB2 : update_rec_fields RecFields Fields1 V1 Result1
Is : is_string Rec
Is1 : is_recFields RecFields
Is2 : is_e E
Sec : level SG1 E S
Sec1 : lookup SG1 Rec private
LkpSec : lookup SG1 X public
Lkp : Rec = X -> false
Lkp1 : lookup GB X V2
Rel : forall X V1 V2,
lookup SG1 X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V
H1 : lookup GA X V2
============================
lookup ((Rec, recVal Result)::GA) X V2
< search.
Subgoal 10:
Variables: PC SG SG1 GA GB GB' V X E Ty S
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (declareSec X S Ty E)
Sec : secure PC SG (declareSec X S Ty E) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X S Ty E) ((X, V)::GA) @
EvB : eval_c GB (declareSec X S Ty E) GB'
EvA1 : eval_e GA E V
============================
public_equiv SG1 ((X, V)::GA) GB'
< EvB: case EvB.
Subgoal 10:
Variables: PC SG SG1 GA GB V X E Ty S V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c (declareSec X S Ty E)
Sec : secure PC SG (declareSec X S Ty E) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X S Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
============================
public_equiv SG1 ((X, V)::GA) ((X, V1)::GB)
< Is: case Is.
Subgoal 10:
Variables: PC SG SG1 GA GB V X E Ty S V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Sec : secure PC SG (declareSec X S Ty E) SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X S Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel S
Is2 : is_ty Ty
Is3 : is_e E
============================
public_equiv SG1 ((X, V)::GA) ((X, V1)::GB)
< Sec: case Sec.
Subgoal 10.1:
Variables: PC SG GA GB V X E Ty V1 S1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
============================
public_equiv ((X, private)::SG) ((X, V)::GA) ((X, V1)::GB)
< unfold .
Subgoal 10.1.1:
Variables: PC SG GA GB V X E Ty V1 S1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
============================
forall X1 V2 V3,
lookup ((X, private)::SG) X1 public -> lookup ((X, V)::GA) X1 V2 -> lookup ((X, V1)::GB) X1 V3 ->
V2 = V3
< intros LkpSec LkpA LkpB.
Subgoal 10.1.1:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
LkpSec : lookup ((X, private)::SG) X1 public
LkpA : lookup ((X, V)::GA) X1 V2
LkpB : lookup ((X, V1)::GB) X1 V3
============================
V2 = V3
< LkpSec: case LkpSec.
Subgoal 10.1.1:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
LkpA : lookup ((X, V)::GA) X1 V2
LkpB : lookup ((X, V1)::GB) X1 V3
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
============================
V2 = V3
< LkpA: case LkpA.
Subgoal 10.1.1.1:
Variables: PC SG GA GB E Ty V1 S1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 private Ty E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V1
Is : is_string X1
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X1
LkpB : lookup ((X1, V1)::GB) X1 V3
LkpSec : X1 = X1 -> false
LkpSec1 : lookup SG X1 public
============================
V2 = V3
< apply LkpSec to _.
Subgoal 10.1.1.2:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
LkpB : lookup ((X, V1)::GB) X1 V3
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
============================
V2 = V3
< LkpB: case LkpB.
Subgoal 10.1.1.2.1:
Variables: PC SG GA GB V E Ty S1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 private Ty E) ((X1, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V3
Is : is_string X1
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X1
LkpSec : X1 = X1 -> false
LkpSec1 : lookup SG X1 public
LkpA : X1 = X1 -> false
LkpA1 : lookup GA X1 V2
============================
V2 = V3
< apply LkpSec to _.
Subgoal 10.1.1.2.2:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
============================
V2 = V3
< Rel: case Rel.
Subgoal 10.1.1.2.2:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
V2 = V3
< apply Rel to LkpSec1 LkpA1 LkpB1.
Subgoal 10.1.1.2.2:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V3
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
V3 = V3
< search.
Subgoal 10.1.2:
Variables: PC SG GA GB V X E Ty V1 S1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
============================
forall X1 V2,
lookup ((X, private)::SG) X1 public -> lookup ((X, V)::GA) X1 V2 -> lookup ((X, V1)::GB) X1 V2
< intros LkpSec Lkp.
Subgoal 10.1.2:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
LkpSec : lookup ((X, private)::SG) X1 public
Lkp : lookup ((X, V)::GA) X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< LkpSec: case LkpSec.
Subgoal 10.1.2:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
Lkp : lookup ((X, V)::GA) X1 V2
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
============================
lookup ((X, V1)::GB) X1 V2
< Lkp: case Lkp.
Subgoal 10.1.2.1:
Variables: PC SG GA GB E Ty V1 S1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 private Ty E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V1
Is : is_string X1
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X1
LkpSec : X1 = X1 -> false
LkpSec1 : lookup SG X1 public
============================
lookup ((X1, V1)::GB) X1 V2
< apply LkpSec to _.
Subgoal 10.1.2.2:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
Lkp : X = X1 -> false
Lkp1 : lookup GA X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< Rel: case Rel.
Subgoal 10.1.2.2:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
Lkp : X = X1 -> false
Lkp1 : lookup GA X1 V2
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
lookup ((X, V1)::GB) X1 V2
< apply Rel1 to LkpSec1 Lkp1.
Subgoal 10.1.2.2:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
Lkp : X = X1 -> false
Lkp1 : lookup GA X1 V2
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
H1 : lookup GB X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< search.
Subgoal 10.1.3:
Variables: PC SG GA GB V X E Ty V1 S1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
============================
forall X1 V2,
lookup ((X, private)::SG) X1 public -> lookup ((X, V1)::GB) X1 V2 -> lookup ((X, V)::GA) X1 V2
< intros LkpSec Lkp.
Subgoal 10.1.3:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
LkpSec : lookup ((X, private)::SG) X1 public
Lkp : lookup ((X, V1)::GB) X1 V2
============================
lookup ((X, V)::GA) X1 V2
< LkpSec: case LkpSec.
Subgoal 10.1.3:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
Lkp : lookup ((X, V1)::GB) X1 V2
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
============================
lookup ((X, V)::GA) X1 V2
< Lkp: case Lkp.
Subgoal 10.1.3.1:
Variables: PC SG GA GB V E Ty S1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 private Ty E) ((X1, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V2
Is : is_string X1
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X1
LkpSec : X1 = X1 -> false
LkpSec1 : lookup SG X1 public
============================
lookup ((X1, V)::GA) X1 V2
< apply LkpSec to _.
Subgoal 10.1.3.2:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
Lkp : X = X1 -> false
Lkp1 : lookup GB X1 V2
============================
lookup ((X, V)::GA) X1 V2
< Rel: case Rel.
Subgoal 10.1.3.2:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
Lkp : X = X1 -> false
Lkp1 : lookup GB X1 V2
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
lookup ((X, V)::GA) X1 V2
< apply Rel2 to LkpSec1 Lkp1.
Subgoal 10.1.3.2:
Variables: PC SG GA GB V X E Ty V1 S1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declareSec X private Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel private
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E S1
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
Lkp : X = X1 -> false
Lkp1 : lookup GB X1 V2
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
H1 : lookup GA X1 V2
============================
lookup ((X, V)::GA) X1 V2
< search.
Subgoal 10.2:
Variables: SG GA GB V X E Ty V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V)::GA) @
EvA1 : eval_e GA E V
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
============================
public_equiv ((X, public)::SG) ((X, V)::GA) ((X, V1)::GB)
< apply level_secure to _ Sec Rel EvA1 EvB.
Subgoal 10.2:
Variables: SG GA GB X E Ty V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
============================
public_equiv ((X, public)::SG) ((X, V1)::GA) ((X, V1)::GB)
< unfold .
Subgoal 10.2.1:
Variables: SG GA GB X E Ty V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
============================
forall X1 V2 V3,
lookup ((X, public)::SG) X1 public -> lookup ((X, V1)::GA) X1 V2 -> lookup ((X, V1)::GB) X1 V3 ->
V2 = V3
< intros LkpSec LkpA LkpB.
Subgoal 10.2.1:
Variables: SG GA GB X E Ty V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpSec : lookup ((X, public)::SG) X1 public
LkpA : lookup ((X, V1)::GA) X1 V2
LkpB : lookup ((X, V1)::GB) X1 V3
============================
V2 = V3
< LkpA: case LkpA.
Subgoal 10.2.1.1:
Variables: SG GA GB E Ty X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 public Ty E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Is : is_string X1
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X1
LkpSec : lookup ((X1, public)::SG) X1 public
LkpB : lookup ((X1, V2)::GB) X1 V3
============================
V2 = V3
< LkpB: case LkpB.
Subgoal 10.2.1.1.1:
Variables: SG GA GB E Ty X1 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 public Ty E) ((X1, V3)::GA) @
EvA1 : eval_e GA E V3
EvB : eval_e GB E V3
Is : is_string X1
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X1
LkpSec : lookup ((X1, public)::SG) X1 public
============================
V3 = V3
< search.
Subgoal 10.2.1.1.2:
Variables: SG GA GB E Ty X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 public Ty E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Is : is_string X1
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X1
LkpSec : lookup ((X1, public)::SG) X1 public
LkpB : X1 = X1 -> false
LkpB1 : lookup GB X1 V3
============================
V2 = V3
< apply LkpB to _.
Subgoal 10.2.1.2:
Variables: SG GA GB X E Ty V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpSec : lookup ((X, public)::SG) X1 public
LkpB : lookup ((X, V1)::GB) X1 V3
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
============================
V2 = V3
< LkpB: case LkpB.
Subgoal 10.2.1.2.1:
Variables: SG GA GB E Ty X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 public Ty E) ((X1, V3)::GA) @
EvA1 : eval_e GA E V3
EvB : eval_e GB E V3
Is : is_string X1
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X1
LkpSec : lookup ((X1, public)::SG) X1 public
LkpA : X1 = X1 -> false
LkpA1 : lookup GA X1 V2
============================
V2 = V3
< apply LkpA to _.
Subgoal 10.2.1.2.2:
Variables: SG GA GB X E Ty V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpSec : lookup ((X, public)::SG) X1 public
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
============================
V2 = V3
< LkpSec: case LkpSec.
Subgoal 10.2.1.2.2.1:
Variables: SG GA GB E Ty V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 public Ty E) ((X1, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X1
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X1
LkpA : X1 = X1 -> false
LkpA1 : lookup GA X1 V2
LkpB : X1 = X1 -> false
LkpB1 : lookup GB X1 V3
============================
V2 = V3
< apply LkpA to _.
Subgoal 10.2.1.2.2.2:
Variables: SG GA GB X E Ty V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
============================
V2 = V3
< Rel: case Rel.
Subgoal 10.2.1.2.2.2:
Variables: SG GA GB X E Ty V1 X1 V2 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V2
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
V2 = V3
< apply Rel to LkpSec1 LkpA1 LkpB1.
Subgoal 10.2.1.2.2.2:
Variables: SG GA GB X E Ty V1 X1 V3
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpA : X = X1 -> false
LkpA1 : lookup GA X1 V3
LkpB : X = X1 -> false
LkpB1 : lookup GB X1 V3
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
V3 = V3
< search.
Subgoal 10.2.2:
Variables: SG GA GB X E Ty V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
============================
forall X1 V,
lookup ((X, public)::SG) X1 public -> lookup ((X, V1)::GA) X1 V -> lookup ((X, V1)::GB) X1 V
< intros LkpSec Lkp.
Subgoal 10.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpSec : lookup ((X, public)::SG) X1 public
Lkp : lookup ((X, V1)::GA) X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< LkpSec: case LkpSec.
Subgoal 10.2.2.1:
Variables: SG GA GB E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 public Ty E) ((X1, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X1
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X1
Lkp : lookup ((X1, V1)::GA) X1 V2
============================
lookup ((X1, V1)::GB) X1 V2
< Lkp: case Lkp.
Subgoal 10.2.2.1.1:
Variables: SG GA GB E Ty X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 public Ty E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Is : is_string X1
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X1
============================
lookup ((X1, V2)::GB) X1 V2
< search.
Subgoal 10.2.2.1.2:
Variables: SG GA GB E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 public Ty E) ((X1, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X1
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X1
Lkp : X1 = X1 -> false
Lkp1 : lookup GA X1 V2
============================
lookup ((X1, V1)::GB) X1 V2
< apply Lkp to _.
Subgoal 10.2.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
Lkp : lookup ((X, V1)::GA) X1 V2
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
============================
lookup ((X, V1)::GB) X1 V2
< Lkp: case Lkp.
Subgoal 10.2.2.2.1:
Variables: SG GA GB E Ty X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 public Ty E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Is : is_string X1
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X1
LkpSec : X1 = X1 -> false
LkpSec1 : lookup SG X1 public
============================
lookup ((X1, V2)::GB) X1 V2
< apply LkpSec to _.
Subgoal 10.2.2.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
Lkp : X = X1 -> false
Lkp1 : lookup GA X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< Rel: case Rel.
Subgoal 10.2.2.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
Lkp : X = X1 -> false
Lkp1 : lookup GA X1 V2
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
lookup ((X, V1)::GB) X1 V2
< apply Rel1 to LkpSec1 Lkp1.
Subgoal 10.2.2.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
Lkp : X = X1 -> false
Lkp1 : lookup GA X1 V2
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
H1 : lookup GB X1 V2
============================
lookup ((X, V1)::GB) X1 V2
< search.
Subgoal 10.2.3:
Variables: SG GA GB X E Ty V1
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
============================
forall X1 V,
lookup ((X, public)::SG) X1 public -> lookup ((X, V1)::GB) X1 V -> lookup ((X, V1)::GA) X1 V
< intros LkpSec Lkp.
Subgoal 10.2.3:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpSec : lookup ((X, public)::SG) X1 public
Lkp : lookup ((X, V1)::GB) X1 V2
============================
lookup ((X, V1)::GA) X1 V2
< LkpSec: case LkpSec.
Subgoal 10.2.3.1:
Variables: SG GA GB E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 public Ty E) ((X1, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X1
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X1
Lkp : lookup ((X1, V1)::GB) X1 V2
============================
lookup ((X1, V1)::GA) X1 V2
< Lkp: case Lkp.
Subgoal 10.2.3.1.1:
Variables: SG GA GB E Ty X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 public Ty E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Is : is_string X1
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X1
============================
lookup ((X1, V2)::GA) X1 V2
< search.
Subgoal 10.2.3.1.2:
Variables: SG GA GB E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 public Ty E) ((X1, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X1
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X1
Lkp : X1 = X1 -> false
Lkp1 : lookup GB X1 V2
============================
lookup ((X1, V1)::GA) X1 V2
< apply Lkp to _.
Subgoal 10.2.3.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
Lkp : lookup ((X, V1)::GB) X1 V2
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
============================
lookup ((X, V1)::GA) X1 V2
< Lkp: case Lkp.
Subgoal 10.2.3.2.1:
Variables: SG GA GB E Ty X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X1 public Ty E) ((X1, V2)::GA) @
EvA1 : eval_e GA E V2
EvB : eval_e GB E V2
Is : is_string X1
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X1
LkpSec : X1 = X1 -> false
LkpSec1 : lookup SG X1 public
============================
lookup ((X1, V2)::GA) X1 V2
< apply LkpSec to _.
Subgoal 10.2.3.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Rel : public_equiv SG GA GB
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
Lkp : X = X1 -> false
Lkp1 : lookup GB X1 V2
============================
lookup ((X, V1)::GA) X1 V2
< Rel: case Rel.
Subgoal 10.2.3.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
Lkp : X = X1 -> false
Lkp1 : lookup GB X1 V2
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
============================
lookup ((X, V1)::GA) X1 V2
< apply Rel2 to LkpSec1 Lkp1.
Subgoal 10.2.3.2.2:
Variables: SG GA GB X E Ty V1 X1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
EvA : eval_c GA (declareSec X public Ty E) ((X, V1)::GA) @
EvA1 : eval_e GA E V1
EvB : eval_e GB E V1
Is : is_string X
Is1 : is_seclevel public
Is2 : is_ty Ty
Is3 : is_e E
Sec : level SG E public
Sec1 : no_lookup SG X
LkpSec : X = X1 -> false
LkpSec1 : lookup SG X1 public
Lkp : X = X1 -> false
Lkp1 : lookup GB X1 V2
Rel : forall X V1 V2,
lookup SG X public -> lookup GA X V1 -> lookup GB X V2 -> V1 = V2
Rel1 : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
Rel2 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
H1 : lookup GA X1 V2
============================
lookup ((X, V1)::GA) X1 V2
< search.
Subgoal 11:
Variables: PC SG SG1 GA GA' GB GB' T
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Sec : secure PC SG <unknown K eval_c> SG1
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> T
EvA2 : eval_c GA T GA' *
============================
public_equiv SG1 GA' GB'
< Sec: case Sec.
Subgoal 11:
Variables: PC SG SG1 GA GA' GB GB' T CT
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> T
EvA2 : eval_c GA T GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
============================
public_equiv SG1 GA' GB'
< apply proj_c_unique to EvA1 Sec.
Subgoal 11:
Variables: PC SG SG1 GA GA' GB GB' CT
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
============================
public_equiv SG1 GA' GB'
< EvBProj: apply proj_c_eval to EvA1 EvB.
Subgoal 11:
Variables: PC SG SG1 GA GA' GB GB' CT G'
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
============================
public_equiv SG1 GA' GB'
< IsCT: apply proj_c_is to Sec Is.
Subgoal 11:
Variables: PC SG SG1 GA GA' GB GB' CT G'
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
============================
public_equiv SG1 GA' GB'
< Equiv: apply IH to _ Sec1 Rel EvA2 EvBProj.
Subgoal 11:
Variables: PC SG SG1 GA GA' GB GB' CT G'
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
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 11.1:
Variables: PC SG SG1 GA GA' GB GB' CT G'
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
Equiv : public_equiv SG1 GA' G'
============================
forall X V, lookup GB' X V -> lookup G' X V
< intros L.
Subgoal 11.1:
Variables: PC SG SG1 GA GA' GB GB' CT G' X V
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
Equiv : public_equiv SG1 GA' G'
L : lookup GB' X V
============================
lookup G' X V
< apply proj_c_eval_results to EvA1 EvB EvBProj L.
Subgoal 11.1:
Variables: PC SG SG1 GA GA' GB GB' CT G' X V
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
Equiv : public_equiv SG1 GA' G'
L : lookup GB' X V
H1 : lookup G' X V
============================
lookup G' X V
< search.
Subgoal 11:
Variables: PC SG SG1 GA GA' GB GB' CT G'
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
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 11.2:
Variables: PC SG SG1 GA GA' GB GB' CT G'
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
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 11.2.1:
Variables: PC SG SG1 GA GA' GB GB' CT G'
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
Equiv : public_equiv SG1 GA' G'
LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V
============================
forall X V1 V2,
lookup SG1 X public -> lookup G' X V1 -> lookup GB' X V2 -> V1 = V2
< intros LkpSec LkpG' LkpGB'.
Subgoal 11.2.1:
Variables: PC SG SG1 GA GA' GB GB' CT G' X V1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
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 V1
LkpGB' : lookup GB' X V2
============================
V1 = V2
< Lkp: apply LkpGB'G' to LkpGB'.
Subgoal 11.2.1:
Variables: PC SG SG1 GA GA' GB GB' CT G' X V1 V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
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 V1
LkpGB' : lookup GB' X V2
Lkp : lookup G' X V2
============================
V1 = V2
< apply lookup_unique to LkpG' Lkp.
Subgoal 11.2.1:
Variables: PC SG SG1 GA GA' GB GB' CT G' X V2
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
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 V2
LkpGB' : lookup GB' X V2
Lkp : lookup G' X V2
============================
V2 = V2
< search.
Subgoal 11.2.2:
Variables: PC SG SG1 GA GA' GB GB' CT G'
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
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 11.2.2:
Variables: PC SG SG1 GA GA' GB GB' CT G' X V
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
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_c_eval_results_back to Sec EvB EvBProj LkpG'.
Subgoal 11.2.2:
Variables: PC SG SG1 GA GA' GB GB' CT G' X V
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
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 11.2.3:
Variables: PC SG SG1 GA GA' GB GB' CT G'
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
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 11.2.3:
Variables: PC SG SG1 GA GA' GB GB' CT G' X V
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
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 11:
Variables: PC SG SG1 GA GA' GB GB' CT G'
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
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 11:
Variables: PC SG SG1 GA GA' GB GB' CT G'
IH : forall C PC SG SG1 GA GA' GB GB',
is_c C -> secure PC SG C SG1 -> public_equiv SG GA GB -> eval_c GA C GA' * ->
eval_c GB C GB' -> public_equiv SG1 GA' GB'
Is : is_c <unknown K eval_c>
Rel : public_equiv SG GA GB
EvA : eval_c GA <unknown K eval_c> GA' @
EvB : eval_c GB <unknown K eval_c> GB'
EvA1 : |{c}- <unknown K eval_c> ~~> CT
EvA2 : eval_c GA CT GA' *
Sec : |{c}- <unknown K eval_c> ~~> CT
Sec1 : secure PC SG CT SG1
EvBProj : eval_c GB CT G'
IsCT : is_c CT
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.