Een matroesjka (Russisch: Матрёшка) is een holle houten pop die onderdeel is van een reeks steeds kleinere in elkaar passende poppen. De poppen kunnen opengemaakt worden met een naad in de “buik”, behalve het kleinste, dat vaak als baby is beschilderd. Een matroesjka bestaat doorgaans uit zeven of acht poppetjes, maar ook andere aantallen komen voor. De prijs van de poppen is afhankelijk van het aantal poppetjes in de set (variërend van vier tot enkele tientallen), de kwaliteit van de afbeelding en de onderwerpen. Het zijn geliefde souvenirs bij de toeristen die Rusland bezoeken.
Er bestaat een hele variëteit aan Matroesjka’s1. Het is dus ook mogelijk, maar zeker niet de bedoeling, om Matroesjka’s van verschillende typen in elkaar te steken om de eigenaar grondig te ergeren.
Schrijf een predicaat ma_clean(+Mess, -Order)
die een lijst van mogelijk verkeerd samengestelde Matroesjka’s neemt en een gesorteerde lijst van correct samengestelde Matroesjka’s teruggeeft.
Een pop van het type Type
met grootte Grootte
waarin een andere pop Kind
zit wordt voorgesteld als: ma(Eigenschappen, Kind)
. Waarbij Eigenschappen
een lijst is met daarin exact 1 voorkomen van type(Type)
en size(Grootte)
. Deze lijst kan ook nog andere elementen bevatten, maar dat is niet belangrijk voor deze opgave. Als een pop geen kind heeft wordt empty
gebruikt als Kind
De afbeelding boven de pijl in bovenstaande afbeelding kan gezien worden als
[
ma([type(rood),size(4)], ma([type(groen),size(3)], empty) ),
ma([size(3),type(blauw)], ma([size(2),type(geel)], empty) ),
ma([type(geel),size(4)], ma([type(geel),size(3)], ma([type(rood),size(2)],empty)) ),
ma([type(blauw),size(4)], ma([type(groen),size(2)], empty) ),
]
Deze moet omgezet worden in
[
ma([type(blauw),size(4)],ma([size(3),type(blauw)],empty)),
ma([type(geel),size(4)],ma([type(geel),size(3)],ma([size(2),type(geel)],empty))),
ma([type(groen),size(3)],ma([type(groen),size(2)],empty)),
ma([type(rood),size(4)],ma([type(rood),size(2)],empty))
]
Als hulp kun je gebruik maken van het vergelijkingspredicaat ma_order(-Pred, +Pop1, +Pop2)
dat voor jullie is gedefinieerd is in deze database2. Om dit predicaat te kunnen gebruiken moet je zelfma_type(+Pop,-Type)
en ma_size(+Pop,-Grote)
implementeren die respectievelijk het type en de grootte een pop ophalen. Deze ma_order/3
zal interessant blijken in combinatie met predsort/3
3. Pas ma_order/3
niet aan, je hoeft het ook niet mee in te dienen.