dolezity(ZAMESTNANEC) :- veduci(ZAMESTNANEC, _). dieta(DIETA, RODIC) :- rodic(RODIC, DIETA). matka(MATKA, DIETA) :- rodic(MATKA, DIETA), zena(MATKA). syn(SYN, RODIC) :- rodic(RODIC, SYN), muz(SYN). stary_rodic(STARKY, VNUCA) :- rodic(STARKY, DIETA), rodic(DIETA, VNUCA). brat(BRAT, SURODENEC) :- rodic(RODIC, BRAT), rodic(RODIC, SURODENEC), muz(BRAT), rozne(BRAT, SURODENEC). stryko(STRYKO, DIETA) :- rodic(RODIC, DIETA), muz(RODIC), brat(STRYKO, RODIC). predok(PREDOK, POTOMOK) :- rodic(PREDOK, POTOMOK). predok(PREDOK, POTOMOK) :- rodic(PREDOK, X), predok(X, POTOMOK). sikovny(X):- studuje(X, Y), softverove_inzinierstvo(Y). studuje(peter, flp). studuje(jana, ma1). softverove_inzinierstvo(flp). matematika(ma1). kategoria(citrokola, nealko). kategoria(vino, lahky_alkohol). kategoria(pivo, lahky_alkohol). kategoria(whisky, tvrdy_alkohol). vek(martin, 25). vek(pavol, 15). vek(julia, 20). vek(maria, 21). predaj(OSOBA, NAPOJ) :- kategoria(NAPOJ, tvrdy_alkohol), vek(OSOBA, VEK), VEK >= 21. predaj(OSOBA, NAPOJ) :- kategoria(NAPOJ, lahky_alkohol), vek(OSOBA, VEK), VEK >= 18. predaj(OSOBA, NAPOJ) :- kategoria(NAPOJ, nealko). cesta(X, Y) :- priama_cesta(X, Y). cesta(X, Y) :- priama_cesta(X, Z), cesta(Z, Y). den_v_tyzdni(pondelok). den_v_tyzdni(utorok). den_v_tyzdni(streda). den_v_tyzdni(stvrtok). den_v_tyzdni(piatok). den_v_tyzdni(sobota). den_v_tyzdni(nedela). spolocny_nadriadeny(Z1, Z2, NADRIADENY) :- veduci(NADRIADENY, Z1), veduci(NADRIADENY, Z2). pracovnik(mrkvicka, % meno kivt, % katedra asistent, % pracovne zaradenie 12, % odpracovane roky 1000). % plat ma_rad(emil, X) :- jedlo(X). jedlo(jablko). jedlo(kura). jedlo(X) :- zjedol(Y,X), zije(Y). zjedol(peter, banan). zije(peter). ma_rad(juraj, X) :- jedlo(X), chut(X, sladka). chut(citron, kysla). chut(cokolada, sladka). jedlo(citron). jedlo(cokolada). vertikal(ciara(bod(X, _), bod(X, _))). horizontal(ciara(bod(_, Y), bod(_, Y))). stru(rodic(_,_)). zoznam([]). zoznam([_|_]). zoznam2([]). zoznam2([_|T]) :- zoznam2(T). tri_prvky([_,_,_]). sublist(X, L) :- spoj(L1, _, L), % L1 je prefix L taky, spoj(_, X, L1). % ze X je sufix L1 spoj([], L, L). spoj([X|T1], L2, [X|T]) :- spoj(T1, L2, T). last([X], X). last([_|T], X) :- last(T, X). butlast([_], []). butlast([X|T], [X|ShrtT]) :- butlast(T, ShrtT). postfix([], X, [X]). postfix([H|T], X, [H|LngT]) :- postfix(T, X, LngT). last2(L, X) :- spoj(_, [X], L). butlast2(L, ShrtL) :- spoj(ShrtL, [_], L). postfix2(L, X, LngL) :- spoj(L, [X], LngL). subset1([], L). subset1([X|L1], L2) :- member_my(X, L2), subset1(L1, L2). member_my(X, [X | _]). member_my(X, [_ | Tail]) :- member_my(X, Tail). % relacia podmnozina, v ktorej vsak subset_aux([],[]). % zalezi na poradi prvkov subset_aux(S, [H|T]) :- subset_aux(R,T), % existuje podmnozina R taka, ze ( S = R % S je R ; % alebo S = [H|R] ). % S je R spolu s hlavou druheho argumentu set_equal(Set1, Set2) :- % rovnost mnozin (nezalezi na poradi) permutacia(Set1, Set2). permutacia([],[]). permutacia(L, [H|T]) :- del(H,L,R), permutacia(R,T). del(X, [X|T], T). del(X, [Y|T], [Y|T1]) :- del(X, T, T1). subset2(Set1, Set2) :- subset_aux(X, Set2), set_equal(X, Set1). del_all([], [], _). del_all([H|T1], T2, H) :- del_all(T1, T2, H). del_all([H|T1], [H|T2], X) :- del_all(T1, T2, X). del_all2([H|T1], [H|T2], X) :- H \= X, del_all2(T1, T2, X). preklad_chyby(1, integer_overflow). preklad_chyby(2, division_by_zero). preklad_chyby(3, unknown_identifier). parny([]). parny([_,_|L]) :- parny(L). preklad([], []). preklad([S_head | S_tail], [E_head | E_tail]) :- slovnik(S_head, E_head), preklad(S_tail, E_tail). slovnik(jozef, joe). slovnik(pije, drinks). slovnik(mlieko, milk). porovnaj(List, Element) :- spoj(T, [Element | T], List). sumy([], 0, 0). sumy([H|T], Nova_kladna, Zaporna) :- H >= 0, sumy(T, Kladna, Zaporna), Nova_kladna is Kladna + H. sumy([H|T], Kladna, Nova_zaporna) :- H < 0, sumy(T, Kladna, Zaporna), Nova_zaporna is Zaporna + H. gcd(X, X, X). gcd(X, Y, D) :- X < Y, Y1 is Y - X, gcd(X, Y1, D). gcd(X,Y,D) :- Y < X, gcd(Y, X, D). max([X], X). max([X | T], Max) :- max(T, Y), ( Y >= X, Max = Y ; Y < X, Max = X ). faktorial(0, 1). faktorial(N, F) :- faktorial(N1, F1), N is N1 + 1, F is N * F1. pocitaj_kladne2([],0). pocitaj_kladne2([H|T], N) :- number(H), H >= 0, pocitaj_kladne2(T, NT), N is NT + 1. pocitaj_kladne2([H|T], N) :- number(H), H < 0, pocitaj_kladne2(T, N). pocitaj_kladne([H|T], N) :- not(number(H)), pocitaj_kladne2(T, N). pocitaj_kladne3([H|T], N) :- pocitaj_kladne3(H, N1), pocitaj_kladne3(T, N2), N is N1 + N2. pocitaj_kladne3(E, 1) :- number(E), E >= 0. pocitaj_kladne3(_, 0). parne([], []). parne([H|T], [H|T1]) :- 0 is H mod 2, parne(T, T1). parne([H | T], T1) :- 1 is H mod 2, parne(T, T1). pocitaj_parne([], 0). pocitaj_parne([H|T], N) :- 0 is H mod 2, pocitaj_parne(T, M), N is M + 1. pocitaj_parne([H|T], N) :- 1 is H mod 2, pocitaj_parne(T, N). hladaj_parne(X, [X|_]) :- 0 is X mod 2. hladaj_parne(X, [_|T]) :- hladaj_parne(X, T). redukuj_zoznamy([L], L). redukuj_zoznamy([L|T], X) :- redukuj_zoznamy(T, Y), spoj(L, Y, X). % pozri riesenie cvicenia 6-5 redukuj_zoznamy2([L], L). redukuj_zoznamy2([L|T], X) :- redukuj_zoznamy2(L, LY), redukuj_zoznamy2(T, TY), spoj(LY, TY, X). redukuj_zoznamy2(X, [X]). pridaj(X, L, L) :- member(X, L), !. pridaj(X, L, [X | L]). pridaj2(X, L1, L2) :- member(X, L), !, L1 = L2. pridaj2(X, L, [X | L]). znamka(Body, Z) :- Body >= 92, !, Z = 'Vyborne'. znamka(Body, Z) :- Body >= 76, !, Z = 'Velmi dobre'. znamka(Body, Z) :- Body >= 62, !, Z = 'Dobre'. znamka(Body, 'Nedostatocne'). not_equal(X, Y) :- X == Y, !, fail. not_equal(_, _). d_member(X, [H | _]) :- d_member(X, H). d_member(X, [_ | T]) :- d_member(X, T). d_member(X, X) :- not(zoznam2(X)). vypis_zoznam([]). vypis_zoznam([H|T]) :- write(H), vypis_zoznam(T). vypis_zoznam2([]). vypis_zoznam2([H|T]) :- vypis_zoznam2(T), write(H). :- op(800, xf, kg). :- op(850, yfx, plus). :- op(800, xf, gram). :- op(900, xfx, sa_rovna). :- op(800, xf, libra). :- op(600, fx, pan). :- op(600, fx, panovi). :- op(600, fx, pani). :- op(650, xfx, je_veduci). :- op(650, xfx, je_veduca). zobraz_subor(Subor) :- see(Subor), sprac_obsahu(0), seen. sprac_obsahu(N) :- % N znaci aktualne cislo riadka read(Term), vypis_termu(Term, N), N1 is N + 1, sprac_obsahu(N1). sprac_obsahu(_). vypis_termu(end_of_file, _) :- !, fail. vypis_termu(Term, N) :- write(N), tab(1), write(Term), nl. vytvor_student(VstS, VystS, Student) :- see(VstS), tell(VystS), repeat, read(Term), ( Term = end_of_file, !, seen, told ; Term = student(_,Student, _,_), write(Term), write('.'), nl, % ukoncenie termu fail ). najdi(Subor, Term) :- see(Subor), read(NTerm), spracuj_subor(Term, NTerm), seen. spracuj_subor(_, end_of_file) :- !. % koniec spracuj_subor(Term, NTerm) :- vypis(Term, NTerm), read(Dalsi), spracuj_subor(Term, Dalsi). vypis(Term, Term) :- !, write(Term), nl. % podobaju sa vypis(_, _). % inak mocnina :- write('Zadajte cislo: '), read(X), spracuj(X). spracuj(stop) :- !. spracuj(N) :- mocnina(N, C), write('Druha mocnina cisla '), write(N), write(' je '), write(C), nl, mocnina. spracuj(_) :- mocnina. % zadane ine ako cislo alebo atom stop mocnina(N, C) :- number(N), C is N * N. mocnina2 :- repeat, write('Zadajte cislo: '), read(N), ( N = stop, ! ; mocnina(N, C), write('Druha mocnina cisla '), write(N), write(' je '), write(C), nl, fail ). mocnina2. uloz_student(Subor, Student) :- see(Subor), read(Term), spracuj_student(Term, Student), seen. spracuj_student(end_of_file, _) :- !. spracuj_student(student(I, S, P, Z), S) :- !, assertz(student(I, S, P, Z)), read(Novy), spracuj_student(Novy, S). spracuj_student(_, S) :- read(Novy), spracuj_student(Novy, S). uloz_student2(Subor, Student) :- see(Subor), repeat, read(Term), ( Term = end_of_file, !, seen ; Term = student(_, Student, _, _), assertz(Term), fail ). uloz_student3(Subor, Student) :- see(Subor), repeat, read(Term), ( Term = end_of_file, !, seen ; Term = student(_, Student, _, _), not(Term), assertz(Term), fail ). student_strukt_do_zoznamu(VystS) :- tell(VystS), repeat, student(I, S, P, Z), write([I, S, P, Z]), write('.'), nl, retract(student(I, S, P, Z)), fail ; told. setq(Symbol, Value, Evaluated_Value) :- atom(Symbol), eval(Value, Evaluated_Value), SymbolV =.. [Symbol, Evaluated_Value], assertz(SymbolV). set(Symbol, Evaluated_Value, Evaluated_Value) :- atom(Symbol), SymbolV =.. [Symbol, Evaluated_Value], assertz(SymbolV). defun(Fun_Name, Args, Form, Fun_Name) :- append(Args, [Value], ArgV), Head =.. [Fun_Name| ArgV], assertz((Head :- eval(Form, Value))). student_zoznam_do_strukt(VstS) :- see(VstS), repeat, read(Term), ( Term = end_of_file, !, seen ; Strukt =.. [student|Term], assertz(Strukt), fail ). vytvor_student :- nacitaj('Identifikacne cislo: ', I, interval(I,1,1000)), nacitaj('Meno: ', M, atom(M)), nacitaj('Predmet: ', P, atom(P)), nacitaj('Znamka: ', Z, member(Z,[vyborne,velmi_dobre,dobre,nedostatocne])), assertz(student(I, M, P, Z)), dalej('ano/nie?:', vytvor_student). % pokracovat? vytvor_student. nacitaj(Text, Term, Test) :- write(Text), read(Term), call(Test), !. % spravny vstup nacitaj(Text, Term, Ohranicenie) :- % znovu nacitaj(Text, Term, Ohranicenie). interval(I, From, To) :- I >= From, I =< To. dalej(Text, Ciel) :- % splni sa iba pri nacitani termu ano write(Text), read(ano), call(Ciel).