src/HOL/Induct/Multiset.thy
author nipkow
Fri, 09 Oct 1998 11:16:04 +0200
changeset 5628 15b7f12ad919
child 6015 d1d5dd2f121c
permissions -rw-r--r--
Multisets at last!
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
use_thy"Multiset";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     9
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    10
*)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    11
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    12
Multiset = Multiset0 + Acc +
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    13
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    14
typedef
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    15
  'a multiset = "{f :: 'a => nat . finite{x . 0 < f x}}" (multiset_witness)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    16
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    17
instance multiset :: (term){ord,plus,minus}
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    18
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    19
consts
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    20
  "{#}"  :: 'a multiset                        ("{#}")
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    21
  single :: 'a                => 'a multiset   ("{#_#}")
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    22
  count  :: ['a multiset, 'a] => nat
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    23
  set_of :: 'a multiset => 'a set
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    24
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    25
syntax
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    26
  elem   :: ['a multiset, 'a] => bool
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    27
translations
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    28
  "elem M a" == "0 < count M a"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    29
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    30
defs
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    31
  count_def  "count == Rep_multiset"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    32
  empty_def  "{#}   == Abs_multiset(%a. 0)"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    33
  single_def "{#a#} == Abs_multiset(%b. if b=a then 1 else 0)"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    34
  union_def  "M+N   == Abs_multiset(%a. Rep_multiset M a + Rep_multiset N a)"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    35
  diff_def  "M-N    == Abs_multiset(%a. Rep_multiset M a - Rep_multiset N a)"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    36
  set_of_def "set_of M == {x. elem M x}"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    37
  size_def "size (M) == setsum (count M) (set_of M)"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    38
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    39
constdefs
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    40
  mult1 :: "('a * 'a)set => ('a multiset * 'a multiset)set"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    41
 "mult1(r) == {(N,M) . ? a M0 K. M = M0 + {#a#} & N = M0 + K &
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    42
                                 (!b. elem K b --> (b,a) : r)}"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    43
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    44
  mult :: "('a * 'a)set => ('a multiset * 'a multiset)set"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    45
 "mult(r) == (mult1 r)^+"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    46
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    47
locale MSOrd =
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    48
  fixes
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    49
    r :: "('a * 'a)set"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    50
    W :: "'a multiset set"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    51
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    52
  assumes
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    53
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    54
  defines
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    55
    W_def       "W == acc(mult1 r)"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    56
end