src/ZF/Induct/Comb.thy
author paulson
Tue, 06 Mar 2012 16:46:27 +0000
changeset 46822 95f1e700b712
parent 35427 ad039d29e01c
child 46900 73555abfa267
permissions -rw-r--r--
mathematical symbols for Isabelle/ZF example theories
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
35427
ad039d29e01c proper (type_)notation;
wenzelm
parents: 35068
diff changeset
    26
notation (xsymbols)
ad039d29e01c proper (type_)notation;
wenzelm
parents: 35068
diff changeset
    27
  app  (infixl "\<bullet>" 90)
ad039d29e01c proper (type_)notation;
wenzelm
parents: 35068
diff changeset
    28
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    29
text {*
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    30
  Inductive definition of contractions, @{text "-1->"} and
46822
95f1e700b712 mathematical symbols for Isabelle/ZF example theories
paulson
parents: 35427
diff changeset
    31
  (multi-step) reductions, @{text "-\<longrightarrow>"}.
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    32
*}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    33
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    34
consts
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    35
  contract  :: i
35068
544867142ea4 modernized translations;
wenzelm
parents: 32960
diff changeset
    36
544867142ea4 modernized translations;
wenzelm
parents: 32960
diff changeset
    37
abbreviation
544867142ea4 modernized translations;
wenzelm
parents: 32960
diff changeset
    38
  contract_syntax :: "[i,i] => o"    (infixl "-1->" 50)
544867142ea4 modernized translations;
wenzelm
parents: 32960
diff changeset
    39
  where "p -1-> q == <p,q> \<in> contract"
544867142ea4 modernized translations;
wenzelm
parents: 32960
diff changeset
    40
544867142ea4 modernized translations;
wenzelm
parents: 32960
diff changeset
    41
abbreviation
46822
95f1e700b712 mathematical symbols for Isabelle/ZF example theories
paulson
parents: 35427
diff changeset
    42
  contract_multi :: "[i,i] => o"    (infixl "-\<longrightarrow>" 50)
95f1e700b712 mathematical symbols for Isabelle/ZF example theories
paulson
parents: 35427
diff changeset
    43
  where "p -\<longrightarrow> q == <p,q> \<in> contract^*"
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    44
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    45
inductive
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    46
  domains "contract" \<subseteq> "comb \<times> comb"
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    47
  intros
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    48
    K:   "[| p \<in> comb;  q \<in> comb |] ==> K\<bullet>p\<bullet>q -1-> p"
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    49
    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
    50
    Ap1: "[| p-1->q;  r \<in> comb |] ==> p\<bullet>r -1-> q\<bullet>r"
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    51
    Ap2: "[| p-1->q;  r \<in> comb |] ==> r\<bullet>p -1-> r\<bullet>q"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    52
  type_intros comb.intros
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    53
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    54
text {*
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    55
  Inductive definition of parallel contractions, @{text "=1=>"} and
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    56
  (multi-step) parallel reductions, @{text "===>"}.
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    57
*}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    58
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    59
consts
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    60
  parcontract :: i
35068
544867142ea4 modernized translations;
wenzelm
parents: 32960
diff changeset
    61
544867142ea4 modernized translations;
wenzelm
parents: 32960
diff changeset
    62
abbreviation
544867142ea4 modernized translations;
wenzelm
parents: 32960
diff changeset
    63
  parcontract_syntax :: "[i,i] => o"    (infixl "=1=>" 50)
544867142ea4 modernized translations;
wenzelm
parents: 32960
diff changeset
    64
  where "p =1=> q == <p,q> \<in> parcontract"
544867142ea4 modernized translations;
wenzelm
parents: 32960
diff changeset
    65
544867142ea4 modernized translations;
wenzelm
parents: 32960
diff changeset
    66
abbreviation
544867142ea4 modernized translations;
wenzelm
parents: 32960
diff changeset
    67
  parcontract_multi :: "[i,i] => o"    (infixl "===>" 50)
