IB015 – Domácí úkol Domácí úkol 11 Příklad 11.1 Jedenáctý domácí úkol se opět skládá ze dvou částí, implementační a detektivní. Implementační část Ve studijních materiálech naleznete databázi faktů v jazyce Prolog, která reprezentuje rodinné vztahy a platy jednotlivých osob. Konkrétně se jedná o predikát parent/2, který reprezentuje, že osoba v prvním argumentu je rodičem osoby v argumentu druhém, a predikát wage/2, který reprezentuje, že číslo ve druhém argumentu je plat osoby v argumentu prvním. Například (část z výše zmíněného souboru): parent(ivan, tomas). parent(jana, tomas). parent(tomas, alena). wage(ivan, 10). wage(tomas, 40). wage(jana, 20). Vaším úkolem bude napsat predikáty descendantList/1 a wageSum/2 specifikované takto: • Predikát descendantList/1 uspěje, pokud seznam v prvním argumentu reprezentuje rodovou linii. Konkrétně uspěje právě tehdy, když každé dvě po sobě následující osoby v seznamu jsou v relaci parent/2 (tedy pro každý prvek seznamu X a jeho bezprostředního následníka Y musí platit parent(X, Y)). Například tyto dotazy uspějí: – ?- descendantList([]). – ?- descendantList([ivan]). – ?- descendantList([ivan, tomas]). – ?- descendantList([tomas, alena]). – ?- descendantList([ivan, tomas, alena]). 1 IB015 – Domácí úkol A tyto dotazy neuspějí: – ?- descendantList([alena, ivan]). – ?- descendantList([ivan, jana]). • Predikát wageSum/2 reprezentuje součet platů seznamu osob. Konkrétně uspěje právě tehdy, když číslo ve druhém argumentu je součtem platů všech osob ze seznamu v argumentu prvním. Například tyto dotazy uspějí: – ?- wageSum([], 0). – ?- wageSum([ivan], 10). – ?- wageSum([ivan, jana], 30). – ?- wageSum([ivan, ivan], 20). Pokud chcete za tuto část získat plný počet bodů, predikát descendantList/1 musí fungovat v módu descendantList(?) a predikát wageSum/2 musí fungovat v módu wageSum(+, ?). Detektivní část S pomocí interpretu jazyka Prolog a predikátů implementovaných v předchozí části najděte: • všechny rodové linie, které mají součet platů právě 100, • všechny rodové linie, které mají součet platů větší než 200. Poznámky k odevzdání Odevzdejte jeden .pl soubor do příslušné odevzdávárny. Ve hlavičce souboru uveďte jméno, UČO a skupinu řešitele. V první části souboru implementujte všechny požadované funkce. Nezapomeňte váš zdrojový kód okomentovat. V souboru prosíme nechte uvedené definice predikátů parent/2 a wage/2. Ve druhé části jako komentář1 uveďte všechny rodové linie splňující daná zadání a popište, jak jste při jejich zjišťování postupovali (včetně použitých příkazů interpretu). Odpovědi na druhou část bez příšlušných příkazů interpretu nebudou uznány. Za vaše řešení můžete dostat i desetinné body, pokud například implementujete jen část požadovaných funkcí. 1 V Prologu je komentář uvozen značkou % 2