data Cat = S | NP | DET | CN | RCN | VP | TV deriving (Eq,Ord,Show) data Structure = Word Cat String | Tree Cat Structure Structure deriving (Eq,Ord,Show)Hier is een definitie van een syntactische structuurboom voor "Barack respects Hilary":
tree1 :: Structure tree1 = Tree S (Word NP "Barack") (Tree VP (Word TV "respects") (Word NP "Hillary"))Maak nu zelf een tree2 definitie voor "some senator hates every democrat".
dict :: [(String,Cat)] dict = [("Barack", NP), ("Hillary", NP), ("respects", TV), ("hates", TV), ("wins", VP), ("loses", VP), ("some", DET), ("every", DET), ("senator", CN),("democrat", CN)]Als een structuurboom (of een verzameling structuurbomen) gegeven is kun je daar zelf een woordenboek uit destilleren. Bij voorbeeld:
Main> wrds tree1 [("Barack",NP),("Hillary",NP),("respects",TV)]Schrijf de functie wrds die dit doet.
Main> check tree1 dict True
data Form = Prop String | Not Form | Conj [Form] | Disj [Form] deriving (Eq,Ord) instance Show Form where show (Prop name) = name show (Not f) = '~' : '(' : show f ++ ")" show (Conj fs) = '&' : show fs show (Disj fs) = 'v' : show fsLet op. Formules van de vorm Conj fs drukken de conjunctie uit van de lijst van formules fs. Formules van de vorm Disj fs drukken de disjunctie uit van de lijst van formules fs. Voorbeelden van formules zijn:
p1 = Prop "p1" ; p2 = Prop "p2" ; p3 = Prop "p3" q1 = Prop "q1" ; q2 = Prop "q2" ; q3 = Prop "q3" r1 = Prop "r1" ; r2 = Prop "r2" ; r3 = Prop "r3" form1 = Disj [p1, Not p1] form2 = Conj [p1, Not p1]Schrijf een functie collectVars die de variabelen uit een formule haalt. Het type is collectVars :: Form -> [String]. Het is de bedoeling dat de lijst van variabelen geen duplikaten bevat. Een paar voorbeeld-aanroepen:
Main> collectVars (Conj [form1, form2]) ["p1"] Main> collectVars (Conj [form1, form2, Not p2, Disj [r1,r2]]) ["p1","p2","r1","r2"]
Schrijf een functie eval :: [(String,Bool)] -> Form -> Bool die propositielogische formules evalueert. Een paar voorbeeld-aanroepen:
Main> eval [("p1",True)] form1 True Main> eval [("p2",True)] form1 Program error: no info about p1 Main> eval [("p1",False)] form1 True
Main> allVals ["p1","p2"] [[("p1",True),("p2",True)],[("p1",True),("p2",False)],[("p1",False),("p2",True)],[("p1",False),("p2",False)]]
NB: vanaf hier zijn de vragen bonusvragen.
Main> tautology form1 True Main> tautology p1 False Main> tautology form1 True Main> tautology form2 False Main> contrad p1 False Main> contrad form1 False Main> contrad form2 True
Main> implies p1 (Disj [p1,p2]) True Main> implies p1 (Conj [p1,p2]) False
Huiswerk: Tekstbestand met alle antwoorden. Let op: de laatste twee vragen zijn bonusvragen. Deadline: maandag 9 juni, 12 uur 's middags. Per email inleveren bij Arno Bastenhof, met een cc naar Jan van Eijck.