UL/FRI/UNI-RI/MOS/Izpiti/2007-09-17-prolog
Iz E-študij, proste zakladnice študentskega znanja
|
Izpit z dne Napaka: neveljaven čas
Čas pisanja: 90 minut.
|
1. naloga
Binarna drevesa so podana v obliki b(L, E, R), kjer sta L in R levo oziroma desno poddrevo, E pa element v vozlišču. Prazno drevo predstavlja simbol nil. Drevo z enim samim elementom je tako b(nil, E, nil). Napišite predikat memberBT(X, BT), ki z vračanjem vrne vse elemente X binarnega drevesa BT!
Rešitev
memberBT(X, b(L, X, R)). memberBT(X, b(L, _, R)):-memberBT(X,L). memberBT(X, b(L, _, R)):-memberBT(X,R).
2. naloga
Kako bi prologu zastavili naslednja vprašanja? Ne pišite programov! [25%]
- a) Imate podano družinsko drevo (z relacijami parent ter male/female). Ali obstaja nekdo, ki v drevesu nima podanega nobenega starša, ima pa vsaj enega otroka?
- b) Vrni seznam brez duplikatov vseh elementov podanega seznama L, ki niso ne realna števila ne atomi!
- c) Z vračanjem naštej vse elemente podanega seznama L, ki so sestavljenega tipa!
- d) Je 343 * 121 večje od 40.000 (aritmetično gledano)?
- e) Z vračanjem poišči vse elemente seznama L, pred katerimi v seznamu ni nobenega večjega elementa! (npr, v L = [7,1,12,7,8,1] sta taka elementa 7 in 12)!
Rešitev
a.) parent(X,_), \+ parent(_,X).
b.) setof(X, (member(X, L), \+ atom(X), \+float(X)), Rez)
c.) member(X, L), compound(X). % recimo L = [date(Dan, Mesec, Leto), parent(P,C), 33, 12]
d.) 343*121 > 40000
najdiNekaj(L, X) :- conc(First,[X|_],L), findall(Y, (member(Y,First), Y>X), LX), length(LX,0).
3.naloga
Kaj odgovori prolog na naslednja vprašanja? Podajte vse odgovore v pravilnem vrstnem redu! [25%]
- a) ?- delete(X, [a,B,1,c,D,2], _), (number(X), !; atomic(X)).
- b) ?- a = 13, !; \+ (a \== 13).
- c) ?- _L = [k,i,k,i,r,i,k,i], conc(X, [k,i|Y], _L).
- d) ?- setof(X, member(X, [k,i,k,i,r,i,k,i]), L).
- e) ?- _Final = [esp, rus], delete(_, Final, Win), length(Win, 1), !.
Rešitev
- a) X=a; X=1; no
- b) no
- c) X=[], Y=[k,i,r,i,k,i]; X=[k,i], Y=[r,i,k,i]; X=[k,i,k,i,r,i], Y=[]; no
- d) L=[i,k,r]; no
- e) _Final=[esp,rus], Win=[rus]; no
4.naloga
Predpostavimo, da imate podano bazo družinskih relacij s predikati parent/2, female/1 in male/1. Spodnje vprašanje prologu naj bi povedalo ali v bazi obstaja kdo, ki nima podanega očeta, ima pa podano mamo.
?- \+ (parent(_F, _X), male(_F)), parent(_M, _X), female(_M).
- a) Napišite primer čim manjše baze družinskih relacij, na kateri vprašanje ne deluje kot bi si želeli,
parent(jan, eva). parent(eva, vid). female(eva). male(vid). male(jan).
- b) Ali obstaja kakšna neprazna baza (vsaj ena relacija parent in podan spol) na kateri vprašanje deluje pravilno? Če da, napišite primer takšne baze!
parent(eva, vid). female(eva). male(vid).
- c) Razložite zakaj vprašanje prologu ne deluje kot je zamišljeno.
- d) Popravite vprašanje tako, da bo delovalo pravilno za poljubno bazo.
?- (parent(_M, _X), female(_M)) -> (\+ (parent(_F, _X), male(_F))); true. tale je mal bolj razumljiva resitev: (\+ (parent(_F, _X), male(_F)));true, parent(_M, _X), female(_M)