src/HOL/Isar_examples/MultisetOrder.thy
author wenzelm
Tue, 22 Feb 2000 21:50:02 +0100
changeset 8281 188e2924433e
parent 7982 d534b897ce39
child 8304 e132d147374b
permissions -rw-r--r--
tuned "induct" syntax;
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
7761
7fab9592384f improved presentation;
wenzelm
parents: 7565
diff changeset
     8
header {* Wellfoundedness of multiset ordering *};
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
     9
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    10
theory MultisetOrder = Multiset:;
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}),
964b65b4e433 improved presentation;
wenzelm
parents: 7874
diff changeset
    15
 based on a pen-and-paper proof due to Wilfried Buchholz.}
964b65b4e433 improved presentation;
wenzelm
parents: 7874
diff changeset
    16
*};
7527
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    17
7761
7fab9592384f improved presentation;
wenzelm
parents: 7565
diff changeset
    18
subsection {* A technical lemma *};
7fab9592384f improved presentation;
wenzelm
parents: 7565
diff changeset
    19
7527
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    20
lemma less_add: "(N, M0 + {#a#}) : mult1 r ==>
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    21
    (EX M. (M, M0) : mult1 r & N = M + {#a#}) |
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    22
    (EX K. (ALL b. elem K b --> (b, a) : r) & N = M0 + K)"
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    23
  (concl is "?case1 (mult1 r) | ?case2");
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    24
proof (unfold mult1_def);
8281
188e2924433e tuned "induct" syntax;
wenzelm
parents: 7982
diff changeset
    25
  let ?r = "\\<lambda>K a. ALL b. elem K b --> (b, a) : r";
188e2924433e tuned "induct" syntax;
wenzelm
parents: 7982
diff changeset
    26
  let ?R = "\\<lambda>N M. EX a M0 K. M = M0 + {#a#} & N = M0 + K & ?r K a";
7527
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    27
  let ?case1 = "?case1 {(N, M). ?R N M}";
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    28
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    29
  assume "(N, M0 + {#a#}) : {(N, M). ?R N M}";
7800
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
    30
  hence "EX a' M0' K.
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
    31
      M0 + {#a#} = M0' + {#a'#} & N = M0' + K & ?r K a'"; by simp;
7527
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    32
  thus "?case1 | ?case2";
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    33
  proof (elim exE conjE);
7874
180364256231 improved presentation;
wenzelm
parents: 7800
diff changeset
    34
    fix a' M0' K;
180364256231 improved presentation;
wenzelm
parents: 7800
diff changeset
    35
    assume N: "N = M0' + K" and r: "?r K a'";
7527
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    36
    assume "M0 + {#a#} = M0' + {#a'#}";
7800
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
    37
    hence "M0 = M0' & a = a' |
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
    38
        (EX K'. M0 = K' + {#a'#} & M0' = K' + {#a#})";
7527
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    39
      by (simp only: add_eq_conv_ex);
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    40
    thus ?thesis;
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    41
    proof (elim disjE conjE exE);
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    42
      assume "M0 = M0'" "a = a'";
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    43
      with N r; have "?r K a & N = M0 + K"; by simp;
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    44
      hence ?case2; ..; thus ?thesis; ..;
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    45
    next;
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    46
      fix K';
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    47
      assume "M0' = K' + {#a#}";
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    48
      with N; have n: "N = K' + K + {#a#}"; by (simp add: union_ac);
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    49
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    50
      assume "M0 = K' + {#a'#}";
7565
bfa85f429629 accomodate refined facts handling;
wenzelm
parents: 7530
diff changeset
    51
      with r; have "?R (K' + K) M0"; by blast;
7527
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    52
      with n; have ?case1; by simp; thus ?thesis; ..;
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    53
    qed;
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    54
  qed;
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    55
qed;
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    56
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    57
7761
7fab9592384f improved presentation;
wenzelm
parents: 7565
diff changeset
    58
subsection {* The key property *};
7fab9592384f improved presentation;
wenzelm
parents: 7565
diff changeset
    59
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    60
lemma all_accessible: "wf r ==> ALL M. M : acc (mult1 r)";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    61
proof;
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    62
  let ?R = "mult1 r";
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    63
  let ?W = "acc ?R";
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    64
  {{;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    65
    fix M M0 a;
7800
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
    66
    assume M0: "M0 : ?W"
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
    67
      and wf_hyp: "ALL b. (b, a) : r --> (ALL M:?W. M + {#b#} : ?W)"
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    68
      and acc_hyp: "ALL M. (M, M0) : ?R --> M + {#a#} : ?W";
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    69
    have "M0 + {#a#} : ?W";
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    70
    proof (rule accI [of "M0 + {#a#}"]);
7874
180364256231 improved presentation;
wenzelm
parents: 7800
diff changeset
    71
      fix N;
180364256231 improved presentation;
wenzelm
parents: 7800
diff changeset
    72
      assume "(N, M0 + {#a#}) : ?R";
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    73
      hence "((EX M. (M, M0) : ?R & N = M + {#a#}) |
7800
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
    74
          (EX K. (ALL b. elem K b --> (b, a) : r) & N = M0 + K))";
7527
9e2dddd8b81f lemma less_add;
wenzelm
parents: 7480
diff changeset
    75
	by (rule less_add);
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    76
      thus "N : ?W";
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    77
      proof (elim exE disjE conjE);
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    78
	fix M; assume "(M, M0) : ?R" and N: "N = M + {#a#}";
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    79
	from acc_hyp; have "(M, M0) : ?R --> M + {#a#} : ?W"; ..;
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    80
	hence "M + {#a#} : ?W"; ..;
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    81
	thus "N : ?W"; by (simp only: N);
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    82
      next;
7451
wenzelm
parents: 7448
diff changeset
    83
	fix K;
wenzelm
parents: 7448
diff changeset
    84
	assume N: "N = M0 + K";
wenzelm
parents: 7448
diff changeset
    85
	assume "ALL b. elem K b --> (b, a) : r";
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    86
	have "?this --> M0 + K : ?W" (is "?P K");
8281
188e2924433e tuned "induct" syntax;
wenzelm
parents: 7982
diff changeset
    87
	proof (induct K in rule: multiset_induct);
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    88
	  from M0; have "M0 + {#} : ?W"; by simp;
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    89
	  thus "?P {#}"; ..;
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    90
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    91
	  fix K x; assume hyp: "?P K";
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    92
	  show "?P (K + {#x#})";
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    93
	  proof;
7451
wenzelm
parents: 7448
diff changeset
    94
	    assume a: "ALL b. elem (K + {#x#}) b --> (b, a) : r";
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    95
	    hence "(x, a) : r"; by simp;
7800
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
    96
	    with wf_hyp; have b: "ALL M:?W. M + {#x#} : ?W"; by blast;
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    97
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    98
	    from a hyp; have "M0 + K : ?W"; by simp;
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
    99
	    with b; have "(M0 + K) + {#x#} : ?W"; ..;
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
   100
	    thus "M0 + (K + {#x#}) : ?W"; by (simp only: union_assoc);
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   101
	  qed;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   102
	qed;
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
   103
	hence "M0 + K : ?W"; ..;
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
   104
	thus "N : ?W"; by (simp only: N);
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   105
      qed;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   106
    qed;
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
   107
  }}; note tedious_reasoning = this;
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   108
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   109
  assume wf: "wf r";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   110
  fix M;
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
   111
  show "M : ?W";
8281
188e2924433e tuned "induct" syntax;
wenzelm
parents: 7982
diff changeset
   112
  proof (induct M in rule: multiset_induct);
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
   113
    show "{#} : ?W";
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   114
    proof (rule accI);
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
   115
      fix b; assume "(b, {#}) : ?R";
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
   116
      with not_less_empty; show "b : ?W"; by contradiction;
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   117
    qed;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   118
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
   119
    fix M a; assume "M : ?W";
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
   120
    from wf; have "ALL M:?W. M + {#a#} : ?W";
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
   121
    proof (rule wf_induct [of r]);
7800
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
   122
      fix a;
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
   123
      assume "ALL b. (b, a) : r --> (ALL M:?W. M + {#b#} : ?W)";
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
   124
      show "ALL M:?W. M + {#a#} : ?W";
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   125
      proof;
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
   126
	fix M; assume "M : ?W";
7800
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
   127
	thus "M + {#a#} : ?W";
8ee919e42174 improved presentation;
wenzelm
parents: 7761
diff changeset
   128
          by (rule acc_induct) (rule tedious_reasoning);
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   129
      qed;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   130
    qed;
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7451
diff changeset
   131
    thus "M + {#a#} : ?W"; ..;
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   132
  qed;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   133
qed;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   134
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   135
7761
7fab9592384f improved presentation;
wenzelm
parents: 7565
diff changeset
   136
subsection {* Main result *};
7fab9592384f improved presentation;
wenzelm
parents: 7565
diff changeset
   137
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   138
theorem wf_mult1: "wf r ==> wf (mult1 r)";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   139
  by (rule acc_wfI, rule all_accessible);
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   140
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   141
theorem wf_mult: "wf r ==> wf (mult r)";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   142
  by (unfold mult_def, rule wf_trancl, rule wf_mult1);
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   143
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
   144
end;