544867142ea4 modernized translations;
wenzelm
parents: 32960
diff changeset
    68
  where "p ===> q == <p,q> \<in> parcontract^+"
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    69
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    70
inductive
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    71
  domains "parcontract" \<subseteq> "comb \<times> comb"
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    72
  intros
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    73
    refl: "[| p \<in> comb |] ==> p =1=> p"
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    74
    K:    "[| p \<in> comb;  q \<in> comb |] ==> K\<bullet>p\<bullet>q =1=> p"
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    75
    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
    76
    Ap:   "[| p=1=>q;  r=1=>s |] ==> p\<bullet>r =1=> q\<bullet>s"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    77
  type_intros comb.intros
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    78
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    79
text {*
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    80
  Misc definitions.
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    81
*}
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
  I :: i  where
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
    85
  "I == S\<bullet>K\<bullet>K"
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    86
24894
163c82d039cf modernized specifications;
wenzelm
parents: 18415
diff changeset
    87
definition
163c82d039cf modernized specifications;
wenzelm
parents: 18415
diff changeset
    88
  diamond :: "i => o"  where
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    89
  "diamond(r) ==
46822
95f1e700b712 mathematical symbols for Isabelle/ZF example theories
paulson
parents: 35427
diff changeset
    90
    \<forall>x y. <x,y>\<in>r \<longrightarrow> (\<forall>y'. <x,y'>\<in>r \<longrightarrow> (\<exists>z. <y,z>\<in>r & <y',z> \<in> r))"
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    91
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    92
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    93
subsection {* Transitive closure preserves the Church-Rosser property *}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    94
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
    95
lemma diamond_strip_lemmaD [rule_format]:
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    96
  "[| diamond(r);  <x,y>:r^+ |] ==>
46822
95f1e700b712 mathematical symbols for Isabelle/ZF example theories
paulson
parents: 35427
diff changeset
    97
    \<forall>y'. <x,y'>:r \<longrightarrow> (\<exists>z. <y',z>: r^+ & <y,z>: r)"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    98
  apply (unfold diamond_def)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
    99
  apply (erule trancl_induct)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   100
   apply (blast intro: r_into_trancl)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   101
  apply clarify
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   102
  apply (drule spec [THEN mp], assumption)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   103
  apply (blast intro: r_into_trancl trans_trancl [THEN transD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   104
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   105
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   106
lemma diamond_trancl: "diamond(r) ==> diamond(r^+)"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   107
  apply (simp (no_asm_simp) add: diamond_def)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   108
  apply (rule impI [THEN allI, THEN allI])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   109
  apply (erule trancl_induct)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   110
   apply auto
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   111
   apply (best intro: r_into_trancl trans_trancl [THEN transD]
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   112
     dest: diamond_strip_lemmaD)+
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   113
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   114
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   115
inductive_cases Ap_E [elim!]: "p\<bullet>q \<in> comb"
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   116
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   117
declare comb.intros [intro!]
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   118
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   119
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   120
subsection {* Results about Contraction *}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   121
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   122
text {*
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   123
  For type checking: replaces @{term "a -1-> b"} by @{text "a, b \<in>
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   124
  comb"}.
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   125
*}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   126
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   127
lemmas contract_combE2 = contract.dom_subset [THEN subsetD, THEN SigmaE2]
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   128
  and contract_combD1 = contract.dom_subset [THEN subsetD, THEN SigmaD1]
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   129
  and contract_combD2 = contract.dom_subset [THEN subsetD, THEN SigmaD2]
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   130
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   131
lemma field_contract_eq: "field(contract) = comb"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   132
  by (blast intro: contract.K elim!: contract_combE2)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   133
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   134
lemmas reduction_refl =
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   135
  field_contract_eq [THEN equalityD2, THEN subsetD, THEN rtrancl_refl]
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   136
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   137
lemmas rtrancl_into_rtrancl2 =
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   138
  r_into_rtrancl [THEN trans_rtrancl [THEN transD]]
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   139
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   140
declare reduction_refl [intro!] contract.K [intro!] contract.S [intro!]
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   141
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   142
lemmas reduction_rls =
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   143
  contract.K [THEN rtrancl_into_rtrancl2]
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   144
  contract.S [THEN rtrancl_into_rtrancl2]
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   145
  contract.Ap1 [THEN rtrancl_into_rtrancl2]
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   146
  contract.Ap2 [THEN rtrancl_into_rtrancl2]
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   147
46822
95f1e700b712 mathematical symbols for Isabelle/ZF example theories
paulson
parents: 35427
diff changeset
   148
lemma "p \<in> comb ==> I\<bullet>p -\<longrightarrow> p"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   149
  -- {* Example only: not used *}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   150
  by (unfold I_def) (blast intro: reduction_rls)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   151
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   152
lemma comb_I: "I \<in> comb"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   153
  by (unfold I_def) blast
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   154
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   155
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   156
subsection {* Non-contraction results *}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   157
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   158
text {* Derive a case for each combinator constructor. *}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   159
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   160
inductive_cases
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   161
      K_contractE [elim!]: "K -1-> r"
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   162
  and S_contractE [elim!]: "S -1-> r"
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   163
  and Ap_contractE [elim!]: "p\<bullet>q -1-> r"
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   164
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   165
lemma I_contract_E: "I -1-> r ==> P"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   166
  by (auto simp add: I_def)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   167
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   168
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
   169
  by auto
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   170
46822
95f1e700b712 mathematical symbols for Isabelle/ZF example theories
paulson
parents: 35427
diff changeset
   171
lemma Ap_reduce1: "[| p -\<longrightarrow> q;  r \<in> comb |] ==> p\<bullet>r -\<longrightarrow> q\<bullet>r"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   172
  apply (frule rtrancl_type [THEN subsetD, THEN SigmaD1])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   173
  apply (drule field_contract_eq [THEN equalityD1, THEN subsetD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   174
  apply (erule rtrancl_induct)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   175
   apply (blast intro: reduction_rls)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   176
  apply (erule trans_rtrancl [THEN transD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   177
  apply (blast intro: contract_combD2 reduction_rls)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   178
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   179
46822
95f1e700b712 mathematical symbols for Isabelle/ZF example theories
paulson
parents: 35427
diff changeset
   180
lemma Ap_reduce2: "[| p -\<longrightarrow> q;  r \<in> comb |] ==> r\<bullet>p -\<longrightarrow> r\<bullet>q"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   181
  apply (frule rtrancl_type [THEN subsetD, THEN SigmaD1])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   182
  apply (drule field_contract_eq [THEN equalityD1, THEN subsetD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   183
  apply (erule rtrancl_induct)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   184
   apply (blast intro: reduction_rls)
13573
37b22343c35a shortened a proof
paulson
parents: 12610
diff changeset
   185
  apply (blast intro: trans_rtrancl [THEN transD] 
37b22343c35a shortened a proof
paulson
parents: 12610
diff changeset
   186
                      contract_combD2 reduction_rls)
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   187
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   188
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   189
text {* Counterexample to the diamond property for @{text "-1->"}. *}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   190
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   191
lemma KIII_contract1: "K\<bullet>I\<bullet>(I\<bullet>I) -1-> I"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   192
  by (blast intro: comb.intros contract.K comb_I)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   193
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   194
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
   195
  by (unfold I_def) (blast intro: comb.intros contract.intros)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   196
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   197
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
   198
  by (blast intro: comb.intros contract.K comb_I)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   199
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   200
lemma not_diamond_contract: "\<not> diamond(contract)"
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   201
  apply (unfold diamond_def)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   202
  apply (blast intro: KIII_contract1 KIII_contract2 KIII_contract3
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   203
    elim!: I_contract_E)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   204
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   205
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   206
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   207
subsection {* Results about Parallel Contraction *}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   208
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   209
text {* For type checking: replaces @{text "a =1=> b"} by @{text "a, b
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   210
  \<in> comb"} *}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   211
lemmas parcontract_combE2 = parcontract.dom_subset [THEN subsetD, THEN SigmaE2]
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   212
  and parcontract_combD1 = parcontract.dom_subset [THEN subsetD, THEN SigmaD1]
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   213
  and parcontract_combD2 = parcontract.dom_subset [THEN subsetD, THEN SigmaD2]
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   214
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   215
lemma field_parcontract_eq: "field(parcontract) = comb"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   216
  by (blast intro: parcontract.K elim!: parcontract_combE2)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   217
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   218
text {* Derive a case for each combinator constructor. *}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   219
inductive_cases
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   220
      K_parcontractE [elim!]: "K =1=> r"
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   221
  and S_parcontractE [elim!]: "S =1=> r"
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   222
  and Ap_parcontractE [elim!]: "p\<bullet>q =1=> r"
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   223
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   224
declare parcontract.intros [intro]
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   225
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   226
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   227
subsection {* Basic properties of parallel contraction *}
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 K1_parcontractD [dest!]:
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   230
    "K\<bullet>p =1=> r ==> (\<exists>p'. r = K\<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
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   233
lemma S1_parcontractD [dest!]:
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   234
    "S\<bullet>p =1=> r ==> (\<exists>p'. r = S\<bullet>p' & p =1=> p')"
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 S2_parcontractD [dest!]:
15775
d8dd2fffa692 syntax fix
paulson
parents: 13573
diff changeset
   238
    "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
   239
  by auto
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   240
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   241
lemma diamond_parcontract: "diamond(parcontract)"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   242
  -- {* Church-Rosser property for parallel contraction *}
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   243
  apply (unfold diamond_def)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   244
  apply (rule impI [THEN allI, THEN allI])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   245
  apply (erule parcontract.induct)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   246
     apply (blast elim!: comb.free_elims  intro: parcontract_combD2)+
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   247
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   248
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   249
text {*
46822
95f1e700b712 mathematical symbols for Isabelle/ZF example theories
paulson
parents: 35427
diff changeset
   250
  \medskip Equivalence of @{prop "p -\<longrightarrow> q"} and @{prop "p ===> q"}.
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   251
*}
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   252
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   253
lemma contract_imp_parcontract: "p-1->q ==> p=1=>q"
18415
eb68dc98bda2 improved proofs;
wenzelm
parents: 16417
diff changeset
   254
  by (induct set: contract) auto
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   255
46822
95f1e700b712 mathematical symbols for Isabelle/ZF example theories
paulson
parents: 35427
diff changeset
   256
lemma reduce_imp_parreduce: "p-\<longrightarrow>q ==> p===>q"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   257
  apply (frule rtrancl_type [THEN subsetD, THEN SigmaD1])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   258
  apply (drule field_contract_eq [THEN equalityD1, THEN subsetD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   259
  apply (erule rtrancl_induct)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   260
   apply (blast intro: r_into_trancl)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   261
  apply (blast intro: contract_imp_parcontract r_into_trancl
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   262
    trans_trancl [THEN transD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   263
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   264
46822
95f1e700b712 mathematical symbols for Isabelle/ZF example theories
paulson
parents: 35427
diff changeset
   265
lemma parcontract_imp_reduce: "p=1=>q ==> p-\<longrightarrow>q"
18415
eb68dc98bda2 improved proofs;
wenzelm
parents: 16417
diff changeset
   266
  apply (induct set: parcontract)
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   267
     apply (blast intro: reduction_rls)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   268
    apply (blast intro: reduction_rls)
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   269
   apply (blast intro: reduction_rls)
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   270
  apply (blast intro: trans_rtrancl [THEN transD]
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   271
    Ap_reduce1 Ap_reduce2 parcontract_combD1 parcontract_combD2)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   272
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   273
46822
95f1e700b712 mathematical symbols for Isabelle/ZF example theories
paulson
parents: 35427
diff changeset
   274
lemma parreduce_imp_reduce: "p===>q ==> p-\<longrightarrow>q"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   275
  apply (frule trancl_type [THEN subsetD, THEN SigmaD1])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   276
  apply (drule field_parcontract_eq [THEN equalityD1, THEN subsetD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   277
  apply (erule trancl_induct, erule parcontract_imp_reduce)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   278
  apply (erule trans_rtrancl [THEN transD])
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   279
  apply (erule parcontract_imp_reduce)
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   280
  done
12560
5820841f21fd converted some ZF/Induct examples to Isar
paulson
parents: 12088
diff changeset
   281
46822
95f1e700b712 mathematical symbols for Isabelle/ZF example theories
paulson
parents: 35427
diff changeset
   282
lemma parreduce_iff_reduce: "p===>q \<longleftrightarrow> p-\<longrightarrow>q"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12560
diff changeset
   283
  by (blast intro: parreduce_imp_reduce reduce_imp_parreduce)
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
   284
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
   285
end