Tổ hợp

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
.

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,
     !
.

Tạo một blog miễn phí với WordPress.com.

Up ↑