PROLOG: Hladovym algoritmem pomoci heuristiky najit minimalne obarbeni grafu.
obarvi([],_,[],_).
obarvi([(I-J)|T],Uz,[(J-N)|Z],Max):-otoc([(I-J)|T],J,OTOC),seznamMax(Max,Z),zjistiMinBarvu(J,OTOC,Uz,Z,N),dejdoUZ((J-N),Uz),maximum(Max,N,Max1),obarvi(T,Uz,Z,Max1).
zjistiMinBarvu(_,[],Z,N):-minimum(Z,N).
zjistiMinBarvu(J,[(I-J)|T],Uz,Z,N):-member(I,UZ),barva(I,Uz,F),delete(Z,F,Z1),zjistiMinBarvu(J,T,Uz,Z1,N).
% otoc-otoci hrany tak aby koncili J
% minimum najde min ze seznamu nebo M
% seznamMax vrati seznam [1..Max]
Pozn.: Neni to uplne hladovy algoritmus, najdem vsechny barvy kteryma muzeme barvit a vyberem tu nejmensi, ale hricovi to nevadilo
Druhe reseni vic hladovejsi
zjistiBarvu(S,T,X,X):-jde(S,T,X).
zjistiBarvu(S,T,X,N):- X1 is X+1, zjistiBarvu(S,T,X1,N).
jde([],_,_).
jde([S|Z],T,X):-notmenber((S-X),T), jde(Z,T,X).
barvy([],X,X).
barvy([[V|ZS]|Z],T,X):-zjistiBarvu(ZS,T,1,N),barvy(Z,[(V-N)|T],X).
Prolog 2: Z postfixneho zapisu n-arniho stromu rekonstruovat n-arny strom. Vstup [B-0,E-0,F-0,C-2,D-0,A-3]
rekonstrukce(Vstup,Strom):-reverse(Vstup,Vystup), makeTree(Vystup,_,Strom).
makeTree ( [ Val-0|T], T, t(Val,[]) ).
makeTree ( [Val-N|T], Z, t(Val, Childs) ) :- makeChild ( T, N, Z, Childs ).
makeChild ( T, 0, T, [] ).
makeChild ( T, N, Z, [C|Childs] ) :- makeTree ( T, Zb, C ),N1 = N – 1,
makeChild ( Zb, N1, Z, Childs).
Pozn.: Celkem ok ale drobnost nezachovava poradi synu!!
Haskell 3: V orientovanem acyklickem grafu vyskrtat hrany[u,v] pokud mezi vrcholy u a v existuje cesta delky 2.
vstup je seznam hran. Hrana je dvojprvkovy seznam napr [[1,4],[2,3],[3,4],[4,5]]
proskrtej hrany = gen hrany hrany
gen [] _ = []
gen (x:xs) hrany| projdi x vrcholy hrany = gen xs hrany| otherwise = x: g xs hrany
projdi _ [] _ = False
projdi [x,y] [a:as] hrany| (member [x,a] hrany) && (member [a,y] hrany) = True| otherwise = projdi [x,y] as hrany
Pozn.: neefektivni protoze se porad prochazeji hrany - lepsi reseni nagenerovat seznam naseledniku a predchudcu pro vsechny vrcholy
Haskell 4: Na vstupu mame obdelniky(okna), mame zistit jestli nejake prekryvaji.
type Rozmer = (Int,Int)
type Obd = (Int,Int,Rozmer)
data Maybe a = Nothing | Just a
Ulohou bylo napsat funkci:
prekryvaji :: [Obd] ->Maybe (Obd,Obd) //dostane okna a vrati kolidujici dvojci
Nevedel sem co je Maybe tak sem generoval seznam -> 4body
prekryvaji [] = []
prekryvaji [x] = []
prekryvaji (x:xs) = (p x xs) ++ prekryvaji xs
--vrati seznam oken ktere se prekryvaji
p _ [] = []
p (a,b,(ar,br)) ((x,y(xr,yr)):zbytek)| ((x>a)&&(x<(a+ax))&&(y>b)&&(y<(b+bx))) || () || () || () = ( (a,b,(ar,br)), ((x,y(xr,yr)))) :p (a,b,(ar,br)) zbytek| otherwise = p (a,b,(ar,br)) zbytek