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