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