UL/FRI/UNI-RI/MOS/Izpiti/2006-06-19-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.

Svetovno prvenstvo v nogometu je na vrhuncu. Predikat game(ekipa1, ekipa2, [strelec1, strelec2, strelec3, ...]) pove kdo so bili strelci na tekmi med podanima ekipama. Če je nekdo strelec več kot enkrat se njegovo ime v seznamu ponovi. Na primer zapis:

game(mexico, iran, [bravo, golmohammadi, bravo, zinha]).

pove, da so na tekmi Mehika proti Iranu bili strelci Bravo, Golmohammadi, še enkrat Bravo in Zinha.


1. naloga

Napišite predikat goals(Player), ki za podanega igralca pove koliko golov je dal na svetovnem prvenstvu. [35%]

Rešitev

goals(Player, Goals):-
     findall(X, ( game(_, _, Strelci), count(Player, Strelci, X) ), S),
     sum(S, Goals).

ali

prestej_gole(Player,[],0).
prestej_gole(Player,[Player|R],N):-prestej_gole(Player,R,N1),N is N1+1.
prestej_gole(Player,[G|R],N):-prestej_gole(Player,R,N).
 
seznam_strelcev(Player,[],0).
seznam_strelcev(Player,[G|R],N):-seznam_strelcev(Player,R,N1),prestej_gole(Player,G,N2), N is N2+N1.
 
 
goals(Player,N):-findall(X,game(_,_,X),Seznam),seznam_strelcev(Player,Seznam,N).

2. naloga

Kako bi prologu zastavili naslednja vprašanja? [20 %]

  • a) Ali je Robben dal kakšen gol na tekmi Nizozemska proti Argentini?
  • b) Katere tekme so se končale brez golov?
  • c) S koliko različnimi ekipami je igrala Brazilija?
  • d) Je Argentinec Crespo na kakšni tekmi dal več kot en gol?

Rešitev

# a)
?- game(nizozemska, argentina, Strelci), member(robben, Strelci).
# ali
?- findall(X,(game(nizozemska, argentina, X) ; game(argentina, nizozemska, X)),Seznam),prestej_gole(robben,Seznam,N), N>0.
 
# b)
?- game(X, Y, []).
# ali
?- findall(X-Y,game(X,Y,[]),Seznam).  
 
# c)
?- setof(X, ( game(brazilija, X, _) ; game(X, brazilija, _) ), L), length(L, N).
%ni prav, ker naredi X seznamov, vsak seznam z dolzino 1
 
Pravilna resitev:
?- findall(X,(game(brazil,X,_);game(X,brazil,_)),_Seznam), setof(X,member(X,_Seznam),_Seznam1), length(_Seznam1,N).
 
# d)
game(_, _, L), delete(crespo, L, L1), delete(crespo, L1, L2).
 
Boljsa resitev:
?- game(_,_,L), delete(crespo,L,L1), member(crespo,L1).

3. naloga

Kaj odgovori prolog na naslednja vprašanja? [20%]

  • a) ?- \+ game(_, _, _), !.
  • b) ?- game(togo, switzerland, [agboh, abalo]) =.. L.
  • c) ?- length([agboh, abalo], N), atomic(N).
  • d) ?- nonvar(X), X = 3; number(X).

Rešitev

# a)
no
 
# b)
L = [game, togo, switzerland, [agboh, abalo]];
no
 
# c)
N = 2;
no
#tukaj je prav yes.
 
# d)
no

4. naloga

Naloga spodnjega programa je najti permutacije seznama [a,b,c,d,e,f,g], za katere velja, da d ni med a in g. Na primer permutacija [f,g,e,a,d,c,b] ustreza, medtem ko permutacija [f,g,a,c,b,d,g] ne ustreza. Program ne deluje pravilno – popravite ga! [25%]

findp(L, P):-
  permute(L, P),
  conc(_, [a|d|Rest], P), 
  \+ member(g, Rest).

Rešitev

findp(L, P):-
  perm(L, P),
  concat(_, [a|Rest], P), 
  (concat(X, [g|_], Rest) -> (\+ member(d, X));true)
  .

ali

findp(L, P):-
  permutation(L, P),
  conc(X, [d|Rest], P),
  \+conc([_],[a|_], X), 
  \+conc([_],[g|_], Rest).

Tale preizkušeno ne dela, prva pa.

Kako pa to testirš? Imaš spisano perm()?

Osebna orodja
Imenski prostori
Različice
Dejanja
navigacija

Tiskanje/izvoz
orodja