UL/FRI/UNI-RI/MOS/Izpiti/2007-06-26-prolog
Iz E-študij, proste zakladnice študentskega znanja
|
Izpit z dne Napaka: neveljaven čas
Čas pisanja: 90 minut.
|
1. naloga
Napišite program, ki za podani seznam, v katerem so izključno elementi tipa atomic, vrne element, ki se najpogosteje pojavlja. [25 %]
Rešitev
najpogostejsi(L, E) :- findall(X, ( member(E, L), count(E, L, X)), T), max(T, M), setof(X, ( member(X, L), count(X, L, S), S =:= M), E).
2. naloga
Kako bi prologu zastavili naslednja vprašanja? Postavite vprašanja, ne pišite programov! [25 %]
- a) Ali je v seznamu L kakšen element b za najmanj dvema elementoma a?
- b) Sta drugi in predzadnji element podanega seznama L enaka?
- c) Ali velja p(a) in hkrati velja p za kakšen element, ki ni a?
- d) Koliko elementov seznama L, ki vsebuje samo števila, je večjih od 5?
- e) Je podani spremenljivki X že prirejena neka vrednost?
Rešitev
- a)
?- conc(_, [a,a,b|_], L).
Resitev a ni pravilna saj ni nikjer zapisano, da morata biti pred b dva zaporedna a-ja. Stvar bo padla, če bo niz oblike [a,d,c,a,b]. Pravilna resitev:
?- conc(_X,[b|_Y],L),del(a,_X,_Z),member(a,_Z).
- b)
?- conc([_,X|_], [X,_], L).
- c)
?- p(a), p(A), A \== a.
- d)
?- findall(X, (member(X, L), X>5), _S), length(_S, N).
- e)
?- nonvar(X).
3. naloga
Kaj odgovori prolog na naslednja vprašanja? Podajte vse odgovore v pravilnem vrstnem redu! [25 %]
- a) ?- conc(_K, _, [1,2,3,4]), length(_K, N).
- b) ?- delete(N, [a,b,c,d], [a,c]).
- c) ?- conc(_L, [e|_], [a,b,e,c,e,d,a]), length(_L, N).
- d) ?- member(X, [1,3,5]), member(Y, [2,4]), X>Y.
- e) ?- (X is 0 ; X is 1), !, X>0.
Rešitev
- a)
N = 0; N = 1; N = 2; N = 3; N = 4; no
- b)
N = [b, d]; no
Odgovor je napačen. Pravilen odgovor je no.
- c)
N = 2; N = 4; no
- d)
X = 3, Y = 2; X = 5, Y = 2; X = 5, Y = 4; no
- e)
no # zaradi klicaja prolog ne preizkusa druge resitve po znaku ; (X is 1), ki bi sicer uspela
4. naloga
Spodnji program naj bi poiskal najmanjše in največje število v seznamu stevil L. Program ne deluje pravilno; poiščite vse probleme in jih z besedami na kratko obrazložite. Popravite program (ne napisite novega programa, popravite obstojecega)!
1.Problem je, da se mora primerjanje velikosti ( H<A ) izvesti po tem, ko se mm še enkrat kliče.
2.Problem je, da ni robnega pogoja
3.Problem je, cut operator ( ! ) v drugem in tretjem klicu mm. Saj ne želimo, da če drugi ali tretji klic uspeta, da se kliče še četrti klic
mm([H|T],H,B):- H<A, mm(T,A,B). mm([H|T],A,H):- H>B, mm(T,A,B). mm([H|T],A,B):- mm(T,A,B).
Rešitev
mm([X],X,X). mm([H|T],H,B):- mm(T,A,B), H<A,!. mm([H|T],A,H):- mm(T,A,B), H>B,!. mm([H|T],A,B):- mm(T,A,B).