Uživatelské nástroje

Nástroje pro tento web


pitel:izu:uloha2

Úkol 2

rodina.pl
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).
seznamy.pl
%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
/var/www/wiki/data/pages/pitel/izu/uloha2.txt · Poslední úprava: 30. 12. 2022, 13.43:01 autor: 127.0.0.1