src/HOL/Induct/QuoDataType.thy
author haftmann
Fri, 01 Dec 2006 17:22:28 +0100
changeset 21619 dea0914773f7
parent 21404 eb85850d3eb7
child 23746 a455e69c31cc
permissions -rw-r--r--
stripped some legacy bindings
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
     1
(*  Title:      HOL/Induct/QuoDataType
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
     2
    ID:         $Id$
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
     4
    Copyright   2004  University of Cambridge
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
     5
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
     6
*)
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
     7
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
     8
header{*Defining an Initial Algebra by Quotienting a Free Algebra*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
     9
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 15172
diff changeset
    10
theory QuoDataType imports Main begin
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    11
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    12
subsection{*Defining the Free Algebra*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    13
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    14
text{*Messages with encryption and decryption as free constructors.*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    15
datatype
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    16
     freemsg = NONCE  nat
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    17
	     | MPAIR  freemsg freemsg
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    18
	     | CRYPT  nat freemsg  
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    19
	     | DECRYPT  nat freemsg
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    20
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    21
text{*The equivalence relation, which makes encryption and decryption inverses
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    22
provided the keys are the same.*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    23
consts  msgrel :: "(freemsg * freemsg) set"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    24
19736
wenzelm
parents: 18460
diff changeset
    25
abbreviation
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    26
  msg_rel :: "[freemsg, freemsg] => bool"  (infixl "~~" 50) where
19736
wenzelm
parents: 18460
diff changeset
    27
  "X ~~ Y == (X,Y) \<in> msgrel"
wenzelm
parents: 18460
diff changeset
    28
21210
c17fd2df4e9e renamed 'const_syntax' to 'notation';
wenzelm
parents: 19736
diff changeset
    29
notation (xsymbols)
19736
wenzelm
parents: 18460
diff changeset
    30
  msg_rel  (infixl "\<sim>" 50)
21210
c17fd2df4e9e renamed 'const_syntax' to 'notation';
wenzelm
parents: 19736
diff changeset
    31
notation (HTML output)
19736
wenzelm
parents: 18460
diff changeset
    32
  msg_rel  (infixl "\<sim>" 50)
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    33
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    34
text{*The first two rules are the desired equations. The next four rules
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    35
make the equations applicable to subterms. The last two rules are symmetry
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    36
and transitivity.*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    37
inductive "msgrel"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    38
  intros 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    39
    CD:    "CRYPT K (DECRYPT K X) \<sim> X"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    40
    DC:    "DECRYPT K (CRYPT K X) \<sim> X"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    41
    NONCE: "NONCE N \<sim> NONCE N"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    42
    MPAIR: "\<lbrakk>X \<sim> X'; Y \<sim> Y'\<rbrakk> \<Longrightarrow> MPAIR X Y \<sim> MPAIR X' Y'"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    43
    CRYPT: "X \<sim> X' \<Longrightarrow> CRYPT K X \<sim> CRYPT K X'"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    44
    DECRYPT: "X \<sim> X' \<Longrightarrow> DECRYPT K X \<sim> DECRYPT K X'"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    45
    SYM:   "X \<sim> Y \<Longrightarrow> Y \<sim> X"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    46
    TRANS: "\<lbrakk>X \<sim> Y; Y \<sim> Z\<rbrakk> \<Longrightarrow> X \<sim> Z"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    47
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    48
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    49
text{*Proving that it is an equivalence relation*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    50
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    51
lemma msgrel_refl: "X \<sim> X"
18460
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
    52
  by (induct X) (blast intro: msgrel.intros)+
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    53
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    54
theorem equiv_msgrel: "equiv UNIV msgrel"
18460
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
    55
proof -
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
    56
  have "reflexive msgrel" by (simp add: refl_def msgrel_refl)
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
    57
  moreover have "sym msgrel" by (simp add: sym_def, blast intro: msgrel.SYM)
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
    58
  moreover have "trans msgrel" by (simp add: trans_def, blast intro: msgrel.TRANS)
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
    59
  ultimately show ?thesis by (simp add: equiv_def)
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    60
qed
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    61
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    62
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    63
subsection{*Some Functions on the Free Algebra*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    64
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    65
subsubsection{*The Set of Nonces*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    66
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    67
text{*A function to return the set of nonces present in a message.  It will
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    68
be lifted to the initial algrebra, to serve as an example of that process.*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    69
consts
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    70
  freenonces :: "freemsg \<Rightarrow> nat set"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    71
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    72
primrec
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    73
   "freenonces (NONCE N) = {N}"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    74
   "freenonces (MPAIR X Y) = freenonces X \<union> freenonces Y"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    75
   "freenonces (CRYPT K X) = freenonces X"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    76
   "freenonces (DECRYPT K X) = freenonces X"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    77
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    78
text{*This theorem lets us prove that the nonces function respects the
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    79
equivalence relation.  It also helps us prove that Nonce
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    80
  (the abstract constructor) is injective*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    81
theorem msgrel_imp_eq_freenonces: "U \<sim> V \<Longrightarrow> freenonces U = freenonces V"
18460
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
    82
  by (induct set: msgrel) auto
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    83
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    84
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    85
subsubsection{*The Left Projection*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    86
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    87
text{*A function to return the left part of the top pair in a message.  It will
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    88
be lifted to the initial algrebra, to serve as an example of that process.*}
14658
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
    89
consts freeleft :: "freemsg \<Rightarrow> freemsg"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    90
primrec
14658
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
    91
   "freeleft (NONCE N) = NONCE N"
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
    92
   "freeleft (MPAIR X Y) = X"
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
    93
   "freeleft (CRYPT K X) = freeleft X"
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
    94
   "freeleft (DECRYPT K X) = freeleft X"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    95
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    96
text{*This theorem lets us prove that the left function respects the
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    97
equivalence relation.  It also helps us prove that MPair
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
    98
  (the abstract constructor) is injective*}
14658
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
    99
theorem msgrel_imp_eqv_freeleft:
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
   100
     "U \<sim> V \<Longrightarrow> freeleft U \<sim> freeleft V"
18460
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
   101
  by (induct set: msgrel) (auto intro: msgrel.intros)
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   102
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   103
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   104
subsubsection{*The Right Projection*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   105
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   106
text{*A function to return the right part of the top pair in a message.*}
14658
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
   107
consts freeright :: "freemsg \<Rightarrow> freemsg"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   108
primrec
14658
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
   109
   "freeright (NONCE N) = NONCE N"
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
   110
   "freeright (MPAIR X Y) = Y"
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
   111
   "freeright (CRYPT K X) = freeright X"
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
   112
   "freeright (DECRYPT K X) = freeright X"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   113
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   114
text{*This theorem lets us prove that the right function respects the
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   115
equivalence relation.  It also helps us prove that MPair
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   116
  (the abstract constructor) is injective*}
14658
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
   117
theorem msgrel_imp_eqv_freeright:
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
   118
     "U \<sim> V \<Longrightarrow> freeright U \<sim> freeright V"
18460
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
   119
  by (induct set: msgrel) (auto intro: msgrel.intros)
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   120
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   121
15152
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   122
subsubsection{*The Discriminator for Constructors*}
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   123
15152
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   124
text{*A function to distinguish nonces, mpairs and encryptions*}
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   125
consts freediscrim :: "freemsg \<Rightarrow> int"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   126
primrec
15152
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   127
   "freediscrim (NONCE N) = 0"
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   128
   "freediscrim (MPAIR X Y) = 1"
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   129
   "freediscrim (CRYPT K X) = freediscrim X + 2"
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   130
   "freediscrim (DECRYPT K X) = freediscrim X - 2"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   131
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   132
text{*This theorem helps us prove @{term "Nonce N \<noteq> MPair X Y"}*}
15152
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   133
theorem msgrel_imp_eq_freediscrim:
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   134
     "U \<sim> V \<Longrightarrow> freediscrim U = freediscrim V"
18460
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
   135
  by (induct set: msgrel) auto
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   136
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   137
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   138
subsection{*The Initial Algebra: A Quotiented Message Type*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   139
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   140
typedef (Msg)  msg = "UNIV//msgrel"
18460
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
   141
  by (auto simp add: quotient_def)
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   142
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   143
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   144
text{*The abstract message constructors*}
19736
wenzelm
parents: 18460
diff changeset
   145
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
   146
  Nonce :: "nat \<Rightarrow> msg" where
19736
wenzelm
parents: 18460
diff changeset
   147
  "Nonce N = Abs_Msg(msgrel``{NONCE N})"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   148
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
   149
definition
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
   150
  MPair :: "[msg,msg] \<Rightarrow> msg" where
19736
wenzelm
parents: 18460
diff changeset
   151
   "MPair X Y =
15120
f0359f75682e undid UN/INT syntax
nipkow
parents: 14658
diff changeset
   152
       Abs_Msg (\<Union>U \<in> Rep_Msg X. \<Union>V \<in> Rep_Msg Y. msgrel``{MPAIR U V})"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   153
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
   154
definition
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
   155
  Crypt :: "[nat,msg] \<Rightarrow> msg" where
19736
wenzelm
parents: 18460
diff changeset
   156
   "Crypt K X =
15120
f0359f75682e undid UN/INT syntax
nipkow
parents: 14658
diff changeset
   157
       Abs_Msg (\<Union>U \<in> Rep_Msg X. msgrel``{CRYPT K U})"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   158
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
   159
definition
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
   160
  Decrypt :: "[nat,msg] \<Rightarrow> msg" where
19736
wenzelm
parents: 18460
diff changeset
   161
   "Decrypt K X =
15120
f0359f75682e undid UN/INT syntax
nipkow
parents: 14658
diff changeset
   162
       Abs_Msg (\<Union>U \<in> Rep_Msg X. msgrel``{DECRYPT K U})"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   163
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   164
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   165
text{*Reduces equality of equivalence classes to the @{term msgrel} relation:
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   166
  @{term "(msgrel `` {x} = msgrel `` {y}) = ((x,y) \<in> msgrel)"} *}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   167
lemmas equiv_msgrel_iff = eq_equiv_class_iff [OF equiv_msgrel UNIV_I UNIV_I]
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   168
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   169
declare equiv_msgrel_iff [simp]
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   170
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   171
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   172
text{*All equivalence classes belong to set of representatives*}
15169
2b5da07a0b89 new "respects" syntax for quotienting
paulson
parents: 15152
diff changeset
   173
lemma [simp]: "msgrel``{U} \<in> Msg"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   174
by (auto simp add: Msg_def quotient_def intro: msgrel_refl)
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   175
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   176
lemma inj_on_Abs_Msg: "inj_on Abs_Msg Msg"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   177
apply (rule inj_on_inverseI)
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   178
apply (erule Abs_Msg_inverse)
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   179
done
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   180
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   181
text{*Reduces equality on abstractions to equality on representatives*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   182
declare inj_on_Abs_Msg [THEN inj_on_iff, simp]
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   183
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   184
declare Abs_Msg_inverse [simp]
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   185
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   186
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   187
subsubsection{*Characteristic Equations for the Abstract Constructors*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   188
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   189
lemma MPair: "MPair (Abs_Msg(msgrel``{U})) (Abs_Msg(msgrel``{V})) = 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   190
              Abs_Msg (msgrel``{MPAIR U V})"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   191
proof -
15169
2b5da07a0b89 new "respects" syntax for quotienting
paulson
parents: 15152
diff changeset
   192
  have "(\<lambda>U V. msgrel `` {MPAIR U V}) respects2 msgrel"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   193
    by (simp add: congruent2_def msgrel.MPAIR)
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   194
  thus ?thesis
14658
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
   195
    by (simp add: MPair_def UN_equiv_class2 [OF equiv_msgrel equiv_msgrel])
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   196
qed
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   197
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   198
lemma Crypt: "Crypt K (Abs_Msg(msgrel``{U})) = Abs_Msg (msgrel``{CRYPT K U})"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   199
proof -
15169
2b5da07a0b89 new "respects" syntax for quotienting
paulson
parents: 15152
diff changeset
   200
  have "(\<lambda>U. msgrel `` {CRYPT K U}) respects msgrel"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   201
    by (simp add: congruent_def msgrel.CRYPT)
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   202
  thus ?thesis
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   203
    by (simp add: Crypt_def UN_equiv_class [OF equiv_msgrel])
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   204
qed
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   205
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   206
lemma Decrypt:
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   207
     "Decrypt K (Abs_Msg(msgrel``{U})) = Abs_Msg (msgrel``{DECRYPT K U})"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   208
proof -
15169
2b5da07a0b89 new "respects" syntax for quotienting
paulson
parents: 15152
diff changeset
   209
  have "(\<lambda>U. msgrel `` {DECRYPT K U}) respects msgrel"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   210
    by (simp add: congruent_def msgrel.DECRYPT)
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   211
  thus ?thesis
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   212
    by (simp add: Decrypt_def UN_equiv_class [OF equiv_msgrel])
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   213
qed
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   214
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   215
text{*Case analysis on the representation of a msg as an equivalence class.*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   216
lemma eq_Abs_Msg [case_names Abs_Msg, cases type: msg]:
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   217
     "(!!U. z = Abs_Msg(msgrel``{U}) ==> P) ==> P"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   218
apply (rule Rep_Msg [of z, unfolded Msg_def, THEN quotientE])
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   219
apply (drule arg_cong [where f=Abs_Msg])
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   220
apply (auto simp add: Rep_Msg_inverse intro: msgrel_refl)
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   221
done
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   222
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   223
text{*Establishing these two equations is the point of the whole exercise*}
14533
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   224
theorem CD_eq [simp]: "Crypt K (Decrypt K X) = X"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   225
by (cases X, simp add: Crypt Decrypt CD)
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   226
14533
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   227
theorem DC_eq [simp]: "Decrypt K (Crypt K X) = X"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   228
by (cases X, simp add: Crypt Decrypt DC)
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   229
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   230
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   231
subsection{*The Abstract Function to Return the Set of Nonces*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   232
19736
wenzelm
parents: 18460
diff changeset
   233
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
   234
  nonces :: "msg \<Rightarrow> nat set" where
19736
wenzelm
parents: 18460
diff changeset
   235
   "nonces X = (\<Union>U \<in> Rep_Msg X. freenonces U)"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   236
15169
2b5da07a0b89 new "respects" syntax for quotienting
paulson
parents: 15152
diff changeset
   237
lemma nonces_congruent: "freenonces respects msgrel"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   238
by (simp add: congruent_def msgrel_imp_eq_freenonces) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   239
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   240
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   241
text{*Now prove the four equations for @{term nonces}*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   242
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   243
lemma nonces_Nonce [simp]: "nonces (Nonce N) = {N}"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   244
by (simp add: nonces_def Nonce_def 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   245
              UN_equiv_class [OF equiv_msgrel nonces_congruent]) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   246
 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   247
lemma nonces_MPair [simp]: "nonces (MPair X Y) = nonces X \<union> nonces Y"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   248
apply (cases X, cases Y) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   249
apply (simp add: nonces_def MPair 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   250
                 UN_equiv_class [OF equiv_msgrel nonces_congruent]) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   251
done
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   252
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   253
lemma nonces_Crypt [simp]: "nonces (Crypt K X) = nonces X"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   254
apply (cases X) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   255
apply (simp add: nonces_def Crypt
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   256
                 UN_equiv_class [OF equiv_msgrel nonces_congruent]) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   257
done
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   258
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   259
lemma nonces_Decrypt [simp]: "nonces (Decrypt K X) = nonces X"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   260
apply (cases X) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   261
apply (simp add: nonces_def Decrypt
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   262
                 UN_equiv_class [OF equiv_msgrel nonces_congruent]) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   263
done
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   264
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   265
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   266
subsection{*The Abstract Function to Return the Left Part*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   267
19736
wenzelm
parents: 18460
diff changeset
   268
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
   269
  left :: "msg \<Rightarrow> msg" where
19736
wenzelm
parents: 18460
diff changeset
   270
   "left X = Abs_Msg (\<Union>U \<in> Rep_Msg X. msgrel``{freeleft U})"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   271
15169
2b5da07a0b89 new "respects" syntax for quotienting
paulson
parents: 15152
diff changeset
   272
lemma left_congruent: "(\<lambda>U. msgrel `` {freeleft U}) respects msgrel"
14658
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
   273
by (simp add: congruent_def msgrel_imp_eqv_freeleft) 
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   274
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   275
text{*Now prove the four equations for @{term left}*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   276
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   277
lemma left_Nonce [simp]: "left (Nonce N) = Nonce N"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   278
by (simp add: left_def Nonce_def 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   279
              UN_equiv_class [OF equiv_msgrel left_congruent]) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   280
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   281
lemma left_MPair [simp]: "left (MPair X Y) = X"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   282
apply (cases X, cases Y) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   283
apply (simp add: left_def MPair 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   284
                 UN_equiv_class [OF equiv_msgrel left_congruent]) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   285
done
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   286
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   287
lemma left_Crypt [simp]: "left (Crypt K X) = left X"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   288
apply (cases X) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   289
apply (simp add: left_def Crypt
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   290
                 UN_equiv_class [OF equiv_msgrel left_congruent]) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   291
done
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   292
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   293
lemma left_Decrypt [simp]: "left (Decrypt K X) = left X"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   294
apply (cases X) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   295
apply (simp add: left_def Decrypt
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   296
                 UN_equiv_class [OF equiv_msgrel left_congruent]) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   297
done
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   298
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   299
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   300
subsection{*The Abstract Function to Return the Right Part*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   301
19736
wenzelm
parents: 18460
diff changeset
   302
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
   303
  right :: "msg \<Rightarrow> msg" where
19736
wenzelm
parents: 18460
diff changeset
   304
   "right X = Abs_Msg (\<Union>U \<in> Rep_Msg X. msgrel``{freeright U})"
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   305
15169
2b5da07a0b89 new "respects" syntax for quotienting
paulson
parents: 15152
diff changeset
   306
lemma right_congruent: "(\<lambda>U. msgrel `` {freeright U}) respects msgrel"
14658
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
   307
by (simp add: congruent_def msgrel_imp_eqv_freeright) 
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   308
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   309
text{*Now prove the four equations for @{term right}*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   310
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   311
lemma right_Nonce [simp]: "right (Nonce N) = Nonce N"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   312
by (simp add: right_def Nonce_def 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   313
              UN_equiv_class [OF equiv_msgrel right_congruent]) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   314
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   315
lemma right_MPair [simp]: "right (MPair X Y) = Y"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   316
apply (cases X, cases Y) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   317
apply (simp add: right_def MPair 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   318
                 UN_equiv_class [OF equiv_msgrel right_congruent]) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   319
done
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   320
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   321
lemma right_Crypt [simp]: "right (Crypt K X) = right X"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   322
apply (cases X) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   323
apply (simp add: right_def Crypt
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   324
                 UN_equiv_class [OF equiv_msgrel right_congruent]) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   325
done
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   326
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   327
lemma right_Decrypt [simp]: "right (Decrypt K X) = right X"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   328
apply (cases X) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   329
apply (simp add: right_def Decrypt
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   330
                 UN_equiv_class [OF equiv_msgrel right_congruent]) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   331
done
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   332
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   333
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   334
subsection{*Injectivity Properties of Some Constructors*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   335
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   336
lemma NONCE_imp_eq: "NONCE m \<sim> NONCE n \<Longrightarrow> m = n"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   337
by (drule msgrel_imp_eq_freenonces, simp)
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   338
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   339
text{*Can also be proved using the function @{term nonces}*}
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   340
lemma Nonce_Nonce_eq [iff]: "(Nonce m = Nonce n) = (m = n)"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   341
by (auto simp add: Nonce_def msgrel_refl dest: NONCE_imp_eq)
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   342
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   343
lemma MPAIR_imp_eqv_left: "MPAIR X Y \<sim> MPAIR X' Y' \<Longrightarrow> X \<sim> X'"
14658
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
   344
by (drule msgrel_imp_eqv_freeleft, simp)
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   345
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   346
lemma MPair_imp_eq_left: 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   347
  assumes eq: "MPair X Y = MPair X' Y'" shows "X = X'"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   348
proof -
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   349
  from eq
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   350
  have "left (MPair X Y) = left (MPair X' Y')" by simp
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   351
  thus ?thesis by simp
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   352
qed
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   353
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   354
lemma MPAIR_imp_eqv_right: "MPAIR X Y \<sim> MPAIR X' Y' \<Longrightarrow> Y \<sim> Y'"
14658
b1293d0f8d5f congruent2 now allows different equiv relations
paulson
parents: 14565
diff changeset
   355
by (drule msgrel_imp_eqv_freeright, simp)
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   356
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   357
lemma MPair_imp_eq_right: "MPair X Y = MPair X' Y' \<Longrightarrow> Y = Y'" 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   358
apply (cases X, cases X', cases Y, cases Y') 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   359
apply (simp add: MPair)
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   360
apply (erule MPAIR_imp_eqv_right)  
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   361
done
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   362
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   363
theorem MPair_MPair_eq [iff]: "(MPair X Y = MPair X' Y') = (X=X' & Y=Y')" 
14533
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   364
by (blast dest: MPair_imp_eq_left MPair_imp_eq_right)
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   365
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   366
lemma NONCE_neqv_MPAIR: "NONCE m \<sim> MPAIR X Y \<Longrightarrow> False"
15152
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   367
by (drule msgrel_imp_eq_freediscrim, simp)
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   368
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   369
theorem Nonce_neq_MPair [iff]: "Nonce N \<noteq> MPair X Y"
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   370
apply (cases X, cases Y) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   371
apply (simp add: Nonce_def MPair) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   372
apply (blast dest: NONCE_neqv_MPAIR) 
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   373
done
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   374
15152
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   375
text{*Example suggested by a referee*}
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   376
theorem Crypt_Nonce_neq_Nonce: "Crypt K (Nonce M) \<noteq> Nonce N" 
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   377
by (auto simp add: Nonce_def Crypt dest: msgrel_imp_eq_freediscrim)  
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   378
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   379
text{*...and many similar results*}
15172
73069e033a0b new example of a quotiented nested data type
paulson
parents: 15169
diff changeset
   380
theorem Crypt2_Nonce_neq_Nonce: "Crypt K (Crypt K' (Nonce M)) \<noteq> Nonce N" 
15152
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   381
by (auto simp add: Nonce_def Crypt dest: msgrel_imp_eq_freediscrim)  
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   382
14533
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   383
theorem Crypt_Crypt_eq [iff]: "(Crypt K X = Crypt K X') = (X=X')" 
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   384
proof
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   385
  assume "Crypt K X = Crypt K X'"
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   386
  hence "Decrypt K (Crypt K X) = Decrypt K (Crypt K X')" by simp
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   387
  thus "X = X'" by simp
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   388
next
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   389
  assume "X = X'"
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   390
  thus "Crypt K X = Crypt K X'" by simp
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   391
qed
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   392
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   393
theorem Decrypt_Decrypt_eq [iff]: "(Decrypt K X = Decrypt K X') = (X=X')" 
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   394
proof
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   395
  assume "Decrypt K X = Decrypt K X'"
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   396
  hence "Crypt K (Decrypt K X) = Crypt K (Decrypt K X')" by simp
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   397
  thus "X = X'" by simp
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   398
next
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   399
  assume "X = X'"
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   400
  thus "Decrypt K X = Decrypt K X'" by simp
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   401
qed
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   402
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   403
lemma msg_induct [case_names Nonce MPair Crypt Decrypt, cases type: msg]:
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   404
  assumes N: "\<And>N. P (Nonce N)"
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   405
      and M: "\<And>X Y. \<lbrakk>P X; P Y\<rbrakk> \<Longrightarrow> P (MPair X Y)"
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   406
      and C: "\<And>K X. P X \<Longrightarrow> P (Crypt K X)"
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   407
      and D: "\<And>K X. P X \<Longrightarrow> P (Decrypt K X)"
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   408
  shows "P msg"
18460
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
   409
proof (cases msg)
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
   410
  case (Abs_Msg U)
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
   411
  have "P (Abs_Msg (msgrel `` {U}))"
14533
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   412
  proof (induct U)
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   413
    case (NONCE N) 
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   414
    with N show ?case by (simp add: Nonce_def) 
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   415
  next
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   416
    case (MPAIR X Y)
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   417
    with M [of "Abs_Msg (msgrel `` {X})" "Abs_Msg (msgrel `` {Y})"]
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   418
    show ?case by (simp add: MPair) 
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   419
  next
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   420
    case (CRYPT K X)
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   421
    with C [of "Abs_Msg (msgrel `` {X})"]
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   422
    show ?case by (simp add: Crypt) 
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   423
  next
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   424
    case (DECRYPT K X)
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   425
    with D [of "Abs_Msg (msgrel `` {X})"]
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   426
    show ?case by (simp add: Decrypt)
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   427
  qed
18460
9a1458cb2956 tuned induct proofs;
wenzelm
parents: 16417
diff changeset
   428
  with Abs_Msg show ?thesis by (simp only:)
14533
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   429
qed
32806c0afebf freeness theorems and induction rule
paulson
parents: 14527
diff changeset
   430
15152
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   431
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   432
subsection{*The Abstract Discriminator*}
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   433
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   434
text{*However, as @{text Crypt_Nonce_neq_Nonce} above illustrates, we don't
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   435
need this function in order to prove discrimination theorems.*}
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   436
19736
wenzelm
parents: 18460
diff changeset
   437
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
   438
  discrim :: "msg \<Rightarrow> int" where
19736
wenzelm
parents: 18460
diff changeset
   439
   "discrim X = contents (\<Union>U \<in> Rep_Msg X. {freediscrim U})"
15152
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   440
15169
2b5da07a0b89 new "respects" syntax for quotienting
paulson
parents: 15152
diff changeset
   441
lemma discrim_congruent: "(\<lambda>U. {freediscrim U}) respects msgrel"
15152
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   442
by (simp add: congruent_def msgrel_imp_eq_freediscrim) 
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   443
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   444
text{*Now prove the four equations for @{term discrim}*}
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   445
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   446
lemma discrim_Nonce [simp]: "discrim (Nonce N) = 0"
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   447
by (simp add: discrim_def Nonce_def 
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   448
              UN_equiv_class [OF equiv_msgrel discrim_congruent]) 
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   449
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   450
lemma discrim_MPair [simp]: "discrim (MPair X Y) = 1"
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   451
apply (cases X, cases Y) 
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   452
apply (simp add: discrim_def MPair 
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   453
                 UN_equiv_class [OF equiv_msgrel discrim_congruent]) 
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   454
done
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   455
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   456
lemma discrim_Crypt [simp]: "discrim (Crypt K X) = discrim X + 2"
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   457
apply (cases X) 
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   458
apply (simp add: discrim_def Crypt
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   459
                 UN_equiv_class [OF equiv_msgrel discrim_congruent]) 
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   460
done
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   461
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   462
lemma discrim_Decrypt [simp]: "discrim (Decrypt K X) = discrim X - 2"
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   463
apply (cases X) 
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   464
apply (simp add: discrim_def Decrypt
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   465
                 UN_equiv_class [OF equiv_msgrel discrim_congruent]) 
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   466
done
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   467
5c4d3f10ac5a new examples
paulson
parents: 15120
diff changeset
   468
14527
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   469
end
bc9e5587d05a IsaMakefile
paulson
parents:
diff changeset
   470