UL/FRI/UNI-RI/MOS/Izpiti/2006-08-25-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: ni podatka glej podobne izpite minut.
Literatura: ni podatka glej podobne izpite.

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

Tiskanje/izvoz
orodja