Programiranje z omejitvami
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 0
≤ J
≤ I
). 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.
마지막 수정됨: 화요일, 16 5월 2023, 5:28 PM