liquidhaskell-0.8.10.7: benchmarks/cse230/src/Week10/State.hs
{-@ LIQUID "--reflection" @-}
{-@ LIQUID "--ple" @-}
module State where
import Prelude hiding ((++), const, max)
import ProofCombinators
data GState k v = Init v | Bind k v (GState k v)
{-@ reflect init @-}
init :: v -> GState k v
init v = Init v
{-@ reflect set @-}
set :: GState k v -> k -> v -> GState k v
set s k v = Bind k v s
{-@ reflect get @-}
get :: (Eq k) => GState k v -> k -> v
get (Init v) _ = v
get (Bind k v s) key = if key == k then v else get s key
{-@ lemma_get_set :: k:_ -> v:_ -> s:_ -> { get (set s k v) k == v } @-}
lemma_get_set :: k -> v -> GState k v -> Proof
lemma_get_set _ _ _ = ()
{-@ lemma_get_not_set :: k0:_ -> k:{k /= k0} -> val:_ -> s:_
-> { get (set s k val) k0 = get s k0 } @-}
lemma_get_not_set :: k -> k -> v -> GState k v -> Proof
lemma_get_not_set _ _ _ (Bind {}) = ()
lemma_get_not_set _ _ _ (Init {}) = ()