Stromy, grafy Stromy: hledáni prvku in(X,T) Predikát in(X,T) uspěje, pokud se prvek X nachází ve stromu T. Prvek X se nachází ve stromě T, jestliže ■ Xje listem stromu T, jinak leaf(X) ■ Xje kořen stromu T, jinak tree(i_eft,x,Right) ■ Xje menší než kořen stromu T, pak se nachází v levém podstromu T, jinak ■ X se nachází v pravém podstromu T in(X, leaf(X)) :- !. in(X, tree(_,X,_)) :- !. in(X, tree(Left, Root, Right) ) :- XV, pak vznikne nový strom s kořenem V, vpravo má leaf(X) (vlevo je []) pokud T=leaf(V) a XV, pak v novém stromě L ponechej a X přidej doprava (rekurzivně) pokud T=tree(L,V,R) a XV, !. addOeaf(V), X, treeQeaf (X) ,V, []) ) :- !. XV, !, add(R,X,Rl). add(tree(L,V,R), X, tree(Ll,V,R)) :- X true) 4. Procházej zbývající sousedy uzlu Uzel prochazej_sousedy([],_,_,_). prochazej_sousedy([V|T],Uzel,Graf,Parents) :- arg(V,Parents,Rodič), ( nonvar(Rodic) -> true ; Rodič = Uzel , arg(V,Graf.SousediV), prochazej_sousedy(SousediV,V,Graf,Parents) ), prochazej_sousedy(T,Uzel,Graf,Parents). Hana Rudová, Logické programování 1,13. května 2011 Stromy, grafy DÚ: Procházení grafu do šířky Napište predikát bfs(U,C,P) pro procházení grafu C do šířky z uzlu U. Výsledkem procházení je datová struktura P, která reprezentuje strom vzniklý při prohledávání grafu C do šířky (pro každý uzel stromu známe jeho rodiče). graf([2,3],[l,3],[l,2]). 1--2 1--2 \ I I \l I 3 3 graf([2,4,6],[1,3],[2],[1,5],[4,6],[1,5]). 5—4 5—4 I I I 6__1__2 —3 6__i__2 —3 U=4: rodic(4, 1, 2, empty, 4, 1) U=2: rodic(2,empty,2) Hana Rudová, Logické programování 1,13. května 2011 Stromy, grafy