giaithua(0,1). giaithua(1,1). giaithua(N,R):- N1 is N-1, giaithua(N1,R1), R is N*R1 . tohop(K, N, R):- giaithua(N, R1), giaithua(N-K, R2), R3 is K*R2, R is R1/R3 .
Bài toán tháp Hà Nội
hanoi(N):- move(N,left, center, right) . move(0,_,_,_):- ! . move(N, A, B, C):- M is N-1, move(M, A, C, B), inform(A, B), move(M, C, B, A) . inform(X, Y): write(['Chuyen 1 dia tu cot ',X,' sang cot ',Y]), nl .
Dãy Fibonacci
fibo(0,0). fibo(1,1). fibo(N,R):- A is N-1, B is N-2, fibo(A,R1), fibo(B,R2), R is R1+R2 .
Bài toán đong sữa
Cho 3 bình sữa, mỗi bình có sức chứa lần lượt là: 3, 5, 8 lít.
Hãy viết chương trình từ số lượng sữa cho trước trong 3 bình, đong sữa qua lại giữa các bình cho đến khi nào có một bình chứa được 4 lít thì dừng.
Ví dụ: Khởi tạo số lượng sữa trong 3 bình lần lượt là: 0 – 0 – 8
max(A, B, A):- A>=B . max(A, B, B):- B>=A . min(A, B, A):- A=<B . min(A, B, B):- B=<A . /*3->5*/ op([A1,B1,C1],[A2,B2,C1]):- A1>0, B1<5, R1 is A1+B1-5, max(R1, 0, T1), A2 is T1, R2 is A1+B1, min(R2, 5, T2), B2 is T2 . /*3->8*/ op([A1,B1,C1],[A2,B1,C2]):- A1>0, C1<8, R1 is A1+C1-8, max(R1, 0, T1), A2 is T1, R2 is A1+C1, min(R2, 8, T2), C2 is T2 . /*5->8*/ op([A1,B1,C1],[A1,B2,C2]):- B1>0, C1<8, R1 is B1+C1-8, max(R1, 0, T1), B2 is T1, R2 is B1+C1, min(R2, 8, T2), C2 is T2 . /*8->3*/ op([A1,B1,C1],[A2,B1,C2]):- A1<3, C1>0, R1 is C1+A1-3, max(R1, 0, T1), C2 is T1, R2 is C1+A1, min(R2, 3, T2), A2 is T2 . /*[S|T]: phan tu dau la S, T la cac phan tu con lai*/ find([[S|T]|Q], path):- goal(S), path is [S|T] . /*ham findall(Tim cai gi, Tim o dau, Luu vao day)*/ find([[S|T]|Q], path):- \+goal(S), findall([X,S|T], op(S,X), L), append(Q, L, Q1), /*Them cac con vao frontier Q*/ find(Q1,path) . goal([_,4,_]). goal([_,_,4]).
Hiển thị phần tử giữa trong danh sách
Viết vị từ midel để hiển thị ra phần tử giữa trong danh sách số nguyên dương cho trước, trả về 0 nếu số phần tử của danh sách là chẵn
Ví dụ:
- midel([4,9,7,6,2],X) => X=7
- midel([4,9,7,6,2],X) => X=0
dem([],0):-!. dem([_|T],N):- dem(T,N1), N is N1+1, ! . vtn([X|_], 1, X):-!. vtn([_|Y],M, Z):- M1 is M-1, vtn(Y,M1,Z), ! . midel([A|B], C):- dem([A|B],K), (K mod 2) =:= 1, K1 is (K div 2), K2 is K1+1, vtn([A|B], K2, C), ! . midel([A|B],0):- dem([A|B],K), (K mod 2) =:= 0, ! .