UL/FRI/UNI-RI/MOS/Izpiti/2007-06-14-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

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

Tiskanje/izvoz
orodja