src/HOL/Auth/Guard/Analz.thy
author paulson
Tue, 28 Mar 2006 16:48:18 +0200
changeset 19334 96ca738055a6
parent 17689 a04b5b43625e
child 23746 a455e69c31cc
permissions -rw-r--r--
Simplified version of Jia's filter. Now all constants are pooled, rather than relevance being compared against separate clauses. Rejects are no longer noted, and units cannot be added at the end.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13508
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
     1
(******************************************************************************
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
     2
date: december 2001
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
     3
author: Frederic Blanqui
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
     4
email: blanqui@lri.fr
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
     5
webpage: http://www.lri.fr/~blanqui/
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
     6
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
     7
University of Cambridge, Computer Laboratory
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
     8
William Gates Building, JJ Thomson Avenue
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
     9
Cambridge CB3 0FD, United Kingdom
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    10
******************************************************************************)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    11
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    12
header{*Decomposition of Analz into two parts*}
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    13
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 13508
diff changeset
    14
theory Analz imports Extensions begin
13508
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    15
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    16
text{*decomposition of @{term analz} into two parts: 
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    17
      @{term pparts} (for pairs) and analz of @{term kparts}*}
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    18
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    19
subsection{*messages that do not contribute to analz*}
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    20
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    21
consts pparts :: "msg set => msg set"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    22
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    23
inductive "pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    24
intros
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    25
Inj [intro]: "[| X:H; is_MPair X |] ==> X:pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    26
Fst [dest]: "[| {|X,Y|}:pparts H; is_MPair X |] ==> X:pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    27
Snd [dest]: "[| {|X,Y|}:pparts H; is_MPair Y |] ==> Y:pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    28
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    29
subsection{*basic facts about @{term pparts}*}
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    30
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    31
lemma pparts_is_MPair [dest]: "X:pparts H ==> is_MPair X"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    32
by (erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    33
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    34
lemma Crypt_notin_pparts [iff]: "Crypt K X ~:pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    35
by auto
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    36
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    37
lemma Key_notin_pparts [iff]: "Key K ~:pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    38
by auto
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    39
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    40
lemma Nonce_notin_pparts [iff]: "Nonce n ~:pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    41
by auto
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    42
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    43
lemma Number_notin_pparts [iff]: "Number n ~:pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    44
by auto
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    45
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    46
lemma Agent_notin_pparts [iff]: "Agent A ~:pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    47
by auto
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    48
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    49
lemma pparts_empty [iff]: "pparts {} = {}"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    50
by (auto, erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    51
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    52
lemma pparts_insertI [intro]: "X:pparts H ==> X:pparts (insert Y H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    53
by (erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    54
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    55
lemma pparts_sub: "[| X:pparts G; G<=H |] ==> X:pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    56
by (erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    57
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    58
lemma pparts_insert2 [iff]: "pparts (insert X (insert Y H))
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    59
= pparts {X} Un pparts {Y} Un pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    60
by (rule eq, (erule pparts.induct, auto)+)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    61
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    62
lemma pparts_insert_MPair [iff]: "pparts (insert {|X,Y|} H)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    63
= insert {|X,Y|} (pparts ({X,Y} Un H))"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    64
apply (rule eq, (erule pparts.induct, auto)+)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    65
apply (rule_tac Y=Y in pparts.Fst, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    66
apply (erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    67
by (rule_tac X=X in pparts.Snd, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    68
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    69
lemma pparts_insert_Nonce [iff]: "pparts (insert (Nonce n) H) = pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    70
by (rule eq, erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    71
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    72
lemma pparts_insert_Crypt [iff]: "pparts (insert (Crypt K X) H) = pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    73
by (rule eq, erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    74
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    75
lemma pparts_insert_Key [iff]: "pparts (insert (Key K) H) = pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    76
by (rule eq, erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    77
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    78
lemma pparts_insert_Agent [iff]: "pparts (insert (Agent A) H) = pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    79
by (rule eq, erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    80
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    81
lemma pparts_insert_Number [iff]: "pparts (insert (Number n) H) = pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    82
by (rule eq, erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    83
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    84
lemma pparts_insert_Hash [iff]: "pparts (insert (Hash X) H) = pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    85
by (rule eq, erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    86
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    87
lemma pparts_insert: "X:pparts (insert Y H) ==> X:pparts {Y} Un pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    88
by (erule pparts.induct, blast+)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    89
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    90
lemma insert_pparts: "X:pparts {Y} Un pparts H ==> X:pparts (insert Y H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    91
by (safe, erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    92
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    93
lemma pparts_Un [iff]: "pparts (G Un H) = pparts G Un pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    94
by (rule eq, erule pparts.induct, auto dest: pparts_sub)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    95
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    96
lemma pparts_pparts [iff]: "pparts (pparts H) = pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    97
by (rule eq, erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    98
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    99
lemma pparts_insert_eq: "pparts (insert X H) = pparts {X} Un pparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   100
by (rule_tac A=H in insert_Un, rule pparts_Un)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   101
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   102
lemmas pparts_insert_substI = pparts_insert_eq [THEN ssubst]
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   103
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   104
lemma in_pparts: "Y:pparts H ==> EX X. X:H & Y:pparts {X}"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   105
by (erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   106
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   107
subsection{*facts about @{term pparts} and @{term parts}*}
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   108
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   109
lemma pparts_no_Nonce [dest]: "[| X:pparts {Y}; Nonce n ~:parts {Y} |]
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   110
==> Nonce n ~:parts {X}"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   111
by (erule pparts.induct, simp_all)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   112
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   113
subsection{*facts about @{term pparts} and @{term analz}*}
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   114
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   115
lemma pparts_analz: "X:pparts H ==> X:analz H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   116
by (erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   117
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   118
lemma pparts_analz_sub: "[| X:pparts G; G<=H |] ==> X:analz H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   119
by (auto dest: pparts_sub pparts_analz)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   120
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   121
subsection{*messages that contribute to analz*}
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   122
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   123
consts kparts :: "msg set => msg set"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   124
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   125
inductive "kparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   126
intros
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   127
Inj [intro]: "[| X:H; not_MPair X |] ==> X:kparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   128
Fst [intro]: "[| {|X,Y|}:pparts H; not_MPair X |] ==> X:kparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   129
Snd [intro]: "[| {|X,Y|}:pparts H; not_MPair Y |] ==> Y:kparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   130
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   131
subsection{*basic facts about @{term kparts}*}
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   132
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   133
lemma kparts_not_MPair [dest]: "X:kparts H ==> not_MPair X"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   134
by (erule kparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   135
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   136
lemma kparts_empty [iff]: "kparts {} = {}"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   137
by (rule eq, erule kparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   138
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   139
lemma kparts_insertI [intro]: "X:kparts H ==> X:kparts (insert Y H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   140
by (erule kparts.induct, auto dest: pparts_insertI)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   141
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   142
lemma kparts_insert2 [iff]: "kparts (insert X (insert Y H))
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   143
= kparts {X} Un kparts {Y} Un kparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   144
by (rule eq, (erule kparts.induct, auto)+)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   145
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   146
lemma kparts_insert_MPair [iff]: "kparts (insert {|X,Y|} H)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   147
= kparts ({X,Y} Un H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   148
by (rule eq, (erule kparts.induct, auto)+)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   149
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   150
lemma kparts_insert_Nonce [iff]: "kparts (insert (Nonce n) H)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   151
= insert (Nonce n) (kparts H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   152
by (rule eq, erule kparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   153
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   154
lemma kparts_insert_Crypt [iff]: "kparts (insert (Crypt K X) H)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   155
= insert (Crypt K X) (kparts H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   156
by (rule eq, erule kparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   157
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   158
lemma kparts_insert_Key [iff]: "kparts (insert (Key K) H)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   159
= insert (Key K) (kparts H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   160
by (rule eq, erule kparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   161
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   162
lemma kparts_insert_Agent [iff]: "kparts (insert (Agent A) H)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   163
= insert (Agent A) (kparts H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   164
by (rule eq, erule kparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   165
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   166
lemma kparts_insert_Number [iff]: "kparts (insert (Number n) H)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   167
= insert (Number n) (kparts H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   168
by (rule eq, erule kparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   169
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   170
lemma kparts_insert_Hash [iff]: "kparts (insert (Hash X) H)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   171
= insert (Hash X) (kparts H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   172
by (rule eq, erule kparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   173
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   174
lemma kparts_insert: "X:kparts (insert X H) ==> X:kparts {X} Un kparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   175
by (erule kparts.induct, (blast dest: pparts_insert)+)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   176
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   177
lemma kparts_insert_fst [rule_format,dest]: "X:kparts (insert Z H) ==>
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   178
X ~:kparts H --> X:kparts {Z}"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   179
by (erule kparts.induct, (blast dest: pparts_insert)+)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   180
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   181
lemma kparts_sub: "[| X:kparts G; G<=H |] ==> X:kparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   182
by (erule kparts.induct, auto dest: pparts_sub)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   183
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   184
lemma kparts_Un [iff]: "kparts (G Un H) = kparts G Un kparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   185
by (rule eq, erule kparts.induct, auto dest: kparts_sub)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   186
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   187
lemma pparts_kparts [iff]: "pparts (kparts H) = {}"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   188
by (rule eq, erule pparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   189
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   190
lemma kparts_kparts [iff]: "kparts (kparts H) = kparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   191
by (rule eq, erule kparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   192
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   193
lemma kparts_insert_eq: "kparts (insert X H) = kparts {X} Un kparts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   194
by (rule_tac A=H in insert_Un, rule kparts_Un)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   195
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   196
lemmas kparts_insert_substI = kparts_insert_eq [THEN ssubst]
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   197
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   198
lemma in_kparts: "Y:kparts H ==> EX X. X:H & Y:kparts {X}"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   199
by (erule kparts.induct, auto dest: in_pparts)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   200
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   201
lemma kparts_has_no_pair [iff]: "has_no_pair (kparts H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   202
by auto
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   203
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   204
subsection{*facts about @{term kparts} and @{term parts}*}
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   205
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   206
lemma kparts_no_Nonce [dest]: "[| X:kparts {Y}; Nonce n ~:parts {Y} |]
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   207
==> Nonce n ~:parts {X}"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   208
by (erule kparts.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   209
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   210
lemma kparts_parts: "X:kparts H ==> X:parts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   211
by (erule kparts.induct, auto dest: pparts_analz)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   212
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   213
lemma parts_kparts: "X:parts (kparts H) ==> X:parts H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   214
by (erule parts.induct, auto dest: kparts_parts
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   215
intro: parts.Fst parts.Snd parts.Body)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   216
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   217
lemma Crypt_kparts_Nonce_parts [dest]: "[| Crypt K Y:kparts {Z};
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   218
Nonce n:parts {Y} |] ==> Nonce n:parts {Z}"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   219
by auto
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   220
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   221
subsection{*facts about @{term kparts} and @{term analz}*}
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   222
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   223
lemma kparts_analz: "X:kparts H ==> X:analz H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   224
by (erule kparts.induct, auto dest: pparts_analz)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   225
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   226
lemma kparts_analz_sub: "[| X:kparts G; G<=H |] ==> X:analz H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   227
by (erule kparts.induct, auto dest: pparts_analz_sub)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   228
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   229
lemma analz_kparts [rule_format,dest]: "X:analz H ==>
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   230
Y:kparts {X} --> Y:analz H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   231
by (erule analz.induct, auto dest: kparts_analz_sub)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   232
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   233
lemma analz_kparts_analz: "X:analz (kparts H) ==> X:analz H"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   234
by (erule analz.induct, auto dest: kparts_analz)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   235
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   236
lemma analz_kparts_insert: "X:analz (kparts (insert Z H)) ==>
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   237
X:analz (kparts {Z} Un kparts H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   238
by (rule analz_sub, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   239
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   240
lemma Nonce_kparts_synth [rule_format]: "Y:synth (analz G)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   241
==> Nonce n:kparts {Y} --> Nonce n:analz G"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   242
by (erule synth.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   243
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   244
lemma kparts_insert_synth: "[| Y:parts (insert X G); X:synth (analz G);
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   245
Nonce n:kparts {Y}; Nonce n ~:analz G |] ==> Y:parts G"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   246
apply (drule parts_insert_substD, clarify)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   247
apply (drule in_sub, drule_tac X=Y in parts_sub, simp)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   248
by (auto dest: Nonce_kparts_synth)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   249
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   250
lemma Crypt_insert_synth: "[| Crypt K Y:parts (insert X G); X:synth (analz G);
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   251
Nonce n:kparts {Y}; Nonce n ~:analz G |] ==> Crypt K Y:parts G"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   252
apply (drule parts_insert_substD, clarify)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   253
apply (drule in_sub, drule_tac X="Crypt K Y" in parts_sub, simp, clarsimp)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   254
apply (ind_cases "Crypt K Y:synth (analz G)")
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   255
by (auto dest: Nonce_kparts_synth)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   256
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   257
subsection{*analz is pparts + analz of kparts*}
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   258
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   259
lemma analz_pparts_kparts: "X:analz H ==> X:pparts H | X:analz (kparts H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   260
apply (erule analz.induct)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   261
apply (rule_tac X=X in is_MPairE, blast, blast)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   262
apply (erule disjE, rule_tac X=X in is_MPairE, blast, blast, blast)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   263
by (erule disjE, rule_tac X=Y in is_MPairE, blast+)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   264
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   265
lemma analz_pparts_kparts_eq: "analz H = pparts H Un analz (kparts H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   266
by (rule eq, auto dest: analz_pparts_kparts pparts_analz analz_kparts_analz)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   267
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   268
lemmas analz_pparts_kparts_substI = analz_pparts_kparts_eq [THEN ssubst]
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   269
lemmas analz_pparts_kparts_substD
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   270
= analz_pparts_kparts_eq [THEN sym, THEN ssubst]
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   271
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   272
end