You are on page 1of 8

Bài tập thực hành BProlog

1. Viết vị từde mc h an đếm trên một danh sách có bao nhiêu phần tử là số chẵn.
Vd: demchan([4,9,6,5,2],N) N=3

demchan([],0):-!.
demchan([H|T],S):-(H mod 2) =:= 0,demchan(T,S1),S is S1+1,!.
demchan([_|T],S):-demchan(T,S).

2. Viết vị từptn nhận đối số là một danh sách cùng số nguyên dương n và in ra phần tử thứ n
trong danh sách.
Vd: ptn([4,9,6,5,2],2,X)  X=9
dem([],0):-!.
dem([_|T],N):-dem(T,N1),N is N1+1,!.
ptn([X|_],1,X):-!.
ptn([_|Y],M,Z):-M1 is M-1,ptn(Y,M1,Z),!.
3. Viết vị từn_ pt da u(N,L,L1,L2) trong đ L1 chứa N phần tử đầu của Lvà L2 chứa phần còn
lại. Vị từ này có thể đảo ngược lại.
Vd: n_ptdau(3,[1,2,3,4,9,5,6],L1,L2) L1=[1,2,3], L2=[4,9,5,6]
n_ptdau(N,[a,b,c],[a,b],L2) N=2, L2=[c]
n_ptdau(0,L,[],L).
n_ptdau(N,[H|T],[H|T1],L2):-n_ptdau(M,T,T1,L2),N is M+1.
4. Viết vị từpt g in ra phần tử giữa trong danh sách số nguyên dương, trả về 0 nếu số phần tử
của danh sách là số chẵn.
Vd: ptg([4,9,6,5,2],X)  X=6
ptg([4,9,5,2],X)  X=0
dem([],0):-!.
dem([_|T],N):-dem(T,N1),N is N1+1,!.
ptn([X|_],1,X):-!.
ptn([_|Y],M,Z):-M1 is M-1,ptn(Y,M1,Z),!.
ptg([A|B],C):-dem([A|B],K),(K mod 2) =:= 1,K1 is K/<2,K2 is
K1+1,ptn([A|B],K2,C),!.
ptg([A|B],0):-dem([A|B],K),(K mod 2) =:= 0,!.
5. Viết vị từho i,h ie u,g iao thực hiện phép hội, hiệu và giao trên hai danh sách
Vd: hoi([1,2,3,4,5],[3,4,5,6,7,8],X) X=[1,2,3,4,5,6,7,8]
hieu([1,2,3,4,5],[3,4,5,6,7,8],X)  X=[1,2]
giao([1,2,3,4,5],[3,4,5,6,7,8],X)  X=[3,4,5]
tim([H|_],H):-!.
tim([_|T],X):-tim(T,X).

hoi([],X,X):-!.
hoi([H|T],X,[H|T1]):-not(tim(X,H)),hoi(T,X,T1),!.
hoi([_|T],X,T1):-hoi(T,X,T1).

Vd: dao([1,2,3,4,5],L) L=[5,4,3,2,1]


tim([H|_],H):-!.
tim([_|T],X):-tim(T,X).

giao([],_,[]):-!.
giao([H|T1],L2,[H|T3]):-tim(L2,H),giao(T1,L2,T3),!.
giao([_|T1],L2,L3):-giao(T1,L2,L3).

6. Viết vị từd ao nhận đối số là một danh sách và in ra danh sách đảo của nó
Vd: dao([1,2,3,4,5],L) L=[5,4,3,2,1]
noi([],X,[X]).
noi([H|T],X,[H|T1]):-noi(T,X,T1).
dao([],[]).
dao([H|T],L):-dao(T,L1),noi(L1,H,L).
7. Viết vị từc he n(L,E,R) – R là danh sách L trong đó E đã được chèn vào đúng vị trí (giả sử L
đã được sắp theo thứ tự giảm)
Vd: chen( [5,4,2,1],3,R) R=[5,4,3,2,1]

