doc-src/Tutorial/Datatype/Trie.thy
changeset 15338 08519594b0e4
parent 15337 628d87767434
child 15339 a7b603bbc1e6
equal deleted inserted replaced
15337:628d87767434 15338:08519594b0e4
     1 Trie = Main +
       
     2 consts   assoc :: "('key * 'val)list => 'key => 'val option"
       
     3 primrec "assoc [] x = None"
       
     4         "assoc (p#ps) x =
       
     5            (let (a,b) = p in if a=x then Some b else assoc ps x)"
       
     6 datatype ('a,'v)trie = Trie ('v option) "('a * ('a,'v)trie)list"
       
     7 consts value :: ('a,'v)trie => 'v option
       
     8        alist :: "('a,'v)trie => ('a * ('a,'v)trie)list"
       
     9 primrec "value(Trie ov al) = ov"
       
    10 primrec "alist(Trie ov al) = al"
       
    11 consts   lookup :: ('a,'v)trie => 'a list => 'v option
       
    12 primrec "lookup t [] = value t"
       
    13         "lookup t (a#as) = (case assoc (alist t) a of
       
    14                               None => None
       
    15                             | Some at => lookup at as)"
       
    16 consts update :: ('a,'v)trie => 'a list => 'v => ('a,'v)trie
       
    17 
       
    18 primrec
       
    19   "update t []     v = Trie (Some v) (alist t)"
       
    20   "update t (a#as) v = (let tt = (case assoc (alist t) a of
       
    21                                     None => Trie None [] | Some at => at)
       
    22                         in Trie (value t) ((a,update tt as v)#alist t))"
       
    23 end