src/ZF/ex/Commutation.thy
author hoelzl
Wed, 03 Jun 2009 11:33:16 +0200
changeset 31387 c4a3c3e9dc8e
parent 21404 eb85850d3eb7
child 35762 af3ff2ba4c54
permissions -rw-r--r--
Removed usage of reference in reification
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11042
bb566dd3f927 commutation theory, ported by Sidi Ehmety
paulson
parents:
diff changeset
     1
(*  Title:      HOL/Lambda/Commutation.thy
bb566dd3f927 commutation theory, ported by Sidi Ehmety
paulson
parents:
diff changeset
     2
    ID:         $Id$
bb566dd3f927 commutation theory, ported by Sidi Ehmety
paulson
parents:
diff changeset
     3
    Author:     Tobias Nipkow & Sidi Ould Ehmety
bb566dd3f927 commutation theory, ported by Sidi Ehmety
paulson
parents:
diff changeset
     4
    Copyright   1995  TU Muenchen
bb566dd3f927 commutation theory, ported by Sidi Ehmety
paulson
parents:
diff changeset
     5
bb566dd3f927 commutation theory, ported by Sidi Ehmety
paulson
parents:
diff changeset
     6
Commutation theory for proving the Church Rosser theorem
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
     7
        ported from Isabelle/HOL  by Sidi Ould Ehmety
11042
bb566dd3f927 commutation theory, ported by Sidi Ehmety
paulson
parents:
diff changeset
     8
*)
bb566dd3f927 commutation theory, ported by Sidi Ehmety
paulson
parents:
diff changeset
     9
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 13339
diff changeset
    10
theory Commutation imports Main begin
11042
bb566dd3f927 commutation theory, ported by Sidi Ehmety
paulson
parents:
diff changeset
    11
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    12
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21233
diff changeset
    13
  square  :: "[i, i, i, i] => o" where
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    14
  "square(r,s,t,u) ==
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    15
    (\<forall>a b. <a,b> \<in> r --> (\<forall>c. <a, c> \<in> s --> (\<exists>x. <b,x> \<in> t & <c,x> \<in> u)))"
11042
bb566dd3f927 commutation theory, ported by Sidi Ehmety
paulson
parents:
diff changeset
    16
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21233
diff changeset
    17
definition
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21233
diff changeset
    18
  commute :: "[i, i] => o" where
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    19
  "commute(r,s) == square(r,s,s,r)"
11042
bb566dd3f927 commutation theory, ported by Sidi Ehmety
paulson
parents:
diff changeset
    20
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21233
diff changeset
    21
definition
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21233
diff changeset
    22
  diamond :: "i=>o" where
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    23
  "diamond(r)   == commute(r, r)"
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    24
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21233
diff changeset
    25
definition
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21233
diff changeset
    26
  strip :: "i=>o" where
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    27
  "strip(r) == commute(r^*, r)"
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    28
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21233
diff changeset
    29
definition
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21233
diff changeset
    30
  Church_Rosser :: "i => o" where
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    31
  "Church_Rosser(r) == (\<forall>x y. <x,y> \<in>  (r Un converse(r))^* -->
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    32
                        (\<exists>z. <x,z> \<in> r^* & <y,z> \<in> r^*))"
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21233
diff changeset
    33
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21233
diff changeset
    34
definition
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21233
diff changeset
    35
  confluent :: "i=>o" where
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    36
  "confluent(r) == diamond(r^*)"
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    37
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    38
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    39
lemma square_sym: "square(r,s,t,u) ==> square(s,r,u,t)"
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    40
  unfolding square_def by blast
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    41
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    42
lemma square_subset: "[| square(r,s,t,u); t \<subseteq> t' |] ==> square(r,s,t',u)"
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    43
  unfolding square_def by blast
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    44
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    45
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    46
lemma square_rtrancl:
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    47
  "square(r,s,s,t) ==> field(s)<=field(t) ==> square(r^*,s,s,t^*)"
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13248
diff changeset
    48
apply (unfold square_def, clarify)
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    49
apply (erule rtrancl_induct)
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    50
apply (blast intro: rtrancl_refl)
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    51
apply (blast intro: rtrancl_into_rtrancl)
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    52
done
11042
bb566dd3f927 commutation theory, ported by Sidi Ehmety
paulson
parents:
diff changeset
    53
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    54
(* A special case of square_rtrancl_on *)
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    55
lemma diamond_strip:
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    56
  "diamond(r) ==> strip(r)"
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    57
apply (unfold diamond_def commute_def strip_def)
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13248
diff changeset
    58
