Declaratieve Talen/Oplossing boom betegelen: verschil tussen versies
Naar navigatie springen
Naar zoeken springen
Geen bewerkingssamenvatting |
(geen verschil)
|
Versie van 14 jun 2006 21:20
Een oplossing:
import List data Boom t = Knoop1 t (Boom t) | Knoop2 t (Boom t) (Boom t) | Blad t deriving Show data Tegel t = Tknoop1 t (Tegel t) | Tknoop2 t (Tegel t) (Tegel t) | Tblad t | Leeg deriving Show tegel::(Eq t)=>Boom t->[Tegel t]->Bool -------------------------------------- tegel boom tegels = let goeieTegels = filter (\x -> controleerTegel boom x) tegels restBomen = [geefRest boom y |y<-goeieTegels] in if ((length goeieTegels)>0) then tegel2 restBomen tegels else False tegel2::(Eq t)=>[ [Boom t] ]->[Tegel t]->Bool --------------------------------------------- tegel2 [] _ = False tegel2 (boomlijst:rest) tegels | length (filter (==False) [tegel x tegels|x<-boomlijst]) == 0 = True | otherwise = tegel2 rest tegels controleerTegel::(Eq t)=>Boom t->Tegel t->Bool ---------------------------------------------- controleerTegel (Blad x) (Tblad y) = x==y controleerTegel (Blad x) (Leeg) = True controleerTegel (Blad x) _ = False controleerTegel (Knoop1 x b) (Tknoop1 y tb) = if (x==y) then controleerTegel b tb else False controleerTegel (Knoop1 _ _) (Leeg) = True controleerTegel (Knoop1 x _) (Tblad y) = x==y controleerTegel (Knoop1 _ _) _ = False controleerTegel (Knoop2 x lb rb) (Tknoop2 y ltb rtb) = if (x==y) then (controleerTegel lb ltb) && (controleerTegel rb rtb) else False controleerTegel (Knoop2 _ _ _) (Leeg) = True controleerTegel (Knoop2 x _ _) (Tblad y) = x==y controleerTegel (Knoop2 _ _ _) _ = False geefRest::(Eq t)=>Boom t->Tegel t->[Boom t] ------------------------------------------- geefRest _ (Tblad y) = [] geefRest w (Leeg) = [w] geefRest (Knoop1 x b) (Tknoop1 y tb) = geefRest b tb geefRest (Knoop2 x lb rb) (Tknoop2 y ltb rtb) =(geefRest lb ltb)++(geefRest rb rtb)