src/HOL/Isar_examples/MultisetOrder.thy
author wenzelm
Fri, 06 Oct 2000 17:35:58 +0200
changeset 10168 50be659d4222
parent 10144 fe2a4e018dbf
permissions -rw-r--r--
final tuning;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/Isar_examples/MultisetOrder.thy
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
     4
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
     5
Wellfoundedness proof for the multiset order.
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
     6
*)
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
     7
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
     8
header {* Wellfoundedness of multiset ordering *}
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
     9
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    10
theory MultisetOrder = Multiset:
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    11
7968
964b65b4e433 improved presentation;
wenzelm
parents: 7874
diff changeset
    12
text_raw {*
7982
d534b897ce39 improved presentation;
wenzelm
parents: 7968
diff changeset
    13
 \footnote{Original tactic script by Tobias Nipkow (see
7968
964b65b4e433 improved presentation;
wenzelm
parents: 7874
diff changeset
    14
 \url{http://isabelle.in.tum.de/library/HOL/Induct/Multiset.html}),
8584
wenzelm
parents: 8304
diff changeset
    15
 based on a pen-and-paper proof due to Wilfried Buchholz.}\isanewline
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    16
*}
10144
fe2a4e018dbf hide declaratations;
wenzelm
parents: 10007
diff changeset
    17
(*<*)(* FIXME move? *)
fe2a4e018dbf hide declaratations;
wenzelm
parents: 10007
diff changeset
    18
declare multiset_induct [induct type: multiset]
fe2a4e018dbf hide declaratations;
wenzelm
parents: 10007
diff changeset
    19
declare wf_induct [induct set: wf]
fe2a4e018dbf hide declaratations;
wenzelm
parents: 10007
diff changeset
    20
declare acc_induct [induct set: acc](*>*)
8304
e132d147374b even better induct setup;
wenzelm
parents: 8281
diff changeset
    21
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    22
subsection {* A technical lemma *}
7761
7fab9592384f improved presentation;
wenzelm
parents: 7565
diff changeset
    23
7527
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    24
lemma less_add: "(N, M0 + {#a#}) : mult1 r ==>
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    25
    (EX M. (M, M0) : mult1 r & N = M + {#a#}) |
9659
wenzelm
parents: 8902
diff changeset
    26
    (EX K. (ALL b. b :# K --> (b, a) : r) & N = M0 + K)"
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    27
  (concl is "?case1 (mult1 r) | ?case2")
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    28
proof (unfold mult1_def)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    29
  let ?r = "\<lambda>K a. ALL b. b :# K --> (b, a) : r"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    30
  let ?R = "\<lambda>N M. EX a M0 K. M = M0 + {#a#} & N = M0 + K & ?r K a"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    31
  let ?case1 = "?case1 {(N, M). ?R N M}"
7527
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    32
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    33
  assume "(N, M0 + {#a#}) : {(N, M). ?R N M}"
7800
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
    34
  hence "EX a' M0' K.
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    35
      M0 + {#a#} = M0' + {#a'#} & N = M0' + K & ?r K a'" by simp
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    36
  thus "?case1 | ?case2"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    37
  proof (elim exE conjE)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    38
    fix a' M0' K
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    39
    assume N: "N = M0' + K" and r: "?r K a'"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    40
    assume "M0 + {#a#} = M0' + {#a'#}"
7800
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
    41
    hence "M0 = M0' & a = a' |
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    42
        (EX K'. M0 = K' + {#a'#} & M0' = K' + {#a#})"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    43
      by (simp only: add_eq_conv_ex)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    44
    thus ?thesis
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    45
    proof (elim disjE conjE exE)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    46
      assume "M0 = M0'" "a = a'"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    47
      with N r have "?r K a & N = M0 + K" by simp
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    48
      hence ?case2 .. thus ?thesis ..
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    49
    next
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    50
      fix K'
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    51
      assume "M0' = K' + {#a#}"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    52
      with N have n: "N = K' + K + {#a#}" by (simp add: union_ac)
7527
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    53
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    54
      assume "M0 = K' + {#a'#}"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    55
      with r have "?R (K' + K) M0" by blast
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    56
      with n have ?case1 by simp thus ?thesis ..
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    57
    qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    58
  qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    59
qed
7527
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    60
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    61
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    62
subsection {* The key property *}
7761
7fab9592384f improved presentation;
wenzelm
parents: 7565
diff changeset
    63
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    64
lemma all_accessible: "wf r ==> ALL M. M : acc (mult1 r)"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    65
proof
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    66
  let ?R = "mult1 r"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    67
  let ?W = "acc ?R"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    68
  {
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    69
    fix M M0 a
7800
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
    70
    assume M0: "M0 : ?W"
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
    71
      and wf_hyp: "ALL b. (b, a) : r --> (ALL M:?W. M + {#b#} : ?W)"
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    72
      and acc_hyp: "ALL M. (M, M0) : ?R --> M + {#a#} : ?W"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    73
    have "M0 + {#a#} : ?W"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    74
    proof (rule accI [of "M0 + {#a#}"])
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    75
      fix N
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    76
      assume "(N, M0 + {#a#}) : ?R"
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    77
      hence "((EX M. (M, M0) : ?R & N = M + {#a#}) |
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    78
          (EX K. (ALL b. b :# K --> (b, a) : r) & N = M0 + K))"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    79
	by (rule less_add)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    80
      thus "N : ?W"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    81
      proof (elim exE disjE conjE)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    82
	fix M assume "(M, M0) : ?R" and N: "N = M + {#a#}"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    83
	from acc_hyp have "(M, M0) : ?R --> M + {#a#} : ?W" ..
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    84
	hence "M + {#a#} : ?W" ..
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    85
	thus "N : ?W" by (simp only: N)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    86
      next
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    87
	fix K
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    88
	assume N: "N = M0 + K"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    89
	assume "ALL b. b :# K --> (b, a) : r"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    90
	have "?this --> M0 + K : ?W" (is "?P K")
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    91
	proof (induct K)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    92
	  from M0 have "M0 + {#} : ?W" by simp
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    93
	  thus "?P {#}" ..
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    94
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    95
	  fix K x assume hyp: "?P K"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    96
	  show "?P (K + {#x#})"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    97
	  proof
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    98
	    assume a: "ALL b. b :# (K + {#x#}) --> (b, a) : r"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    99
	    hence "(x, a) : r" by simp
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   100
	    with wf_hyp have b: "ALL M:?W. M + {#x#} : ?W" by blast
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
   101
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   102
	    from a hyp have "M0 + K : ?W" by simp
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   103
	    with b have "(M0 + K) + {#x#} : ?W" ..
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   104
	    thus "M0 + (K + {#x#}) : ?W" by (simp only: union_assoc)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   105
	  qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   106
	qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   107
	hence "M0 + K : ?W" ..
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   108
	thus "N : ?W" by (simp only: N)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   109
      qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   110
    qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   111
  } note tedious_reasoning = this
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   112
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   113
  assume wf: "wf r"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   114
  fix M
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   115
  show "M : ?W"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   116
  proof (induct M)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   117
    show "{#} : ?W"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   118
    proof (rule accI)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   119
      fix b assume "(b, {#}) : ?R"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   120
      with not_less_empty show "b : ?W" by contradiction
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   121
    qed
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   122
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   123
    fix M a assume "M : ?W"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   124
    from wf have "ALL M:?W. M + {#a#} : ?W"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   125
    proof induct
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   126
      fix a
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   127
      assume "ALL b. (b, a) : r --> (ALL M:?W. M + {#b#} : ?W)"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   128
      show "ALL M:?W. M + {#a#} : ?W"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   129
      proof
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   130
	fix M assume "M : ?W"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   131
	thus "M + {#a#} : ?W"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   132
          by (rule acc_induct) (rule tedious_reasoning)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   133
      qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   134
    qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   135
    thus "M + {#a#} : ?W" ..
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   136
  qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   137
qed
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   138
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   139
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   140
subsection {* Main result *}
7761
7fab9592384f improved presentation;
wenzelm
parents: 7565
diff changeset
   141
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   142
theorem wf_mult1: "wf r ==> wf (mult1 r)"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   143
  by (rule acc_wfI, rule all_accessible)
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   144
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   145
theorem wf_mult: "wf r ==> wf (mult r)"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   146
  by (unfold mult_def, rule wf_trancl, rule wf_mult1)
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   147
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   148
end