lab9
unknown
haskell
2 years ago
3.2 kB
2
Indexable
import Data.List (nub) import Data.Maybe (fromJust) type Nume = String data Prop = Var Nume | F | T | Not Prop | Prop :|: Prop | Prop :&: Prop | Prop :->: Prop | Prop :<->: Prop deriving (Eq, Read) infixr 2 :|: infixr 3 :&: p1 :: Prop p1 = (Var "P" :|: Var "Q") :&: (Var "P" :&: Var "Q") p2 :: Prop p2 = (Var "P" :|: Var "Q") :&: (Not (Var "P") :&: Not (Var "Q")) p3 :: Prop p3 = (Var "P" :&: (Var "Q" :|: Var "R")) :&: ((Not (Var "P") :|: Not (Var "Q")) :&: (Not (Var "P") :|: Not (Var "R"))) instance Show Prop where show (Var x) = x show F = "F" show T = "T" show (Not p) = "(~" ++ show p ++ ")" show (p :|: q) = "(" ++ show p ++ "|" ++ show q ++ ")" show (p :&: q) = "(" ++ show p ++ "&" ++ show q ++ ")" show (p :->: q) = "(" ++ show p ++ "->" ++ show q ++ ")" show (p :<->: q) = "(" ++ show p ++ "<->" ++ show q ++ ")" test_ShowProp :: Bool test_ShowProp = show (Not (Var "P") :&: Var "Q") == "((~P)&Q)" type Env = [(Nume, Bool)] impureLookup :: Eq a => a -> [(a,b)] -> b impureLookup a = fromJust . lookup a eval :: Prop -> Env -> Bool eval (Var x) e = impureLookup x e eval (p :|: q) e = eval p e || eval q e eval (p :&: q) e = eval p e && eval q e eval (Not p) e = not (eval p e) eval T _ = True eval F _ = False eval (p :->: q) e = not (eval p e) || eval q e eval (p :<->: q) e = eval p e == eval q e test_eval = eval (Var "P" :|: Var "Q") [("P", True), ("Q", False)] == True variabile :: Prop -> [Nume] variabile (Var x) = [x] variabile (p :|: q) = variabile p ++ variabile q variabile (p :&: q) = variabile p ++ variabile q variabile (Not p) = variabile p variabile T = [] variabile F = [] variabile (p :->: q) = variabile p ++ variabile q variabile (p :<->: q) = variabile p ++ variabile q test_variabile = variabile (Not (Var "P") :&: Var "Q") == ["P", "Q"] envs :: [Nume] -> [Env] envs [] = [[]] envs (x:xs) = [(x, False) : e | e <- envs xs] ++ [(x, True) : e | e <- envs xs] test_envs = envs ["P", "Q"] == [ [ ("P",False) , ("Q",False) ] , [ ("P",False) , ("Q",True) ] , [ ("P",True) , ("Q",False) ] , [ ("P",True) , ("Q",True) ] ] satisfiabila :: Prop -> Bool satisfiabila p = any (\e -> eval p e) (envs (variabile p)) test_satisfiabila1 = satisfiabila (Not (Var "P") :&: Var "Q") == True test_satisfiabila2 = satisfiabila (Not (Var "P") :&: Var "P") == False valida :: Prop -> Bool valida p = all (\e -> eval p e) (envs (variabile p)) test_valida1 = valida (Not (Var "P") :&: Var "Q") == False test_valida2 = valida (Not (Var "P") :|: Var "P") == True echivalenta :: Prop -> Prop -> Bool echivalenta p q = all (\e -> eval p e == eval q e) (envs (variabile (p :|: q))) test_echivalenta1 = True == (Var "P" :&: Var "Q") `echivalenta` (Not (Not (Var "P") :|: Not (Var "Q"))) test_echivalenta2 = False == (Var "P") `echivalenta` (Var "Q") test_echivalenta3 = True == (Var "R" :|: Not (Var "R")) `echivalenta` (Var "Q" :|: Not (Var "Q"))
Editor is loading...