src/ZF/Induct/Comb.thy
author wenzelm
Sat, 17 Oct 2009 14:43:18 +0200
changeset 32960 69916a850301
parent 24894 163c82d039cf
child 35068 544867142ea4
permissions -rw-r--r--
eliminated hard tabulators, guessing at each author's individual tab-width; tuned headers;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
     1
(*  Title:      ZF/Induct/Comb.thy
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
     2
    Author:     Lawrence C Paulson
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
     3
    Copyright   1994  University of Cambridge
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
     4
*)
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
     5
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
     6
header {* Combinatory Logic example: the Church-Rosser Theorem *}
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
     7
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 15863
diff changeset
     8
theory Comb imports Main begin
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
     9
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    10
text {*
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    11
  Curiously, combinators do not include free variables.
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    12
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    13
  Example taken from \cite{camilleri-melham}.
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    14
*}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    15
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    16
subsection {* Definitions *}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    17
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    18
text {* Datatype definition of combinators @{text S} and @{text K}. *}
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    19
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    20
consts comb :: i
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    21
datatype comb =
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    22
    K
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    23
  | S
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    24
  | app ("p \<in> comb", "q \<in> comb")    (infixl "@@" 90)
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    25
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    26
text {*
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    27
  Inductive definition of contractions, @{text "-1->"} and
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    28
  (multi-step) reductions, @{text "--->"}.
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    29
*}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    30
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    31
consts
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    32
  contract  :: i
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    33
syntax
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    34
  "_contract"       :: "[i,i] => o"    (infixl "-1->" 50)
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    35
  "_contract_multi" :: "[i,i] => o"    (infixl "--->" 50)
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    36
translations
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    37
  "p -1-> q" == "<p,q> \<in> contract"
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    38
  "p ---> q" == "<p,q> \<in> contract^*"
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    39
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    40
syntax (xsymbols)
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 24894
diff changeset
    41
  "comb.app"    :: "[i, i] => i"             (infixl "\<bullet>" 90)
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    42
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    43
inductive
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    44
  domains "contract" \<subseteq> "comb \<times> comb"
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    45
  intros
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    46
    K:   "[| p \<in> comb;  q \<in> comb |] ==> K\<bullet>p\<bullet>q -1-> p"
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    47
    S:   "[| p \<in> comb;  q \<in> comb;  r \<in> comb |] ==> S\<bullet>p\<bullet>q\<bullet>r -1-> (p\<bullet>r)\<bullet>(q\<bullet>r)"
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    48
    Ap1: "[| p-1->q;  r \<in> comb |] ==> p\<bullet>r -1-> q\<bullet>r"
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    49
    Ap2: "[| p-1->q;  r \<in> comb |] ==> r\<bullet>p -1-> r\<bullet>q"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    50
  type_intros comb.intros
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    51
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    52
text {*
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    53
  Inductive definition of parallel contractions, @{text "=1=>"} and
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    54
  (multi-step) parallel reductions, @{text "===>"}.
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    55
*}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    56
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    57
consts
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    58
  parcontract :: i
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    59
syntax
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    60
  "_parcontract" :: "[i,i] => o"    (infixl "=1=>" 50)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    61
  "_parcontract_multi" :: "[i,i] => o"    (infixl "===>" 50)
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    62
translations
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    63
  "p =1=> q" == "<p,q> \<in> parcontract"
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    64
  "p ===> q" == "<p,q> \<in> parcontract^+"
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    65
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    66
inductive
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    67
  domains "parcontract" \<subseteq> "comb \<times> comb"
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    68
  intros
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    69
    refl: "[| p \<in> comb |] ==> p =1=> p"
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    70
    K:    "[| p \<in> comb;  q \<in> comb |] ==> K\<bullet>p\<bullet>q =1=> p"
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    71
    S:    "[| p \<in> comb;  q \<in> comb;  r \<in> comb |] ==> S\<bullet>p\<bullet>q\<bullet>r =1=> (p\<bullet>r)\<bullet>(q\<bullet>r)"
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    72
    Ap:   "[| p=1=>q;  r=1=>s |] ==> p\<bullet>r =1=> q\<bullet>s"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    73
  type_intros comb.intros
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    74
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    75
text {*
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    76
  Misc definitions.
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    77
*}
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    78
24894
163c82d039cf modernized specifications;
wenzelm
parents: 18415
diff changeset
    79
