od PetrK » 6. 5. 2011 17:18
S definici binarniho stromu na neorientovanym grafu sem mel taky problem, v te uloze by mel byt asi orientovany graf, to by potom vypadalo nejak takhle:
Kód: Vybrat vše
binStrom:-najdiKoren(K), jeBinStrom([K], [K]).
najdiKoren(K):-h(K, _), not(h(_, K)), setof(Y, h(K, Y), Set), length(Set, L), L =< 2.
jeBinStrom([], _).
jeBinStrom([H|T], Acc):-findall(Y, h(H, Y), Set), jeCyklus(Set, Acc), length(Set, L), !, L =< 2, conc(Set, T, T2), conc(Set, Acc, Acc2), jeBinStrom(T2, Acc2).
jeCyklus([], _).
jeCyklus([H|T], A):-not(member(H, A)), jeCyklus(T, A).
Pokud by se jednalo opravdu o neorientovany graf, zkusil sem to modifikovat tak, aby vyhazoval hrany, co dou ze syna do otce:
Kód: Vybrat vše
binStrom:-najdiKoren(K), jeBinStrom([p(K, K)], []).
najdiKoren(K):-setof(X, oh(X, K), Set), length(Set, L), L =< 2.
jeBinStrom([], _).
jeBinStrom([p(X, P)|Zasobnik], Acc):-setof(Y, oh(X, Y), Set), vynechx(P, Set, S), jeCyklus(S, Acc), !, length(S, L), L =< 2, naZasobnik(X, S, Zasobnik, Z2), conc(S, Acc, Acc2), jeBinStrom(Z2, Acc2).
vynechx(_, [], []).
vynechx(X, [X|T], T):-!.
vynechx(X, [H|T], [H|TeloBezX]):-vynech(X, T, TeloBezX).
naZasobnik(_, [], Z, Z).
naZasobnik(X, [H|T], Z, Z2):-naZasobnik(X, T, [p(H, X)|Z], Z2).
jeCyklus([], _).
jeCyklus([H|T], A):-not(member(H, A)), jeCyklus(T, A).
Prolog mi taky nijak extra nejde, takze to bude urcite hodne daleko od idealniho reseni.
S definici binarniho stromu na neorientovanym grafu sem mel taky problem, v te uloze by mel byt asi orientovany graf, to by potom vypadalo nejak takhle:
[code]
binStrom:-najdiKoren(K), jeBinStrom([K], [K]).
najdiKoren(K):-h(K, _), not(h(_, K)), setof(Y, h(K, Y), Set), length(Set, L), L =< 2.
jeBinStrom([], _).
jeBinStrom([H|T], Acc):-findall(Y, h(H, Y), Set), jeCyklus(Set, Acc), length(Set, L), !, L =< 2, conc(Set, T, T2), conc(Set, Acc, Acc2), jeBinStrom(T2, Acc2).
jeCyklus([], _).
jeCyklus([H|T], A):-not(member(H, A)), jeCyklus(T, A).
[/code]
Pokud by se jednalo opravdu o neorientovany graf, zkusil sem to modifikovat tak, aby vyhazoval hrany, co dou ze syna do otce:
[code]
binStrom:-najdiKoren(K), jeBinStrom([p(K, K)], []).
najdiKoren(K):-setof(X, oh(X, K), Set), length(Set, L), L =< 2.
jeBinStrom([], _).
jeBinStrom([p(X, P)|Zasobnik], Acc):-setof(Y, oh(X, Y), Set), vynechx(P, Set, S), jeCyklus(S, Acc), !, length(S, L), L =< 2, naZasobnik(X, S, Zasobnik, Z2), conc(S, Acc, Acc2), jeBinStrom(Z2, Acc2).
vynechx(_, [], []).
vynechx(X, [X|T], T):-!.
vynechx(X, [H|T], [H|TeloBezX]):-vynech(X, T, TeloBezX).
naZasobnik(_, [], Z, Z).
naZasobnik(X, [H|T], Z, Z2):-naZasobnik(X, T, [p(H, X)|Z], Z2).
jeCyklus([], _).
jeCyklus([H|T], A):-not(member(H, A)), jeCyklus(T, A).
[/code]
Prolog mi taky nijak extra nejde, takze to bude urcite hodne daleko od idealniho reseni.