1 (* Title: HOL/Auth/Guard/Analz.thy |
1 (* Title: HOL/Auth/Guard/Analz.thy |
2 Author: Frederic Blanqui, University of Cambridge Computer Laboratory |
2 Author: Frederic Blanqui, University of Cambridge Computer Laboratory |
3 Copyright 2001 University of Cambridge |
3 Copyright 2001 University of Cambridge |
4 *) |
4 *) |
5 |
5 |
6 section{*Decomposition of Analz into two parts*} |
6 section\<open>Decomposition of Analz into two parts\<close> |
7 |
7 |
8 theory Analz imports Extensions begin |
8 theory Analz imports Extensions begin |
9 |
9 |
10 text{*decomposition of @{term analz} into two parts: |
10 text\<open>decomposition of @{term analz} into two parts: |
11 @{term pparts} (for pairs) and analz of @{term kparts}*} |
11 @{term pparts} (for pairs) and analz of @{term kparts}\<close> |
12 |
12 |
13 subsection{*messages that do not contribute to analz*} |
13 subsection\<open>messages that do not contribute to analz\<close> |
14 |
14 |
15 inductive_set |
15 inductive_set |
16 pparts :: "msg set => msg set" |
16 pparts :: "msg set => msg set" |
17 for H :: "msg set" |
17 for H :: "msg set" |
18 where |
18 where |
19 Inj [intro]: "[| X:H; is_MPair X |] ==> X:pparts H" |
19 Inj [intro]: "[| X:H; is_MPair X |] ==> X:pparts H" |
20 | Fst [dest]: "[| {|X,Y|}:pparts H; is_MPair X |] ==> X:pparts H" |
20 | Fst [dest]: "[| {|X,Y|}:pparts H; is_MPair X |] ==> X:pparts H" |
21 | Snd [dest]: "[| {|X,Y|}:pparts H; is_MPair Y |] ==> Y:pparts H" |
21 | Snd [dest]: "[| {|X,Y|}:pparts H; is_MPair Y |] ==> Y:pparts H" |
22 |
22 |
23 subsection{*basic facts about @{term pparts}*} |
23 subsection\<open>basic facts about @{term pparts}\<close> |
24 |
24 |
25 lemma pparts_is_MPair [dest]: "X:pparts H ==> is_MPair X" |
25 lemma pparts_is_MPair [dest]: "X:pparts H ==> is_MPair X" |
26 by (erule pparts.induct, auto) |
26 by (erule pparts.induct, auto) |
27 |
27 |
28 lemma Crypt_notin_pparts [iff]: "Crypt K X ~:pparts H" |
28 lemma Crypt_notin_pparts [iff]: "Crypt K X ~:pparts H" |
96 lemmas pparts_insert_substI = pparts_insert_eq [THEN ssubst] |
96 lemmas pparts_insert_substI = pparts_insert_eq [THEN ssubst] |
97 |
97 |
98 lemma in_pparts: "Y:pparts H ==> EX X. X:H & Y:pparts {X}" |
98 lemma in_pparts: "Y:pparts H ==> EX X. X:H & Y:pparts {X}" |
99 by (erule pparts.induct, auto) |
99 by (erule pparts.induct, auto) |
100 |
100 |
101 subsection{*facts about @{term pparts} and @{term parts}*} |
101 subsection\<open>facts about @{term pparts} and @{term parts}\<close> |
102 |
102 |
103 lemma pparts_no_Nonce [dest]: "[| X:pparts {Y}; Nonce n ~:parts {Y} |] |
103 lemma pparts_no_Nonce [dest]: "[| X:pparts {Y}; Nonce n ~:parts {Y} |] |
104 ==> Nonce n ~:parts {X}" |
104 ==> Nonce n ~:parts {X}" |
105 by (erule pparts.induct, simp_all) |
105 by (erule pparts.induct, simp_all) |
106 |
106 |
107 subsection{*facts about @{term pparts} and @{term analz}*} |
107 subsection\<open>facts about @{term pparts} and @{term analz}\<close> |
108 |
108 |
109 lemma pparts_analz: "X:pparts H ==> X:analz H" |
109 lemma pparts_analz: "X:pparts H ==> X:analz H" |
110 by (erule pparts.induct, auto) |
110 by (erule pparts.induct, auto) |
111 |
111 |
112 lemma pparts_analz_sub: "[| X:pparts G; G<=H |] ==> X:analz H" |
112 lemma pparts_analz_sub: "[| X:pparts G; G<=H |] ==> X:analz H" |
113 by (auto dest: pparts_sub pparts_analz) |
113 by (auto dest: pparts_sub pparts_analz) |
114 |
114 |
115 subsection{*messages that contribute to analz*} |
115 subsection\<open>messages that contribute to analz\<close> |
116 |
116 |
117 inductive_set |
117 inductive_set |
118 kparts :: "msg set => msg set" |
118 kparts :: "msg set => msg set" |
119 for H :: "msg set" |
119 for H :: "msg set" |
120 where |
120 where |
121 Inj [intro]: "[| X:H; not_MPair X |] ==> X:kparts H" |
121 Inj [intro]: "[| X:H; not_MPair X |] ==> X:kparts H" |
122 | Fst [intro]: "[| {|X,Y|}:pparts H; not_MPair X |] ==> X:kparts H" |
122 | Fst [intro]: "[| {|X,Y|}:pparts H; not_MPair X |] ==> X:kparts H" |
123 | Snd [intro]: "[| {|X,Y|}:pparts H; not_MPair Y |] ==> Y:kparts H" |
123 | Snd [intro]: "[| {|X,Y|}:pparts H; not_MPair Y |] ==> Y:kparts H" |
124 |
124 |
125 subsection{*basic facts about @{term kparts}*} |
125 subsection\<open>basic facts about @{term kparts}\<close> |
126 |
126 |
127 lemma kparts_not_MPair [dest]: "X:kparts H ==> not_MPair X" |
127 lemma kparts_not_MPair [dest]: "X:kparts H ==> not_MPair X" |
128 by (erule kparts.induct, auto) |
128 by (erule kparts.induct, auto) |
129 |
129 |
130 lemma kparts_empty [iff]: "kparts {} = {}" |
130 lemma kparts_empty [iff]: "kparts {} = {}" |
193 by (erule kparts.induct, auto dest: in_pparts) |
193 by (erule kparts.induct, auto dest: in_pparts) |
194 |
194 |
195 lemma kparts_has_no_pair [iff]: "has_no_pair (kparts H)" |
195 lemma kparts_has_no_pair [iff]: "has_no_pair (kparts H)" |
196 by auto |
196 by auto |
197 |
197 |
198 subsection{*facts about @{term kparts} and @{term parts}*} |
198 subsection\<open>facts about @{term kparts} and @{term parts}\<close> |
199 |
199 |
200 lemma kparts_no_Nonce [dest]: "[| X:kparts {Y}; Nonce n ~:parts {Y} |] |
200 lemma kparts_no_Nonce [dest]: "[| X:kparts {Y}; Nonce n ~:parts {Y} |] |
201 ==> Nonce n ~:parts {X}" |
201 ==> Nonce n ~:parts {X}" |
202 by (erule kparts.induct, auto) |
202 by (erule kparts.induct, auto) |
203 |
203 |
210 |
210 |
211 lemma Crypt_kparts_Nonce_parts [dest]: "[| Crypt K Y:kparts {Z}; |
211 lemma Crypt_kparts_Nonce_parts [dest]: "[| Crypt K Y:kparts {Z}; |
212 Nonce n:parts {Y} |] ==> Nonce n:parts {Z}" |
212 Nonce n:parts {Y} |] ==> Nonce n:parts {Z}" |
213 by auto |
213 by auto |
214 |
214 |
215 subsection{*facts about @{term kparts} and @{term analz}*} |
215 subsection\<open>facts about @{term kparts} and @{term analz}\<close> |
216 |
216 |
217 lemma kparts_analz: "X:kparts H ==> X:analz H" |
217 lemma kparts_analz: "X:kparts H ==> X:analz H" |
218 by (erule kparts.induct, auto dest: pparts_analz) |
218 by (erule kparts.induct, auto dest: pparts_analz) |
219 |
219 |
220 lemma kparts_analz_sub: "[| X:kparts G; G<=H |] ==> X:analz H" |
220 lemma kparts_analz_sub: "[| X:kparts G; G<=H |] ==> X:analz H" |
245 "[| Crypt K Y:parts (insert X G); X:synth (analz G); Nonce n:kparts {Y}; Nonce n ~:analz G |] |
245 "[| Crypt K Y:parts (insert X G); X:synth (analz G); Nonce n:kparts {Y}; Nonce n ~:analz G |] |
246 ==> Crypt K Y:parts G" |
246 ==> Crypt K Y:parts G" |
247 by (metis Fake_parts_insert_in_Un Nonce_kparts_synth UnE analz_conj_parts synth_simps(5)) |
247 by (metis Fake_parts_insert_in_Un Nonce_kparts_synth UnE analz_conj_parts synth_simps(5)) |
248 |
248 |
249 |
249 |
250 subsection{*analz is pparts + analz of kparts*} |
250 subsection\<open>analz is pparts + analz of kparts\<close> |
251 |
251 |
252 lemma analz_pparts_kparts: "X:analz H ==> X:pparts H | X:analz (kparts H)" |
252 lemma analz_pparts_kparts: "X:analz H ==> X:pparts H | X:analz (kparts H)" |
253 by (erule analz.induct, auto) |
253 by (erule analz.induct, auto) |
254 |
254 |
255 lemma analz_pparts_kparts_eq: "analz H = pparts H Un analz (kparts H)" |
255 lemma analz_pparts_kparts_eq: "analz H = pparts H Un analz (kparts H)" |