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