UL/FRI/UNI-RI/MOS/Izpiti/2007-06-14-prolog
Iz E-študij, proste zakladnice študentskega znanja
|
Izpit z dne Napaka: neveljaven čas
Čas pisanja: 90 minut.
|
1. naloga
Napišite progam, ki za podani urejeni seznam števil izračuna in vrne mediano (srednji element). Pazite, mediana za sezname sode dolžine, je povprečje srednjih dveh elementov.
Rešitev
mediana(L,M):- conc(Left,[M|Right],L), length(Left,X), length(Right,X). mediana(L,M):- conc(Left,[M1,M2|Right],L), length(Left,X), length(Right,X), M is (M1+M2)/2.
2. naloga
Kako bi prologu zastavili naslednja vprašanja:
- a) z vračanjem naštej vse elemente podanega seznama L, ki niso števila.
- b) vrni seznam vseh različnih elementov podanega seznama L!
- c) Ali ne velja p(X) in hkrati velja p za kakšen element, ki ni a?
- d) Poišči seznam L, ki vsebuje vse elemente x, za katere ne velja ali p(x) ali q(x)!
- e) Ali je v seznamu L element b med elementoma a in c?
Rešitev
# a) ?- member(X,L),\+number(X). # b) ?- setof(X,member(X,L),L1). # c) ?- \+p(X),p(A),A\==a. # d) ?- finall(X,(\+p(X);\+q(X)),L). # e) ?- conc(A,[b|C],L),member(a,A),member(c,C).
3. naloga
Kaj odgovori prolog na naslednja vprašanja? Odgovore podajte v pravilnem vrstnem redu!
- a) ?-delete(X, [a,b,c], _) ; !, member(X, [a,b,c]).
- b) ?-X = 39 + 25, number(X).
- c) ?-conc(_L, [a|_], [a,b,c,c,a]), member(X, _L).
- d) ?-length([a,5,X,_X,_,a], N).
- e) ?-member(X, [3,5,2,6,9,3,6,4]), \+ (X>4 ; X<6).
Rešitev
# a) X=a; X=b; X=c; X=a; X=b; X=c; no # b) no # c) _L = [a, b, c, c], X = a ; _L = [a, b, c, c], X = b ; _L = [a, b, c, c], X = c ; _L = [a, b, c, c], X = c ; % to je popravljena resitev! Zgornja resitev ni pravilna. Pravilna: a; b; c; c; no Če js tole vržem v SICStus dobim vn (čeprou mi je logična zgornja rešitev): X=a; no # d) N = 6; no # e) no
4. naloga
Spodnji program naj bi poiskal drugo največje število v seznamu L (v katerem ni duplikatov). Program ne deluje pravilno; ima dva problema. Z besedami razloži na kratko v čem sta ta dva problema in tudi kaj je ideja programa. Popravite ga! (ne ga spreminjat!)
findsec(L, S):- findall(X, (X > S, member(X,L), member(S,L)), LX), length(LX, 1).
Rešitev
Problema sta, da mora biti pogoj member(S,L) zunaj findall ter pravilen vrstni red v findall.
A zihr? Ker men tole vrne "no". (podam seznam števil)
findsec(L,S):- member(S,L), findall(X,(member(X,L),X>S),LX), length(LX,1).