chen([],E,[E]).
chen([H|T],E,[E|[H|T]]):-H>E,!.
chen([H|T],E,[H|T3]):-chen(T,E,T3).

8. Viết vị từc he nD S(L1,L2,L3) – L3 là danh sách L2 đã được chèn vào tất cả nhừng phần tử
của danh sách L1
Vd: chenDS( [3,2,5],[6,4,1],L) L=[6,5,4,3,2,1]

chen([],E,[E]).
chen([H|T],E,[E|[H|T]]):-H<E,!.
chen([H|T],E,[H|T3]):-chen(T,E,T3).

chenDS([],L,L).
chenDS([H|T],L2,L3):-chen(L2,H,L4),chenDS(T,L4,L3).
9. Viết vị từs apt a ng vàs apg i a m nhận đối số là một danh sách và sắp danh sách theo thứ tự
tăng hoặc giảm
Vd: sapgiam([1,2,3,4,5,6],Y) Y=[6,5,4,3,2,1]
saptang([8,12,4,7,3,9,5],Y) Y=[3,4,5,7,8,9,12]

chen(X,[],[X]):-!.
chen(X,[H|T],[X|[H|T]]):-X=<H,!.
chen(X,[H|T],[H|T1]):-chen(X,T,T1).

saptang([H],[H]):-!.
saptang([H|T],T2):-saptang(T,T1),chen(H,T1,T2).

chenn(X,[],[X]):-!.
chenn(X,[H|T],[X|[H|T]]):-X>=H,!.
chenn(X,[H|T],[H|T1]):-chenn(X,T,T1).

sapgiam([H],[H]):-!.
sapgiam([H|T],T2):-sapgiam(T,T1),chenn(H,T1,T2).
10. Viết vị từc h ia h ai chia danh sách ra làm hai danh sách con bằng nhau, danh sách con thứ
nhất sắp theo thứ tự tăng và danh sách con thứ hai sắp theo thứ tự giảm.
Vd: chiahai([1,2,3,4,5,6],Y,Z) Y=[1,2,3], Z=[6,5,4]
chiahai([8,12,4,7,3,9,5],Y,Z) Y=[4,7,8,12], Z=[9,5,3]
dem([],0):-!.
dem([_|T],N):-dem(T,N1),N=N1+1.

chen(X,[],[X]):-!.
chen(X,[H|T],[X|[H|T]]):-X=<H,!.
chen(X,[H|T],[H|T1]):-chen(X,T,T1).

saptang([H],[H]):-!.
saptang([H|T],T2):-saptang(T,T1),chen(H,T1,T2).
chenn(X,[],[X]):-!.
chenn(X,[H|T],[X|[H|T]]):-X>=H,!.
chenn(X,[H|T],[H|T1]):-chenn(X,T,T1).

sapgiam([H],[H]):-!.
sapgiam([H|T],T2):-sapgiam(T,T1),chenn(H,T1,T2).
phan(T,0,[],T):-!.
phan([H|T],N,[H|T1],Y):-N1 is N-1,phan(T,N1,T1,Y).
chiahai(X,Y,Z):-dem(X,N),(N mod 2) =:= 0,N1 is
N/2,phan(X,N1,Y1,Z1),saptang(Y1,Y),sapgiam(Z1,Z).
chiahai(X,Y,Z):-dem(X,N),N1 is
(N/>2),phan(X,N1,Y1,Z1),saptang(Y1,Y),sapgiam(Z1,Z).
11. Viết vị từxe n ke(L1,L2,L3) trong đó danh sách L3 được tạo nên bằng cách lấy xen kẽ các
phần tử của L1 và L2
Vd: xenke([1,3,5],[2,4,6],L) L=[1,2,3,4,5,6]

