src/HOL/Induct/Multiset.thy
author wenzelm
Fri, 06 Oct 2000 17:35:58 +0200
changeset 10168 50be659d4222
parent 9659 b9cf6801f3da
permissions -rw-r--r--
final tuning;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     1
(*  Title:      HOL/Induct/Multiset.thy
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     2
    ID:         $Id$
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     3
    Author:     Tobias Nipkow
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     4
    Copyright   1998 TUM
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     5
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     6
A definitional theory of multisets,
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     7
including a wellfoundedness proof for the multiset order.
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     8
*)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     9
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    10
Multiset = Multiset0 + Acc +
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    11
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    12
typedef
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    13
  'a multiset = "{f :: 'a => nat . finite{x . 0 < f x}}" (multiset_witness)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    14
8938
9660ca91828c Multisets have a zero: the empty multiset
paulson
parents: 8915
diff changeset
    15
instance multiset :: (term){ord,zero,plus,minus}
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    16
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    17
consts
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    18
  "{#}"  :: 'a multiset                        ("{#}")
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    19
  single :: 'a                => 'a multiset   ("{#_#}")
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    20
  count  :: ['a multiset, 'a] => nat
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    21
  set_of :: 'a multiset => 'a set
9017
ff259b415c4d Many new theorems about multisets and their ordering, including basic
paulson
parents: 8953
diff changeset
    22
  MCollect :: ['a multiset, 'a => bool] => 'a multiset (*comprehension*)
ff259b415c4d Many new theorems about multisets and their ordering, including basic
paulson
parents: 8953
diff changeset
    23
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    24
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    25
syntax
9017
ff259b415c4d Many new theorems about multisets and their ordering, including basic
paulson
parents: 8953
diff changeset
    26
  elem     :: ['a, 'a multiset] => bool              ("(_/ :# _)" [50, 51] 50)
ff259b415c4d Many new theorems about multisets and their ordering, including basic
paulson
parents: 8953
diff changeset
    27
  "@MColl" :: [pttrn, 'a multiset, bool] => 'a multiset ("(1{# _ : _./ _#})")
8915
80303d9b0d7b Proving that multisets are partially ordered
paulson
parents: 6015
diff changeset
    28
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    29
translations
9017
ff259b415c4d Many new theorems about multisets and their ordering, including basic
paulson
parents: 8953
diff changeset
    30
  "a :# M"     == "0 < count M a"
ff259b415c4d Many new theorems about multisets and their ordering, including basic
paulson
parents: 8953
diff changeset
    31
  "{#x:M. P#}" == "MCollect M (%x. P)"
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    32
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    33
defs
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    34
  count_def  "count == Rep_multiset"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    35
  empty_def  "{#}   == Abs_multiset(%a. 0)"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    36
  single_def "{#a#} == Abs_multiset(%b. if b=a then 1 else 0)"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    37
  union_def  "M+N   == Abs_multiset(%a. Rep_multiset M a + Rep_multiset N a)"
8953
40ae3d4122bd overloaded 0
paulson
parents: 8938
diff changeset
    38
  diff_def   "M-N    == Abs_multiset(%a. Rep_multiset M a - Rep_multiset N a)"
9017
ff259b415c4d Many new theorems about multisets and their ordering, including basic
paulson
parents: 8953
diff changeset
    39
  MCollect_def "MCollect M P ==
ff259b415c4d Many new theorems about multisets and their ordering, including basic
paulson
parents: 8953
diff changeset
    40
		Abs_multiset(%x. if P x then Rep_multiset M x else 0)"
ff259b415c4d Many new theorems about multisets and their ordering, including basic
paulson
parents: 8953
diff changeset
    41
  set_of_def "set_of M == {x. x :# M}"
8953
40ae3d4122bd overloaded 0
paulson
parents: 8938
diff changeset
    42
  size_def   "size (M) == setsum (count M) (set_of M)"
40ae3d4122bd overloaded 0
paulson
parents: 8938
diff changeset
    43
  Zero_def   "0 == {#}"
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    44
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    45
constdefs
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    46
  mult1 :: "('a * 'a)set => ('a multiset * 'a multiset)set"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    47
 "mult1(r) == {(N,M) . ? a M0 K. M = M0 + {#a#} & N = M0 + K &
9017
ff259b415c4d Many new theorems about multisets and their ordering, including basic
paulson
parents: 8953
diff changeset
    48
                                 (!b. b :# K --> (b,a) : r)}"
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    49
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    50
  mult :: "('a * 'a)set => ('a multiset * 'a multiset)set"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    51
 "mult(r) == (mult1 r)^+"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    52
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    53
locale MSOrd =
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    54
  fixes
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    55
    r :: "('a * 'a)set"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    56
    W :: "'a multiset set"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    57
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    58
  defines
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    59
    W_def       "W == acc(mult1 r)"
8915
80303d9b0d7b Proving that multisets are partially ordered
paulson
parents: 6015
diff changeset
    60
80303d9b0d7b Proving that multisets are partially ordered
paulson
parents: 6015
diff changeset
    61
defs
80303d9b0d7b Proving that multisets are partially ordered
paulson
parents: 6015
diff changeset
    62
  mult_less_def  "M' < M  ==  (M',M) : mult {(x',x). x'<x}"
80303d9b0d7b Proving that multisets are partially ordered
paulson
parents: 6015
diff changeset
    63
  mult_le_def    "M' <= M  ==  M'=M | M' < (M :: 'a multiset)"
80303d9b0d7b Proving that multisets are partially ordered
paulson
parents: 6015
diff changeset
    64
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    65
end