UL/FRI/UNI-RI/MOS/Izpiti/2006-06-19-prolog
Iz E-študij, proste zakladnice študentskega znanja
|
Izpit z dne Napaka: neveljaven čas
Čas pisanja: 90 minut.
|
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()?