definition
163c82d039cf modernized specifications;
wenzelm
parents: 18415
diff changeset
    80
  I :: i  where
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    81
  "I == S\<bullet>K\<bullet>K"
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    82
24894
163c82d039cf modernized specifications;
wenzelm
parents: 18415
diff changeset
    83
definition
163c82d039cf modernized specifications;
wenzelm
parents: 18415
diff changeset
    84
  diamond :: "i => o"  where
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    85
  "diamond(r) ==
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    86
    \<forall>x y. <x,y>\<in>r --> (\<forall>y'. <x,y'>\<in>r --> (\<exists>z. <y,z>\<in>r & <y',z> \<in> r))"
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    87
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    88
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    89
subsection {* Transitive closure preserves the Church-Rosser property *}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    90
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    91
lemma diamond_strip_lemmaD [rule_format]:
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    92
  "[| diamond(r);  <x,y>:r^+ |] ==>
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    93
    \<forall>y'. <x,y'>:r --> (\<exists>z. <y',z>: r^+ & <y,z>: r)"
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    94
  apply (unfold diamond_def)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    95
  apply (erule trancl_induct)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    96
   apply (blast intro: r_into_trancl)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    97
  apply clarify
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    98
  apply (drule spec [THEN mp], assumption)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    99
  apply (blast intro: r_into_trancl trans_trancl [THEN transD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   100
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   101
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   102
lemma diamond_trancl: "diamond(r) ==> diamond(r^+)"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   103
  apply (simp (no_asm_simp) add: diamond_def)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   104
  apply (rule impI [THEN allI, THEN allI])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   105
  apply (erule trancl_induct)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   106
   apply auto
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   107
   apply (best intro: r_into_trancl trans_trancl [THEN transD]
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   108
     dest: diamond_strip_lemmaD)+
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   109
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   110
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   111
inductive_cases Ap_E [elim!]: "p\<bullet>q \<in> comb"
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   112
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   113
declare comb.intros [intro!]
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   114
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   115
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   116
subsection {* Results about Contraction *}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   117
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   118
text {*
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   119
  For type checking: replaces @{term "a -1-> b"} by @{text "a, b \<in>
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   120
  comb"}.
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   121
*}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   122
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   123
lemmas contract_combE2 = contract.dom_subset [THEN subsetD, THEN SigmaE2]
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   124
  and contract_combD1 = contract.dom_subset [THEN subsetD, THEN SigmaD1]
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   125
  and contract_combD2 = contract.dom_subset [THEN subsetD, THEN SigmaD2]
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   126
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   127
lemma field_contract_eq: "field(contract) = comb"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   128
  by (blast intro: contract.K elim!: contract_combE2)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   129
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   130
lemmas reduction_refl =
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   131
  field_contract_eq [THEN equalityD2, THEN subsetD, THEN rtrancl_refl]
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   132
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   133
lemmas rtrancl_into_rtrancl2 =
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   134
  r_into_rtrancl [THEN trans_rtrancl [THEN transD]]
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   135
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   136
declare reduction_refl [intro!] contract.K [intro!] contract.S [intro!]
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   137
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   138
lemmas reduction_rls =
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   139
  contract.K [THEN rtrancl_into_rtrancl2]
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   140
  contract.S [THEN rtrancl_into_rtrancl2]
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   141
  contract.Ap1 [THEN rtrancl_into_rtrancl2]
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   142
  contract.Ap2 [THEN rtrancl_into_rtrancl2]
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   143
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   144
lemma "p \<in> comb ==> I\<bullet>p ---> p"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   145
  -- {* Example only: not used *}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   146
  by (unfold I_def) (blast intro: reduction_rls)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   147
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   148
lemma comb_I: "I \<in> comb"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   149
  by (unfold I_def) blast
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   150
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   151
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   152
subsection {* Non-contraction results *}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   153
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   154
text {* Derive a case for each combinator constructor. *}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   155
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   156
inductive_cases
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   157
      K_contractE [elim!]: "K -1-> r"
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   158
  and S_contractE [elim!]: "S -1-> r"
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   159
  and Ap_contractE [elim!]: "p\<bullet>q -1-> r"
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   160
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   161
lemma I_contract_E: "I -1-> r ==> P"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   162
  by (auto simp add: I_def)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   163
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   164
lemma K1_contractD: "K\<bullet>p -1-> r ==> (\<exists>q. r = K\<bullet>q & p -1-> q)"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   165
  by auto
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   166
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   167
lemma Ap_reduce1: "[| p ---> q;  r \<in> comb |] ==> p\<bullet>r ---> q\<bullet>r"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   168
  apply (frule rtrancl_type [THEN subsetD, THEN SigmaD1])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   169
  apply (drule field_contract_eq [THEN equalityD1, THEN subsetD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   170
  apply (erule rtrancl_induct)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   171
   apply (blast intro: reduction_rls)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   172
  apply (erule trans_rtrancl [THEN transD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   173
  apply (blast intro: contract_combD2 reduction_rls)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   174
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   175
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   176
lemma Ap_reduce2: "[| p ---> q;  r \<in> comb |] ==> r\<bullet>p ---> r\<bullet>q"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   177
  apply (frule rtrancl_type [THEN subsetD, THEN SigmaD1])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   178
  apply (drule field_contract_eq [THEN equalityD1, THEN subsetD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   179
  apply (erule rtrancl_induct)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   180
   apply (blast intro: reduction_rls)
13573
37b22343c35a shortened a proof
paulson
parents: 12610
diff changeset
   181
  apply (blast intro: trans_rtrancl [THEN transD] 
37b22343c35a shortened a proof
paulson
parents: 12610
diff changeset
   182
                      contract_combD2 reduction_rls)
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   183
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   184
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   185
text {* Counterexample to the diamond property for @{text "-1->"}. *}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   186
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   187
lemma KIII_contract1: "K\<bullet>I\<bullet>(I\<bullet>I) -1-> I"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   188
  by (blast intro: comb.intros contract.K comb_I)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   189
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   190
lemma KIII_contract2: "K\<bullet>I\<bullet>(I\<bullet>I) -1-> K\<bullet>I\<bullet>((K\<bullet>I)\<bullet>(K\<bullet>I))"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   191
  by (unfold I_def) (blast intro: comb.intros contract.intros)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   192
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   193
lemma KIII_contract3: "K\<bullet>I\<bullet>((K\<bullet>I)\<bullet>(K\<bullet>I)) -1-> I"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   194
  by (blast intro: comb.intros contract.K comb_I)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   195
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   196
lemma not_diamond_contract: "\<not> diamond(contract)"
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   197
  apply (unfold diamond_def)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   198
  apply (blast intro: KIII_contract1 KIII_contract2 KIII_contract3
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   199
    elim!: I_contract_E)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   200
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   201
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   202
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   203
subsection {* Results about Parallel Contraction *}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   204
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   205
text {* For type checking: replaces @{text "a =1=> b"} by @{text "a, b
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   206
  \<in> comb"} *}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   207
lemmas parcontract_combE2 = parcontract.dom_subset [THEN subsetD, THEN SigmaE2]
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   208
  and parcontract_combD1 = parcontract.dom_subset [THEN subsetD, THEN SigmaD1]
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   209
  and parcontract_combD2 = parcontract.dom_subset [THEN subsetD, THEN SigmaD2]
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   210
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   211
lemma field_parcontract_eq: "field(parcontract) = comb"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   212
  by (blast intro: parcontract.K elim!: parcontract_combE2)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   213
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   214
text {* Derive a case for each combinator constructor. *}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   215
inductive_cases
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   216
      K_parcontractE [elim!]: "K =1=> r"
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   217
  and S_parcontractE [elim!]: "S =1=> r"
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   218
  and Ap_parcontractE [elim!]: "p\<bullet>q =1=> r"
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   219
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   220
declare parcontract.intros [intro]
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   221
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   222
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   223
subsection {* Basic properties of parallel contraction *}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   224
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   225
lemma K1_parcontractD [dest!]:
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   226
    "K\<bullet>p =1=> r ==> (\<exists>p'. r = K\<bullet>p' & p =1=> p')"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   227
  by auto
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   228
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   229
lemma S1_parcontractD [dest!]:
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   230
    "S\<bullet>p =1=> r ==> (\<exists>p'. r = S\<bullet>p' & p =1=> p')"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   231
  by auto
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   232
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   233
lemma S2_parcontractD [dest!]:
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   234
    "S\<bullet>p\<bullet>q =1=> r ==> (\<exists>p' q'. r = S\<bullet>p'\<bullet>q' & p =1=> p' & q =1=> q')"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   235
  by auto
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   236
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   237
lemma diamond_parcontract: "diamond(parcontract)"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   238
  -- {* Church-Rosser property for parallel contraction *}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   239
  apply (unfold diamond_def)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   240
  apply (rule impI [THEN allI, THEN allI])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   241
  apply (erule parcontract.induct)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   242
     apply (blast elim!: comb.free_elims  intro: parcontract_combD2)+
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   243
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   244
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   245
text {*
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   246
  \medskip Equivalence of @{prop "p ---> q"} and @{prop "p ===> q"}.
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   247
*}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   248
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   249
lemma contract_imp_parcontract: "p-1->q ==> p=1=>q"
18415
eb68dc98bda2 improved proofs;
wenzelm
parents: 16417
diff changeset
   250
  by (induct set: contract) auto
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   251
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   252
lemma reduce_imp_parreduce: "p--->q ==> p===>q"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   253
  apply (frule rtrancl_type [THEN subsetD, THEN SigmaD1])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   254
  apply (drule field_contract_eq [THEN equalityD1, THEN subsetD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   255
  apply (erule rtrancl_induct)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   256
   apply (blast intro: r_into_trancl)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   257
  apply (blast intro: contract_imp_parcontract r_into_trancl
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   258
    trans_trancl [THEN transD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   259
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   260
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   261
lemma parcontract_imp_reduce: "p=1=>q ==> p--->q"
18415
eb68dc98bda2 improved proofs;
wenzelm
parents: 16417
diff changeset
   262
  apply (induct set: parcontract)
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   263
     apply (blast intro: reduction_rls)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   264
    apply (blast intro: reduction_rls)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   265
   apply (blast intro: reduction_rls)
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   266
  apply (blast intro: trans_rtrancl [THEN transD]
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   267
    Ap_reduce1 Ap_reduce2 parcontract_combD1 parcontract_combD2)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   268
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   269
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   270
lemma parreduce_imp_reduce: "p===>q ==> p--->q"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   271
  apply (frule trancl_type [THEN subsetD, THEN SigmaD1])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   272
  apply (drule field_parcontract_eq [THEN equalityD1, THEN subsetD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   273
  apply (erule trancl_induct, erule parcontract_imp_reduce)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   274
  apply (erule trans_rtrancl [THEN transD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   275
  apply (erule parcontract_imp_reduce)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   276
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   277
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   278
lemma parreduce_iff_reduce: "p===>q <-> p--->q"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   279
  by (blast intro: parreduce_imp_reduce reduce_imp_parreduce)
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
   280
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
   281
end