xenke(L,L2,L3):-buoc(0,L,L2,L3).
buoc(_,[],L,L).
buoc(_,L,[],L).
buoc(N,[H|T],L2,[H|T3]):-N mod 2=:=0,N1 is N+1,buoc(N1,T,L2,T3),!.
buoc(N,L,[H|T2],[H|T3]):-N1 is N+1,buoc(N1,L,T2,T3).

12. Viết vị từxo a pt da u nhận đối số là một danh sách cùng số nguyên dương X và xóa phần tử
bằng X đầu tiên trong danh sách.
Vd: xoaptdau([4,9,6,5,2],6,L) L=[4,9,5,2]
xoaptdau([4,9,6,5,9,2],9,L) L=[4,6,5,9,2]
xoaptdau([H|T],H,T):-!.
xoaptdau([H|T],X,[H|T1]):-xoaptdau(T,X,T1).
13. Viết vị từxo apt nhận đối số là một danh sách cùng số nguyên dương X và xóa tất cả những
phần tử bằng X trong danh sách.
Vd: xoapt ([4,9,6,5,2,6,3,6],6,L) L=[4,9,5,2,3]

xoapt([],_,[]):-!.
xoapt([H|T],H,T1):-xoapt(T,H,T1),!.
xoapt([H|T],X,[H|T1]):-xoapt(T,X,T1).

14. Viết vị từth ay the(X,Y,L,R) trong đó R là danh sách L mà tất cả các phần tử X đã được thay
thế bằng Y
Vd: thaythe(1,8,[1,2,3,4,1,5,6],L) Y=[8,2,3,4,8,5,6]

thaythe(_,_,[],[]).
thaythe(H,K,[H|T],[K|T2]):-thaythe(H,K,T,T2),!.
thaythe(X,Y,[H|T],[H|T2]):-thaythe(X,Y,T,T2).

15. Viết vị từxo a dsc(L1,L2,L3) trong đó L3 là danh sách L1 đã xóa đi lần xuất hiện đầu tiên của
danh sách L2 (nếu L2 là danh sách con của L1)
Vd: xoadsc([1,2,3,4,1,5,6],[4,1]) Y=[1,2,3,5,6]
xoadsc([1,2,3,4,1,5,6],[1,4]) Y=[1,2,3,5,6]

xoadsc([H|T],[H],T):-!.
xoadsc([H|[H1|T]],[H|[H1|T1]],X):-xoadsc([H1|T],[H1|T1],X),!.
xoadsc([H|T],[H1|T1],[H|T2]):-xoadsc(T,[H1|T1],T2).

16. Viết vị từxo a xh ds(L1,L2,L3) trong đó L3 là danh sách L1 đã xóa đi tất cả những lần xuất
hiện của danh sách L2 (nếu L2 là danh sách con của L1)
Vd: xoaxhds([1,2,3,4,1,2,5,6],[1,2]) Y=[3,4,5,6]

xoadsc([H|T],[H],T):-!.
xoadsc([H|[H1|T]],[H|[H1|T1]],X):-xoadsc([H1|T],[H1|T1],X),!.
xoadsc([H|T],[H1|T1],[H|T2]):-xoadsc(T,[H1|T1],T2).

ktdsc([H|_],[H],1):-!.
ktdsc([H|[H1|T]],[H|[H1|T1]],M):-ktdsc([H1|T],[H1|T1],M1),M=M1+1,!.
ktdsc([_|T],[H1|T1],M):-ktdsc(T,[H1|T1],M),!.

dem([],0):-!.

dem([_|T],N):-dem(T,N1),N=N1+1.

ktds(X,X1):-ktdsc(X,X1,M),dem(X1,N),M=:=N.

xoaxhds([],_,[]):-!.