apply (rule square_rtrancl, simp_all)
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    59
done
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    60
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    61
(*** commute ***)
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    62
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    63
lemma commute_sym: "commute(r,s) ==> commute(s,r)"
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    64
  unfolding commute_def by (blast intro: square_sym)
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    65
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    66
lemma commute_rtrancl:
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    67
  "commute(r,s) ==> field(r)=field(s) ==> commute(r^*,s^*)"
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    68
apply (unfold commute_def)
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    69
apply (rule square_rtrancl)
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    70
apply (rule square_sym [THEN square_rtrancl, THEN square_sym])
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    71
apply (simp_all add: rtrancl_field)
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    72
done
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    73
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    74
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    75
lemma confluentD: "confluent(r) ==> diamond(r^*)"
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    76
by (simp add: confluent_def)
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    77
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    78
lemma strip_confluent: "strip(r) ==> confluent(r)"
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    79
apply (unfold strip_def confluent_def diamond_def)
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    80
apply (drule commute_rtrancl)
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    81
apply (simp_all add: rtrancl_field)
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    82
done
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    83
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    84
lemma commute_Un: "[| commute(r,t); commute(s,t) |] ==> commute(r Un s, t)"
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    85
  unfolding commute_def square_def by blast
11042
bb566dd3f927 commutation theory, ported by Sidi Ehmety
paulson
parents:
diff changeset
    86
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    87
lemma diamond_Un:
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    88
     "[| diamond(r); diamond(s); commute(r, s) |] ==> diamond(r Un s)"
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    89
  unfolding diamond_def by (blast intro: commute_Un commute_sym)
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    90
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    91
lemma diamond_confluent:
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    92
    "diamond(r) ==> confluent(r)"
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    93
apply (unfold diamond_def confluent_def)
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13248
diff changeset
    94
apply (erule commute_rtrancl, simp)
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    95
done
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
    96
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    97
lemma confluent_Un:
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
    98
 "[| confluent(r); confluent(s); commute(r^*, s^*);
13248
ae66c22ed52e new theorems
paulson
parents: 12867
diff changeset
    99
     relation(r); relation(s) |] ==> confluent(r Un s)"
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   100
apply (unfold confluent_def)
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13248
diff changeset
   101
apply (rule rtrancl_Un_rtrancl [THEN subst], auto)
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   102
apply (blast dest: diamond_Un intro: diamond_confluent [THEN confluentD])
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   103
done
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   104
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   105
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
   106
lemma diamond_to_confluence:
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   107
     "[| diamond(r); s \<subseteq> r; r<= s^* |] ==> confluent(s)"
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13248
diff changeset
   108
apply (drule rtrancl_subset [symmetric], assumption)
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   109
apply (simp_all add: confluent_def)
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   110
apply (blast intro: diamond_confluent [THEN confluentD])
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   111
done
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   112
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   113
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   114
(*** Church_Rosser ***)
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   115
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
   116
lemma Church_Rosser1:
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   117
     "Church_Rosser(r) ==> confluent(r)"
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
   118
apply (unfold confluent_def Church_Rosser_def square_def
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13248
diff changeset
   119
              commute_def diamond_def, auto)
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   120
apply (drule converseI)
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   121
apply (simp (no_asm_use) add: rtrancl_converse [symmetric])
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13248
diff changeset
   122
apply (drule_tac x = b in spec)
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13248
diff changeset
   123
apply (drule_tac x1 = c in spec [THEN mp])
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13248
diff changeset
   124
apply (rule_tac b = a in rtrancl_trans)
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   125
apply (blast intro: rtrancl_mono [THEN subsetD])+
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   126
done
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   127
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   128
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
   129
lemma Church_Rosser2:
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   130
     "confluent(r) ==> Church_Rosser(r)"
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
   131
apply (unfold confluent_def Church_Rosser_def square_def
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13248
diff changeset
   132
              commute_def diamond_def, auto)
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   133
apply (frule fieldI1)
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   134
apply (simp add: rtrancl_field)
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13248
diff changeset
   135
apply (erule rtrancl_induct, auto)
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   136
apply (blast intro: rtrancl_refl)
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   137
apply (blast del: rtrancl_refl intro: r_into_rtrancl rtrancl_trans)+
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   138
done
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   139
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   140
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   141
lemma Church_Rosser: "Church_Rosser(r) <-> confluent(r)"
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
   142
  by (blast intro: Church_Rosser1 Church_Rosser2)
12867
5c900a821a7c New-style versions of these old examples
paulson
parents: 11316
diff changeset
   143
21233
5a5c8ea5f66a tuned specifications;
wenzelm
parents: 16417
diff changeset
   144
end