Naloga

Dan je naslednji program z omejitvami CLP(FD):

    prog(A, B) :-
        length(B, A),
        B ins 1..A,
        all_different(B),
        label(B).
  • Kaj odgovori prolog na spodnje vprašanje? Naštej vse odgovore!
    ?- prog(3, B).
  • Kaj dela ta program?

Rešitev

  • Prolog odgovori:
    B = [1,2,3] ;
    B = [1,3,2] ;
    B = [2,1,3] ;
    B = [2,3,1] ;
    B = [3,1,2] ;
    B = [3,2,1].
  • Program vrača permutacije števil med 1 in A.

Naloga

Podan je spodnji predikat, ki uporablja CLP(FD).

    s([], 0).
    s([X|L], S) :-
      S #= S1 + X,
      s(L, S1).

Kaj odgovori Prolog na spodnja vprašanja? Podajte samo prvi odgovor.

    ?- s([3,2,4], S).
    ?- s([3,2,4,X], 15).
    ?- s([3,X,2,4], -15).
    ?- s(L, 0).

Rešitev

    ?- s([3,2,4], S).
    S = 9.
    ?- s([3,2,4,X], 15).
    S = 6.
    ?- s([3,X,2,4], -15).
    S = -24.
    ?- s(L, 0).
    L = [].

Naloga

Prvih nekaj vrstic Pascalovega trikotnika izgleda tako:

    1
   1 1
  1 2 1
 1 3 3 1
1 4 6 4 1

Prva in zadnja vrednost v vsaki vrstici sta 1, vsak drug element pa dobimo tako, da seštejemo dve vrednosti nad njim. Napišite predikat pascal(I, J, N), ki vrne J-to vrednost v I-ti vrstici Pascalovega trikotnika. Argumenta I in J naj začneta šteti z 0; predpostavite lahko, da velja 0JI). Predikat lahko isto (pravilno) rešitev vrne večkrat.

Primeri:

    ?- pascal(0, 0, N).
    N = 1.
    ?- pascal(2, 1, N).
    N = 2.
    ?- pascal(4, 3, N).
    N = 4.

Rešitev

    pascal(_, 0, 1).
    pascal(I, J, 1) :-
        I #>= 1, % da ne podvaja rešitev
        J #= I.
    pascal(I, J, N) :-
        I #> 1,
        I1 #= I - 1,
        J1 #= J - 1,
        pascal(I1, J, N1),
        pascal(I1, J1, N2),
        N #= N1 + N2.
Zadnja sprememba: torek, 16. maj 2023, 17.28