Úkol 2

muz(iluvatar). muz(elros). muz(elrond). muz(john). muz(paul). muz(george). muz(ringo). zena(clare). zena(lucy). zena(mary). zena(jane). zena(linda). otec(iluvatar,elrond). otec(iluvatar,elros). otec(elros,clare). otec(elros,lucy). otec(elrond,paul). otec(elrond,george). otec(paul,john). otec(george,mary). otec(john,ringo). otec(john,jane). matka(clare,john). matka(lucy,mary). matka(linda,ringo). matka(mary,jane). rodic(X,Y) :- otec(X,Y). rodic(X,Y) :- matka(X,Y). je_matka(X) :- matka(X,_). %tyto pravidla doplnte sourozenec(X,Y) :- rodic(R, X), rodic(R, Y), X \== Y. teta(X,Y) :- sestra(X , R), rodic(R, Y). sestra(X,Y) :- zena(X), sourozenec(X, Y). deda(X,Y) :- muz(X), rodic(R, Y), rodic(X, R).
%delka linearniho seznamu delka([],0). delka([_|T],S) :- delka(T,SS), S is SS + 1. %je prvek clenem lin. seznamu? jePrvek([X|_],X). jePrvek([_|T],X) :- jePrvek(T,X). %spojeni dvou linearnich seznamu spoj([],L,L). spoj([H|T],L,[H|TT]) :- spoj(T,L,TT). %doplnte nasledujici predikaty %doplnte nasledujici predikaty max(A, B, MAX) :- A>=B, MAX is A. max(A, B, MAX) :- A<B, MAX is B. %otoceni linearniho seznamu %otoc(seznam,seznam) otoc([], []). otoc([H|T], L) :- otoc(T, ZBYTEK), spoj(ZBYTEK, [H], L). %Pozirej hlavicky a ty pak spoj obracene %je prvek clenem obecneho seznamu? %jePrvekOb(prvek,seznam) jePrvekOb(X, [X|_]). %Kdyz je prvek na zacatku seznamu, je urcite prvkem seznamu jePrvekOb(X, [H|_]) :- jePrvekOb(X, H). %Zanor se do hlavicky jePrvekOb(X, [_|T]) :- jePrvekOb(X, T). %Zanor se do zbytku %delka obecneho seznamu %delkaOb(seznam,pocet) delkaOb([], 0). %Delka prazdneho seznamu je 0 delkaOb([H|T], L) :- delkaOb(H, LH), delkaOb(T, LT), L is LH + LT. %Zanor se a secti delky delkaOb(_, 1). %Delka jednoho prvku je 1 %nalezeni maxima v obecnem seznamu prvku typu integer %maximumOb(seznam,maximum) maximumOb(SEZNAM, MAX) :- maximumOb_max(SEZNAM, -9999999999999999999999999, MAX). %Zanor se maximumOb_max([], MAX_AKT, MAX) :- MAX is MAX_AKT. %Kdyz uz dolezu do prazdnyho senamu, bude to maximum maximumOb_max([H|T], MAX_AKT, MAX) :- integer(H), maximumOb_max(T, H, MAX_NEW), max(MAX_AKT, MAX_NEW, MAX). %Zkontroluje integer, pokud je hlavicka vetsi nez aktualni maximum zanori se (viz. minuly predikat) maximumOb_max([H|T], MAX_AKT, MAX) :- maximumOb_max(H, MAX_AKT, MAX_HT), maximumOb_max(T, MAX_HT, MAX). %Rekurze %hloubka zanoreni obecneho seznamu %hloubkaOb(seznam, hloubka) hloubkaOb(SEZNAM, HLOUBKA) :- hloubkaOb_max(SEZNAM, 1, HLOUBKA). %Zavola telo, hloubka prazdneho senznamu je 1 hloubkaOb_max([], HLOUBKA_AKT, HLOUBKA) :- HLOUBKA is HLOUBKA_AKT. %Uz jsem nejhloubs hloubkaOb_max([H|T], HLOUBKA_AKT, HLOUBKA) :- atomic(H), hloubkaOb_max(T, HLOUBKA_AKT, HLOUBKA). %Zanoreni hloubkaOb_max([H|T], HLOUBKA_AKT, HLOUBKA) :- hloubkaOb_max(H, HLOUBKA_AKT+1, HLOUBKA_H), hloubkaOb_max(T, HLOUBKA_AKT, HLOUBKA_T), max(HLOUBKA_H, HLOUBKA_T, HLOUBKA). %Zanor se do hlavicky (+1), zanor se do zbytku, over ze jsme dost hluboko