UL/FRI/UNI-RI/MOS/Izpiti/2007-09-17-prolog

Iz E-študij, proste zakladnice študentskega znanja

< UL | FRI | UNI-RI | MOS | Izpiti
Skoči na: navigacija, iskanje

Izpit z dne Napaka: neveljaven čas
UL/FRI/UNI-RI/MOS


Čas pisanja: 90 minut.
Literatura: ni dovoljena.

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

e.)
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)
Osebna orodja
Imenski prostori
Različice
Dejanja
navigacija

Tiskanje/izvoz
orodja