xoaxhds([H|T],[H1|T1],Y):-
ktds([H|T],[H1|T1]),xoadsc([H|T],[H1|T1],X),xoaxhds(X,[H1|T1],Y),!.
xoaxhds([H|T],[H1|T1],[H|T2]):-xoaxhds(T,[H1|T1],T2).
1. predicates
2. tong(integer,real)
3. clauses
4. tong(0,1):-!.
5. tong(N,M):-N>0,N1=N-1,tong(N1,M1),M=M1+1/(2*N+1).
6. goal
7. write("Nhap N="),readint(N),tong(N,M),
8. write("Tong La:",M)
9.
10.
11.
12. predicates
13. tong(integer,real)
14. gt(integer,integer)
15. clauses
16. gt(0,1).
17. gt(A,B):-A1=A-1,gt(A1,B1),B=B1*A.
18. tong(1,1).
19. tong(A,M):-gt(A,K),A1=A-1,tong(A1,M1),M=M1+1/K.

predicates
so_nguyen_to(integer)
clauses
so_nguyen_to(2):-!.
so_nguyen_to(K):-K<=0,write("KKhong Xet").
so_nguyen_to(M):-M>0,
so_nguyen_to(N),
N<M,
M MOD N <> 0,write("La so nguyen to").
goal
write("Nhap N="),readint(N),so_nguyen_to(N);write("Khong Phai So Nt").

predicates
giaihe(real,real,real,real,real,real)
nghiem(real,real,real,real,real,real,real,real,real)
clauses
giaihe(A1,B1,C1,A2,B2,C2):-D=A1*B2-A2*B1,DX=C1*B2-C2*B1,DY=A1*C2-
A2*C1,nghiem(A1,B1,C1,A1,B2,C2,D,DX,DY),nl.
nghiem(_,_,_,_,_,_,D,DX,_):-D=0,DX<>0,write("VN").
nghiem(_,_,_,_,_,_,D,DX,_):-D=0,DX=0,write("VSN").
nghiem(_,_,_,_,_,_,D,DX,DY):-D<>0,X=DX/D,Y=DY/D,write("X=",X),nl,write("Y=",Y).

goal
write("Nhap he so:"),nl,
write("Nhap A1:"),readreal(A1),nl,
write("Nhap A1:"),readreal(B1),nl,
write("Nhap C1:"),readreal(C1),nl,
write("Nhap A2:"),readreal(A2),nl,
write("Nhap B2:"),readreal(B2),nl,
write("Nhap C2:"),readreal(C2),nl,

giaihe(A1,B1,C1,A2,B2,C2).
1. predicates
2. giai_thua(integer,integer)
3.
4. clauses
5. giai_thua(0,1).
6. giai_thua(N,M):- N>0, N1 = N - 1, giai_thua(N1,M1),M=M1*N. /*quy t¾c*/
7. giai_thua(_,M):-write("N!=",M).
8. goal
9.
10. write("Nhap N = "), readint(N),N>=0,giai_thua(N,M);
11. write("khong xet")
12. predicates
13. mu(integer,integer,integer)
14. clauses
15. mu(0,_,0).
16. mu(1,_,1).
17. mu(_,0,1).
18. mu(X,1,X).
19. mu(X,Y,Z):-Y1=Y-1,mu(X,Y1,Z1),Z=Z1*X.
20. goal
21. write("Nhap X = "),readint(X),
22. write("Nhap Y = "),readint(Y),
23. mu(X,Y,Z),write("Ket qua Z = ",Z)
24. predicates
25. slove(real,real,real,real,real,real)
26. reply(real,real,real)
27. clauses
28.
29. slove(A,B,C,D,E,F):-De=A*E-B*D,Dx=C*E-F*B,Dy=A*F-C*D,
30. reply(De,Dx,Dy).
31. reply(De,Dx,Dy):-De=0,Dx<>0,Dy<>0,write("he pt vn").
32. reply(De,Dx,Dy):-De=0,Dx=0,Dy=0,write("he pt voso nghiem").
33. reply(De,Dx,Dy):-De<>0, X=Dx/De,Y=Dy/De,
34. write("Nghiem cua he la:"),nl,write("X = ",X),nl
35. ,write("Y= ",Y).
36. goal
37. write("Nhap A,B,C,D,E,F."),nl,readreal(A),
38. readreal(B),readreal(C),readreal(D),readreal(E),
39. readreal(F),
40. slove(A,B,C,D,E,F).

