module FM where
import Nat
--class FiniteMap fm k | fm->k where
class FiniteMap fm where
empty :: v -> fm v
lookup :: fm v -> Nat -> v
update :: Nat -> v -> fm v -> fm v
{-P:
-- Instances are expected to satisfy these properties:
property LookupUpdate =
{| lookup, update |
All k . All k' . All v . All fm1 . All fm2 .
{lookup fm1 k} === {lookup fm2 k} ==>
{lookup (update k' v fm1) k} === {lookup (update k' v fm2) k} |}
property UpdateSame =
{| lookup, update |
All k . All v . All fm . {lookup (update k v fm) k} === v |}
property UpdateOther =
{| lookup, update |
All k1 . All k2 . All v . All fm .
-/ (k1===k2) ==>
{lookup (update k2 v fm) k1} === {lookup fm k1} |}
-}