UL/FRI/UNI-RI/MOS/Izpiti/2006-08-25-prolog
Iz E-študij, proste zakladnice študentskega znanja
|
Izpit z dne Napaka: neveljaven čas
Čas pisanja: ni podatka glej podobne izpite minut.
|
1. naloga
Napišite program, ki prešteje koliko spremenljivk je v danem izrazu. Na primer klic countvars(2*a*(X+3*b-Y), N) vrne N = 2 (ker sta spremenljivki dve, X in Y). Če se ista spremenljivka pojavi večkrat jo večkrat tudi štejete. [35%]
Rešitev
countvar(X,0) :- atomic(X),!. % konstanta = 0 countvar(X,1) :- var(X),!. % spr = 1 countvar(Term,N) :- arg(1,Term,A), % ce pride do sem gre za strukturo, z relacijo arg se ne rabis obremenjevat glede operatorja arg(2,Term,B), % dobis prvi in drugi argument countvar(A,N1), % zracunas st.spremenljivk countvar(B,N2), N is N1 + N2. % sestejes
2. naloga
Kako bi prologu zastavili naslednja vprašanja? [20%]
- a) Ali je v seznamu L element b takoj za elementom a?
- b) Je seznam L1 daljši od seznama L2?
- c) Ali se element a v danem seznamu L pojavi večkrat?
- d) Poišči seznam C, ki vsebuje vse elemente seznama L vendar brez ponavljanja!
Rešitev
- a)
?- conc(First,[a,b|Rest], L).
- b)
?- length(L1, N1), length(L2, N2), N1 > N2.
- c)
?- conc(X,[a|Rest],L), conc(X1,[a|Rest1],Rest).
ALI?- delete(a, L, L1), delete(a, L1, L2).
- d)
?- setof(X, member(X,L),C).
3. naloga
Kaj odgovori prolog na naslednja vprašanja? Podajte vse odgovore v pravilnem vrstnem redu! [20%]
- a) ?- member(X, [a,B,1,c,D,2]), (number(X), !; nonvar(X)).
- b) ?- Start = 2 * 3, Next = Start + 1, Next2 = Next + 1.
- c) ?- functor(a + b + 2 * c, F, A).
- d) ?- var(X), X = 25, !; X = 25.
Rešitev
- a)
X = a ; X = 1 ; No
- b)
Start = 2*3, Next = 2*3+1, Next2 = 2*3+1+1 ; No
- c)
F = +, A = 2 ; No
- d)
X = 25 ; No
4. naloga
Naloga spodnjega programa je brez odvečnega podvajanja najti permutacije seznama [1,2,3,4,5], za katere velja, da ni 1 na prvem mestu in 5 na zadnjem mestu. Na primer permutacija [1,2,5,4,3] ustreza, medtem ko permutacija [1,4,2,3,5] ne ustreza. Program ne deluje pravilno – popravite ga! [25%]
findp(L, P):- permute(L, P), \+ conc(1, _, P), \+ conc(_, 5, P).
Rešitev
findp(L, P):- permutation(L, P), (\+ conc([1], _X, P); \+ conc(_Y, [5], P)).
Rešitev po vzoru korejskih in malezijskih avtomobilov iz vaj
findp(L, P):- permutation(L, P), ((conc([1], _X, P), conc(_Y, [5], P)), !, fail); true.
Še ena možna rešitev problema
findp(L,P):- permutation(L,P), ((conc([1],_,P),conc(_,[5],P))->fail;true).