src/HOL/Auth/Guard/Analz.thy
author paulson
Wed, 21 Aug 2002 15:53:30 +0200
changeset 13508 890d736b93a5
child 16417 9bc16273c2d4
permissions -rw-r--r--
Frederic Blanqui's new "guard" examples
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
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
    14
theory Analz = Extensions:
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 Key_analz_kparts_insert: "Key K:analz (kparts {Z} Un H)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   241
==> Key K:analz (insert Z H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   242
apply (subgoal_tac "Key K:analz ({Z} Un H)", simp)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   243
by (rule_tac in_analz_subset_cong, auto dest: analz_kparts_analz)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   244
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   245
lemma Nonce_kparts_synth [rule_format]: "Y:synth (analz G)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   246
==> Nonce n:kparts {Y} --> Nonce n:analz G"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   247
by (erule synth.induct, auto)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   248
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   249
lemma kparts_insert_synth: "[| Y:parts (insert X G); X:synth (analz G);
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   250
Nonce n:kparts {Y}; Nonce n ~:analz G |] ==> Y:parts G"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   251
apply (drule parts_insert_substD, clarify)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   252
apply (drule in_sub, drule_tac X=Y in parts_sub, simp)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   253
by (auto dest: Nonce_kparts_synth)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   254
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   255
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
   256
Nonce n:kparts {Y}; Nonce n ~:analz G |] ==> Crypt K Y:parts G"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   257
apply (drule parts_insert_substD, clarify)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   258
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
   259
apply (ind_cases "Crypt K Y:synth (analz G)")
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   260
by (auto dest: Nonce_kparts_synth)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   261
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   262
subsection{*analz is pparts + analz of kparts*}
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   263
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   264
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
   265
apply (erule analz.induct)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   266
apply (rule_tac X=X in is_MPairE, blast, blast)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   267
apply (erule disjE, rule_tac X=X in is_MPairE, blast, blast, blast)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   268
by (erule disjE, rule_tac X=Y in is_MPairE, blast+)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   269
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   270
lemma analz_pparts_kparts_eq: "analz H = pparts H Un analz (kparts H)"
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   271
by (rule eq, auto dest: analz_pparts_kparts pparts_analz analz_kparts_analz)
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   272
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   273
lemmas analz_pparts_kparts_substI = analz_pparts_kparts_eq [THEN ssubst]
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   274
lemmas analz_pparts_kparts_substD
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   275
= analz_pparts_kparts_eq [THEN sym, THEN ssubst]
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   276
890d736b93a5 Frederic Blanqui's new "guard" examples
paulson
parents:
diff changeset
   277
end