UL/FRI/UNI-RI/MOS/Izpiti/2007-06-26-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 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).
Osebna orodja
Imenski prostori
Različice
Dejanja
navigacija

Tiskanje/izvoz
orodja