src/HOL/Isar_examples/MultisetOrder.thy
author wenzelm
Thu, 02 Sep 1999 15:25:19 +0200
changeset 7443 e5356e73f57a
parent 7442 2d2849258e3f
child 7448 3ee96dccdd39
permissions -rw-r--r--
renamed NatSum to Summation;
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.
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
     6
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
     7
Original tactic script by Tobias Nipkow (see also
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
     8
HOL/Induct/Multiset).  Pen-and-paper proof by Wilfried Buchholz.
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
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    11
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    12
theory MultisetOrder = Multiset:;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    13
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    14
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    15
lemma all_accessible: "wf r ==> ALL M. M : acc (mult1 r)";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    16
proof;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    17
  let ??R = "mult1 r";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    18
  let ??W = "acc ??R";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    19
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    20
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    21
  {{;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    22
    fix M M0 a;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    23
    assume wf_hyp: "ALL b. (b, a) : r --> (ALL M:??W. M + {#b#} : ??W)"
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    24
      and M0: "M0 : ??W"
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    25
      and acc_hyp: "ALL M. (M, M0) : ??R --> M + {#a#} : ??W";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    26
    have "M0 + {#a#} : ??W";
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    27
    proof (rule accI [of "M0 + {#a#}"]);
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    28
      fix N; assume "(N, M0 + {#a#}) : ??R";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    29
      hence "((EX M. (M, M0) : ??R & N = M + {#a#}) |
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    30
             (EX K. (ALL b. elem K b --> (b, a) : r) & N = M0 + K))";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    31
	by (simp only: less_add_conv);
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    32
      thus "N : ??W";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    33
      proof (elim exE disjE conjE);
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    34
	fix M; assume "(M, M0) : ??R" and N: "N = M + {#a#}";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    35
	from acc_hyp; have "(M, M0) : ??R --> M + {#a#} : ??W"; ..;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    36
	hence "M + {#a#} : ??W"; ..;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    37
	thus "N : ??W"; by (simp only: N);
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    38
      next;
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    39
	fix K; assume "ALL b. elem K b --> (b, a) : r" (is "??A a K")
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    40
	  and N: "N = M0 + K";
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    41
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    42
	have "??A a K --> M0 + K : ??W" (is "??P K");
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    43
	proof (rule multiset_induct [of _ K]);
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    44
	  from M0; have "M0 + {#} : ??W"; by simp;
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    45
	  thus "??P {#}"; ..;
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    46
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    47
	  fix K x; assume hyp: "??P K";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    48
	  show "??P (K + {#x#})";
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    49
	  proof;
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    50
	    assume a: "??A a (K + {#x#})";
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    51
	    hence "(x, a) : r"; by simp;
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    52
	    with wf_hyp [RS spec]; have b: "ALL M:??W. M + {#x#} : ??W"; ..;
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    53
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    54
	    from a hyp; have "M0 + K : ??W"; by simp;
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    55
	    with b; have "(M0 + K) + {#x#} : ??W"; ..;
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    56
	    thus "M0 + (K + {#x#}) : ??W"; by (simp only: union_assoc);
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    57
	  qed;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    58
	qed;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    59
	hence "M0 + K : ??W"; ..;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    60
	thus "N : ??W"; by (simp only: N);
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    61
      qed;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    62
    qed;
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    63
  }}; note tedious_reasoning = this;
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
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    66
  assume wf: "wf r";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    67
  fix M;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    68
  show "M : ??W";
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    69
  proof (rule multiset_induct [of _ M]);
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    70
    show "{#} : ??W";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    71
    proof (rule accI);
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    72
      fix b; assume "(b, {#}) : ??R";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    73
      with not_less_empty; show "b : ??W"; by contradiction;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    74
    qed;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    75
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    76
    fix M a; assume "M : ??W";
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    77
    from wf; have "ALL M:??W. M + {#a#} : ??W";
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    78
    proof (rule wf_induct [of r]);
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    79
      fix a; assume "ALL b. (b, a) : r --> (ALL M:??W. M + {#b#} : ??W)";
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    80
      show "ALL M:??W. M + {#a#} : ??W";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    81
      proof;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    82
	fix M; assume "M : ??W";
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    83
	thus "M + {#a#} : ??W"; by (rule acc_induct) (rule tedious_reasoning);
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    84
      qed;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    85
    qed;
7442
2d2849258e3f tidied;
wenzelm
parents: 7432
diff changeset
    86
    thus "M + {#a#} : ??W"; ..;
7432
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    87
  qed;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    88
qed;
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    89
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    90
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    91
theorem wf_mult1: "wf r ==> wf (mult1 r)";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    92
  by (rule acc_wfI, rule all_accessible);
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    93
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    94
theorem wf_mult: "wf r ==> wf (mult r)";
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    95
  by (unfold mult_def, rule wf_trancl, rule wf_mult1);
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    96
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    97
c32a0fd117a0 Wellfoundedness proof for the multiset order (preliminary version).
wenzelm
parents:
diff changeset
    98
end;