

% ovladani programu
% halt consult

% priklad dat. struktury pro reprezentaci obecneho grafu:
g([v(1,b),v(2,a),v(3,c),v(4,g)],[e(1,2),e(2,3),e(2,4),e(3,4)]).
% je to primo z definice, u predikatu v je prvnim argumentem id a druhe hodnota, e spojuje id vrcholu
% strom vypada treba takto:
t(t(nil,1,nil),2,t(nil,3,nil)).
%


% fakta nemusi byt primo v databazi, muzeme si je tvorit dynamicky behem dotazu
% je dobre pouzivat u slozitejsich metod, protoze program je jednak lepe citelnejsi a jednak se tim da formalne verifikovat vstup nekterych procedur.
% napriklad muzu mit proceuduru zpracujdatum(X), kde X je tvaru datum(D,M,R), tj zapisi to ve tvaru zpracujdatum(datum(D,M,R)) a mam osetreno, ze mi tam neda nikdo jiny objekt (treba muz/1)
%vytvareni struktur je snadne
% vytvordatum(X,Y,Z,datum(X,Y,Z)).



% mame vlastni seznam v notaci l(a,l(b,nil)) (odpovidaji [a,b])
%preved(?L1,?L2) - prevede muj seznam L1 na normalni seznam L2
preved([],nil).
preved([X|L1],l(X,L2)):-preved(L1,L2).

%insert(?X,?L1,?L2) - seznam L2 vznikne nedeterministickym pridanim X (tj. pri strednikovani se pridava na ruzna mista)
insert(X,L,[X|L]).
insert(X,[Y|L],[Y|L1]):- insert(X,L,L1).

% nasleduje par [prikladu na unifikaci, je dobre si zkusit napsat, co vyhodi prolog a pak teprve vyraz vyhodnotit.
% prekopirovat primo do shellu
% p(X,a)=q(b,a).
% p(X,a)=p(b,a).
% p(X,g(Y))=p(a(Z),Z).
% p(X,g(Z),X)=p(f(Y),Y,W).
% jeste neco na seznamech, at si clovek uvedomi, co je co
% [a,b,c,d]=[H|T].
% [a,b,c]=[A,b|T].
% [a|T]=[a,b,c].
% [a,[]]=[A,B|T].
% [Jedna]=[dva|[]].
% [a,b,c]=[A,T]
% X=f(X) - tohle je zrovna v swi prologu osetreno, ale standardne to spadne s pretecenim zasobniku

% mame-li dlouhy seznam, vypise se nam defaulten 10 znaku, muzeme to zvysit pomoci predikatu set_prolog_flag/1, konkretne option max_depth
% set_prolog_flag(toplevel_print_options, [quoted(true), portray(true), max_depth(100), priority(699)]).

% rozdat: priklad trace a spy

% par prikladku na procviceni praci se seznamy
% sudyseznam(L) - uspeje, pokud ma L sudy pocet prvku
sudyseznam([]).
sudyseznam([_,_|L]):-sudyseznam(L).

%rozdel(L,Li,Su) - rozdeli L na seznamy Li a Su (Li jsou liche prvky a Su sude)
rozdel([],[],[]).
rozdel([X],[X],[]).
rozdel([X,Y|L],[X|Li],[Y|Su]):-rozdel(L,Li,Su).
% jak by vypadala procedura rozdel, kdybychom chteli pristupovat vzdy jen k jednomu prvku?

c(nula,0).
c(jedna,1).
c(dva,2).
c(tri,3).
c(ctyri,4).
c(pet,5).
c(sest,6).
c(sedm,7).
c(osm,8).
c(devet,9).

% translate(?L1,?L2) - prelozi cisla z L1 na jejich slovni ekvivalenty z L2
translate([],[]).
translate([X|L1],[Y|L2]):-c(X,Y),translate(L1,L2).
% co kdyz prohodim prediakty c a translate?
% velmi uzitecny postup napr. pro testovaci data

% magsq(A,...I) - vytvori magicky ctverec 3x3
magsq(L):-L=[X11,X12,X13,X21,X22,X23,X31,X32,X33],uni(X11,X12,X13),
	uni(X21,X22,X23),
	uni(X31,X32,X33),
	uni(X11,X21,X31),
	uni(X12,X22,X32),
	uni(X13,X23,X33).

cislo(1). cislo(2). cislo(3).
	
uni(A,B,C):-cislo(A),cislo(B),A\=B,cislo(C),A\=C,B\=C.

