Zapocet v prologu..

Přednáška je věnována neprocedurálnímu programování. Většina semestru je věnována programování v jazyku Prolog, ve kterém studenti i ladí zápočtové programy. Informativně se studenti seznámí i s jazykem LISP a neprocedurálními částmi programovacích systémů.
tomka
Matfyz(ák|ačka) level I
Příspěvky: 2
Registrován: 5. 5. 2011 23:47
Typ studia: Informatika Bc.

Zapocet v prologu..

Příspěvek od tomka »

Cau mam problem se zapoctem v prologu zadaní zní:

"Na vstupu je zadan uzlove ohodnoceny souvisly graf. Napiste program v jazyce prolog, ktery rozhodne zda je dany graf binarnim stromem."

Pokud chapu zadani spravne mam dany graf napr:

h(0, 1).
h(1, 3).
h(2, 1).
h(2, 3).
h(0, 4).
h(3, 4).
h(4, 4).
h(3, 0).
h(4, 2).
oh(X, Y) :- h(X, Y).
oh(X, Y) :- h(Y, X).

reseni bude podle me easy... bohuzel za 5 cviceni ktere nam na to vyhradili po 5ti letech javy.. plave v tom vetsina tridy..... Za pripadne tipy diky moc
PetrK
Matfyz(ák|ačka) level I
Příspěvky: 22
Registrován: 7. 2. 2011 22:41
Typ studia: Informatika Bc.

Re: Zapocet v prologu..

Příspěvek od PetrK »

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.
tomka
Matfyz(ák|ačka) level I
Příspěvky: 2
Registrován: 5. 5. 2011 23:47
Typ studia: Informatika Bc.

Re: Zapocet v prologu..

Příspěvek od tomka »

Díky za pomoc!
Odpovědět

Zpět na „PRG005 Neprocedurální programování“