20 bind_thm ("parts_insert_spies", |
20 bind_thm ("parts_insert_spies", |
21 parts_insert |> |
21 parts_insert |> |
22 read_instantiate_sg (sign_of thy) [("H", "spies evs")]); |
22 read_instantiate_sg (sign_of thy) [("H", "spies evs")]); |
23 |
23 |
24 |
24 |
25 goal thy |
25 Goal |
26 "P(event_case sf nf ev) = \ |
26 "P(event_case sf nf ev) = \ |
27 \ ((ALL A B X. ev = Says A B X --> P(sf A B X)) & \ |
27 \ ((ALL A B X. ev = Says A B X --> P(sf A B X)) & \ |
28 \ (ALL A X. ev = Notes A X --> P(nf A X)))"; |
28 \ (ALL A X. ev = Notes A X --> P(nf A X)))"; |
29 by (induct_tac "ev" 1); |
29 by (induct_tac "ev" 1); |
30 by Auto_tac; |
30 by Auto_tac; |
31 qed "expand_event_case"; |
31 qed "expand_event_case"; |
32 |
32 |
33 goal thy "spies (Says A B X # evs) = insert X (spies evs)"; |
33 Goal "spies (Says A B X # evs) = insert X (spies evs)"; |
34 by (Simp_tac 1); |
34 by (Simp_tac 1); |
35 qed "spies_Says"; |
35 qed "spies_Says"; |
36 |
36 |
37 (*The point of letting the Spy see "bad" agents' notes is to prevent |
37 (*The point of letting the Spy see "bad" agents' notes is to prevent |
38 redundant case-splits on whether A=Spy and whether A:bad*) |
38 redundant case-splits on whether A=Spy and whether A:bad*) |
39 goal thy "spies (Notes A X # evs) = \ |
39 Goal "spies (Notes A X # evs) = \ |
40 \ (if A:bad then insert X (spies evs) else spies evs)"; |
40 \ (if A:bad then insert X (spies evs) else spies evs)"; |
41 by (Simp_tac 1); |
41 by (Simp_tac 1); |
42 qed "spies_Notes"; |
42 qed "spies_Notes"; |
43 |
43 |
44 goal thy "spies evs <= spies (Says A B X # evs)"; |
44 Goal "spies evs <= spies (Says A B X # evs)"; |
45 by (simp_tac (simpset() addsimps [subset_insertI]) 1); |
45 by (simp_tac (simpset() addsimps [subset_insertI]) 1); |
46 qed "spies_subset_spies_Says"; |
46 qed "spies_subset_spies_Says"; |
47 |
47 |
48 goal thy "spies evs <= spies (Notes A X # evs)"; |
48 Goal "spies evs <= spies (Notes A X # evs)"; |
49 by (Simp_tac 1); |
49 by (Simp_tac 1); |
50 by (Fast_tac 1); |
50 by (Fast_tac 1); |
51 qed "spies_subset_spies_Notes"; |
51 qed "spies_subset_spies_Notes"; |
52 |
52 |
53 (*Spy sees all traffic*) |
53 (*Spy sees all traffic*) |
54 goal thy "Says A B X : set evs --> X : spies evs"; |
54 Goal "Says A B X : set evs --> X : spies evs"; |
55 by (induct_tac "evs" 1); |
55 by (induct_tac "evs" 1); |
56 by (ALLGOALS (asm_simp_tac (simpset() addsplits [expand_event_case]))); |
56 by (ALLGOALS (asm_simp_tac (simpset() addsplits [expand_event_case]))); |
57 qed_spec_mp "Says_imp_spies"; |
57 qed_spec_mp "Says_imp_spies"; |
58 |
58 |
59 (*Spy sees Notes of bad agents*) |
59 (*Spy sees Notes of bad agents*) |
60 goal thy "Notes A X : set evs --> A: bad --> X : spies evs"; |
60 Goal "Notes A X : set evs --> A: bad --> X : spies evs"; |
61 by (induct_tac "evs" 1); |
61 by (induct_tac "evs" 1); |
62 by (ALLGOALS (asm_simp_tac (simpset() addsplits [expand_event_case]))); |
62 by (ALLGOALS (asm_simp_tac (simpset() addsplits [expand_event_case]))); |
63 qed_spec_mp "Notes_imp_spies"; |
63 qed_spec_mp "Notes_imp_spies"; |
64 |
64 |
65 (*Use with addSEs to derive contradictions from old Says events containing |
65 (*Use with addSEs to derive contradictions from old Says events containing |
72 Delsimps [spies_Cons]; |
72 Delsimps [spies_Cons]; |
73 |
73 |
74 |
74 |
75 (*** Fresh nonces ***) |
75 (*** Fresh nonces ***) |
76 |
76 |
77 goal thy "parts (spies evs) <= used evs"; |
77 Goal "parts (spies evs) <= used evs"; |
78 by (induct_tac "evs" 1); |
78 by (induct_tac "evs" 1); |
79 by (ALLGOALS (asm_simp_tac |
79 by (ALLGOALS (asm_simp_tac |
80 (simpset() addsimps [parts_insert_spies] |
80 (simpset() addsimps [parts_insert_spies] |
81 addsplits [expand_event_case]))); |
81 addsplits [expand_event_case]))); |
82 by (ALLGOALS Blast_tac); |
82 by (ALLGOALS Blast_tac); |
83 qed "parts_spies_subset_used"; |
83 qed "parts_spies_subset_used"; |
84 |
84 |
85 bind_thm ("usedI", impOfSubs parts_spies_subset_used); |
85 bind_thm ("usedI", impOfSubs parts_spies_subset_used); |
86 AddIs [usedI]; |
86 AddIs [usedI]; |
87 |
87 |
88 goal thy "parts (initState B) <= used evs"; |
88 Goal "parts (initState B) <= used evs"; |
89 by (induct_tac "evs" 1); |
89 by (induct_tac "evs" 1); |
90 by (ALLGOALS (asm_simp_tac |
90 by (ALLGOALS (asm_simp_tac |
91 (simpset() addsimps [parts_insert_spies] |
91 (simpset() addsimps [parts_insert_spies] |
92 addsplits [expand_event_case]))); |
92 addsplits [expand_event_case]))); |
93 by (ALLGOALS Blast_tac); |
93 by (ALLGOALS Blast_tac); |
94 bind_thm ("initState_into_used", impOfSubs (result())); |
94 bind_thm ("initState_into_used", impOfSubs (result())); |
95 |
95 |
96 goal thy "used (Says A B X # evs) = parts{X} Un used evs"; |
96 Goal "used (Says A B X # evs) = parts{X} Un used evs"; |
97 by (Simp_tac 1); |
97 by (Simp_tac 1); |
98 qed "used_Says"; |
98 qed "used_Says"; |
99 Addsimps [used_Says]; |
99 Addsimps [used_Says]; |
100 |
100 |
101 goal thy "used (Notes A X # evs) = parts{X} Un used evs"; |
101 Goal "used (Notes A X # evs) = parts{X} Un used evs"; |
102 by (Simp_tac 1); |
102 by (Simp_tac 1); |
103 qed "used_Notes"; |
103 qed "used_Notes"; |
104 Addsimps [used_Notes]; |
104 Addsimps [used_Notes]; |
105 |
105 |
106 goal thy "used [] <= used evs"; |
106 Goal "used [] <= used evs"; |
107 by (Simp_tac 1); |
107 by (Simp_tac 1); |
108 by (blast_tac (claset() addIs [initState_into_used]) 1); |
108 by (blast_tac (claset() addIs [initState_into_used]) 1); |
109 qed "used_nil_subset"; |
109 qed "used_nil_subset"; |
110 |
110 |
111 (**** NOTE REMOVAL--laws above are cleaner, as they don't involve "case" ****) |
111 (**** NOTE REMOVAL--laws above are cleaner, as they don't involve "case" ****) |
112 Delsimps [used_Nil, used_Cons]; |
112 Delsimps [used_Nil, used_Cons]; |
113 |
113 |
114 |
114 |
115 (*currently unused*) |
115 (*currently unused*) |
116 goal thy "used evs <= used (evs@evs')"; |
116 Goal "used evs <= used (evs@evs')"; |
117 by (induct_tac "evs" 1); |
117 by (induct_tac "evs" 1); |
118 by (simp_tac (simpset() addsimps [used_nil_subset]) 1); |
118 by (simp_tac (simpset() addsimps [used_nil_subset]) 1); |
119 by (induct_tac "a" 1); |
119 by (induct_tac "a" 1); |
120 by (ALLGOALS Asm_simp_tac); |
120 by (ALLGOALS Asm_simp_tac); |
121 by (ALLGOALS Blast_tac); |
121 by (ALLGOALS Blast_tac); |