Declaratieve Talen/Oplossing formule boom: verschil tussen versies

Uit Wina Examenwiki
Naar navigatie springen Naar zoeken springen
Beau (overleg | bijdragen)
Oplossing: opmerking code
Beau (overleg | bijdragen)
(geen verschil)

Versie van 16 jun 2006 14:44

Oplossing

   form1 = (Of (En (Niet 'a') (Niet 'b')) (En (Wel 'a') (Niet 'c')))
   tree1 = (Node 'a' (Node 'b' (Blad True) (Blad False))
                     (Node 'c' (Blad True) (Blad False)))
   
   tree2 = (Node 'a' (Node 'b' (Blad True) (Blad False))
                     (Node 'c' (Blad False) (Blad False)))
   
   data Boom t = Node t (Boom t) (Boom t)
                   | Blad Bool deriving Show
   
   data Formule t = En (Formule t) (Formule t)
                   | Of (Formule t) (Formule t)
                   | Niet t
                   | Wel t
                   deriving Show
   
   boom_is_formule :: (Eq t) => (Boom t) -> (Formule t) -> Bool
   boom_is_formule boom formule = verdiep boom formule []
    
   verdiep :: (Eq t) => (Boom t) -> (Formule t) -> [(t, Bool)] -> Bool
   verdiep (Node var l r) formule waarden =
           (verdiep l formule (waarden ++ [(var, False)]))
                   && (verdiep r formule (waarden ++ [(var, True)]))
   verdiep (Blad False) formule waarden =
           berekenFormule formule waarden == False
   verdiep (Blad True) formule waarden =
           berekenFormule formule waarden == True


   berekenFormule :: (Eq t) => (Formule t) -> [(t, Bool)] -> Bool
   berekenFormule (En a b) waarden =
           (berekenFormule a waarden) && (berekenFormule b waarden)
   berekenFormule (Of a b) waarden =
           (berekenFormule a waarden) || (berekenFormule b waarden)
   berekenFormule (Niet a) waarden =
           let waarde = [y | (x,y) <- waarden, x==a]
           in
                   if (length(waarde) == 1) then
                           [y | (x,y) <- waarden, x==a] == [False]
                   else
                           False
   
   berekenFormule (Wel a) waarden =
           let waarde = [y | (x,y) <- waarden, x==a]
           in
                   if (length(waarde) == 1) then
                           [y | (x,y) <- waarden, x==a] == [True]
                   else
                           False

Is die controle lengte(waarde)==1 nodig? Bij een correcte boom kan x maar één maal voorkomen. De code wordt dan gewoon:

berekenFormule (Niet a) waarden =
          [y | (x,y) <- waarden, x==a] == [False]
                  
berekenFormule (Wel a) waarden =
         [y | (x,y) <- waarden, x==a] == [True]

--Beau 16 jun 2006 16:43 (CEST)