doc-src/Tutorial/Datatype/Trie.thy
author wenzelm
Fri, 16 Jul 1999 22:24:42 +0200
changeset 7024 44bd3c094fd6
parent 5851 15ce4c1c8313
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5851
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
     1
Trie = Main +
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
     2
consts   assoc :: "('key * 'val)list => 'key => 'val option"
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
     3
primrec "assoc [] x = None"
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
     4
        "assoc (p#ps) x =
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
     5
           (let (a,b) = p in if a=x then Some b else assoc ps x)"
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
     6
datatype ('a,'v)trie = Trie ('v option) "('a * ('a,'v)trie)list"
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
     7
consts value :: ('a,'v)trie => 'v option
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
     8
       alist :: "('a,'v)trie => ('a * ('a,'v)trie)list"
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
     9
primrec "value(Trie ov al) = ov"
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
    10
primrec "alist(Trie ov al) = al"
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
    11
consts   lookup :: ('a,'v)trie => 'a list => 'v option
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
    12
primrec "lookup t [] = value t"
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
    13
        "lookup t (a#as) = (case assoc (alist t) a of
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
    14
                              None => None
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
    15
                            | Some at => lookup at as)"
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
    16
consts update :: ('a,'v)trie => 'a list => 'v => ('a,'v)trie
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
    17
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
    18
primrec
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
    19
  "update t []     v = Trie (Some v) (alist t)"
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
    20
  "update t (a#as) v = (let tt = (case assoc (alist t) a of
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
    21
                                    None => Trie None [] | Some at => at)
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
    22
                        in Trie (value t) ((a,update tt as v)#alist t))"
15ce4c1c8313 New section on advanced datatypes.
nipkow
parents:
diff changeset
    23
end