[SOLVED] module PropSpec

$25

File Name: module_PropSpec.zip
File Size: 141.3 KB

5/5 - (1 vote)

module PropSpec

import Test.Hspec
import Test.HUnit

Copyright By Assignmentchef assignmentchef

import qualified Prop
import Prop (Prop (..), (>), (<->))

import Parser (parse)

isCnf :: Prop a -> Bool
isCnf (p :&: q) = isCnf p && isCnf q
isCnf p = isOr p

isOr :: Prop a -> Bool
isOr (p :|: q) = isOr p && isOr q
isOr p = isLit p

isLit :: Prop a -> Bool
isLit (Lit _) = True
isLit (Neg (Lit _)) = True
isLit _ = False

tests :: Spec
tests = do
describe > $ do
it is defined in terms of Neg and :|: $ do
Lit 0 > Lit 1 @?= Neg (Lit 0) :|: Lit 1
let p = Lit 0 :&: Lit 1
let q = Lit 1 :|: Lit 2
p > q @?= Neg p :|: q
describe <-> $ do
it is defined in terms of > and :&: $ do
Lit 0 <-> Lit 1 @?= (Neg (Lit 0) :|: Lit 1) :&: (Neg (Lit 1) :|: Lit 0)
describe distribute $ do
it correctly computes the base case (no :&: in operands) $ do
Prop.distribute (Lit 0) (Lit 1) @?= Lit 0 :|: Lit 1
let lhs = parse a | b | c | d
let rhs = parse e | f | g | h | j
Prop.distribute lhs rhs @?= lhs :|: rhs
it correctly distributes singles $ do
let lit= parse a
let and = parse b & c
Prop.distribute lit and @?= parse (a | b) & (a | c)
Prop.distribute and lit @?= parse (b | a) & (c | a)
it correctly recursively distributes $ do
let lhs = parse a & b
isCnf (Prop.distribute lhs $ parse c & d)@?= True
isCnf (Prop.distribute lhs $ parse c & d & e)@?= True

let lhs = parse a & b & c
isCnf (Prop.distribute lhs $ parse c & d) @?= True
isCnf (Prop.distribute lhs $ parse c & d & e) @?= True
describe cnf $ do
it keeps literals (and their negation) $ do
Prop.cnf (Lit 0) @?= Lit 0
Prop.cnf (Neg (Lit 0)) @?= Neg (Lit 0)
it removes double negatives $ do
Prop.cnf (Neg (Neg (Lit 0))) @?= Lit 0
it distributes disjuncts (and leaves conjuncts) $ do
let and = parse a & b & c
Prop.cnf (Lit 0 :&: Lit 1) @?= (Lit 0 :&: Lit 1)
Prop.cnf (and :&: and) @?= (and :&: and)

Prop.cnf (Lit 0 :|: Lit 1) @?= (Lit 0 :|: Lit 1)
isCnf (Prop.cnf $ and :|: parse c & d) @?= True
isCnf (Prop.cnf $ and :|: parse c & (d & e)) @?= True
it applies De-Morgans law $ do
Prop.cnf (parse -(p & q)) @?= parse -p | -q
Prop.cnf (parse -(p | q)) @?= parse -p & -q
it recursively applies all cases $ do
isCnf (Prop.cnf $ parse (a & b) | (c & d) | (e & f)) @?= True
isCnf (Prop.cnf $ parse (a & b) | (c & d) | (e & f)) @?= True
isCnf (Prop.cnf $ parse -((a & b) | -((c | d) & (e & f)))) @?= True
isCnf (Prop.cnf $ parse -(-((c | d) & (e & f)) | (a & b))) @?= True

CS: assignmentchef QQ: 1823890830 Email: [email protected]

Reviews

There are no reviews yet.

Only logged in customers who have purchased this product may leave a review.

Shopping Cart
[SOLVED] module PropSpec
$25