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)