src/HOL/Auth/Guard/Analz.thy
changeset 61830 4f5ab843cf5b
parent 58889 5b7a9633cfa8
child 61956 38b73f7940af
equal deleted inserted replaced
61829:55c85d25e18c 61830:4f5ab843cf5b
     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)"