Tổng n số Fibonacy đầu tiên


predicates
fibo(integer,integer)
tong(integer,integer)
clauses
fibo(1,1).
fibo(2,1).
fibo(N,M):-N1=N-1,N2=N-2,fibo(N1,M1),fibo(N2,M2),M=M1+M2.
tong(2,2).
tong(A,B):-A>=1,fibo(A,B1),A1=A-1,tong(A1,B2),B=B1+B2.
goal
write("Nhap N="),readint(A),A>=1,
tong(A,B),write("Tong ",A," so Fibonacy dau tien la : ",B).

predicates
heso(integer,real)
tong(integer,real,real)
chay
clauses
chay:-write("Nhap exilon = "),readreal(EX),
tong(0,EX,0).
heso(B,C):-(B mod 2)<>0,C=-1.
heso(B,C):-(B mod 2)=0,C=1.

tong(I,EX,M):-2*I-1<1/EX,I1=I+1,I2=I1+1,heso(I2,C),1/(2*I1-1)<EX,M1=M+C/(2*I1-
1),tong(I1,EX,M1).
tong(_,EX,M):-write("PI/4 với sai số ",EX," la : ",M).
goal chay

predicates
father(String,String)
mother(String,String)
parent(String,String)
ancestor(String,String)
clauses
father(tom,amy).
father(jack,fred).
mother(grace,amy).
mother(amy,fred).
parent(X,Y):-father(X,Y).
parent(X,Y):-mother(X,Y).
ancestor(X,Y):-parent(X,Z),ancestor(Z,Y).
ancestor(X,Y):-parent(X,Y). //trong de co cho cai nay len tren cuoi cung minh lam sai mat roi.
Nan wa //
goal
ancestor(tom,X),write("Tom la to tien cua : ",X).

1. GIAI PTB1:
/*PT ax+b=0*/
gpt(0,0,X):- write('Phuong trinh vo so nghiem').
gpt(0,B,X):- write('Phuong trinh vo nghiem').
gpt(A,B,X):- X is (-B/A).

2/ GIAI PTB2:

viet:- write('Chuong trinh giai phuong trinh bac 2').


gpt(0,0):- write('Phuong trinh vo so nghiem').
gpt(0,E):- write('Phuong trinh vo nghiem').
gpt(D,E):- write('Nghiem cua phuong trinh la:'),nl,X is (-E/D),write('X = '),write(X).

gpt2(0,B,C):- gpt(B,C).

gpt2(A,B,C):- D is (B*B-4*A*C),D< 0 ,write('Phuong trinh vo nghiem').


gpt2(A,B,C):- D is (B*B-4*A*C),D =:=0,write('Phuong trinh co nghiem kep:'),
X is (-B/(2*A)),write('X = '),write(X).
gpt2(A,B,C):- D is (B*B-4*A*C),D >0,write('Phuong trinh co 2 nghiem'),nl,
X is (-B+sqrt(D)/(2*A)),write('X1 = '),write(X),nl,
X1 is (-B-sqrt(D)/(2*A)),write('X2 = '),write(X1).

CAC BAN KIEM TRA LAI NHE.


% Author:
% Date: 10/19/10

Domains
list=integer*
Predicates
insert(integer,list,list)
sort(list,list)
Clauses
insert(E,[],[E]).
insert(E,[A|B],[E,A|B]):- E<=A.
insert(E,[A|B],[A|C]):- E>A,insert(E,B,C).
sort([],[]).
sort([X|R1],L):-sort(R1,R),insert(X,R,L).

You might also like