packages feed

liquidhaskell-0.8.10.7: tests/ple/pos/MossakaBug.hs

{-@ LIQUID "--reflection"  @-}
{-@ LIQUID "--ple"         @-}
{-@ LIQUID "--short-names" @-}
{-@ LIQUID "--no-termination" @-}

module Bug where 

data Pred 
  = Var String 
  | Not Pred      
  | Or  Pred Pred
  | And Pred Pred

{-@ reflect nnf @-}
nnf :: Pred -> Pred 
nnf (Var p) = Var p
nnf (Not (Not p)) = (nnf p)
nnf (And p q) = And (nnf p) (nnf q)
nnf (Or p q) = Or (nnf p) (nnf q)
nnf (Not (And p q)) = Or (nnf $ Not p) (nnf $ Not q)
nnf (Not (Or p q)) = And (nnf $ Not p) (nnf $ Not q)
nnf (Not (Var v)) = Not (Var v)

{-@ lem_nnf :: s:_ -> p:_ -> { pval p s = pval (nnf p) s } @-}
lem_nnf :: BState -> Pred -> () 
lem_nnf s (Var v) = pval (nnf (Var v)) s 
		`seq` pval (Var v) s
		`seq` () 
lem_nnf s p = undefined

{-@ reflect pval @-}
pval :: Pred -> BState -> Bool
pval (Var x)     s = get s x 
pval (And p1 p2) s = (pval p1 s) && (pval p2 s) 
pval (Or  p1 p2) s = (pval p1 s) || (pval p2 s)
pval (Not p)     s = not (pval p s)

{-@ reflect get @-}
get :: BState -> String -> Bool 
get s x = True

data BState = BS