Bài tập thực hành BProlog 1. Viết vị từ demchan đế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 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_ptdau(N,L,L1,L2) trong đ L1 chứa N phần tử đầu của Lvà L2 chứa phầ 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ừ ptg in ra phầ n tử giữa trong danh sách số nguyên dương, trả về 0 nếu 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ừ hoi, hieu, giao 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ừ dao 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ừ chen(L,E,R) – R là danh sách L trong đó E đã được chèn vào đúng vị trí ( đã đượ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ừ chenDS(L1,L2,L3) – L3 là danh sách L2 đã được chèn vào tất cả nhừng p của danh sách L1 Vd: chenD S( [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
9. Viết vị từ saptang và sapgiam nhận đối số là một danh sách và sắp danh sách theo thứ 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=
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ừ chiahai chia danh sách ra làm hai danh sách con bằ ng nhau, danh sác 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,!. 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ừ xenke(L1,L2,L3) trong đó danh sách L3 được tạo nên bằng cách lấy x phần tử của L1 và L2 Vd: xenk e([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ừ xoaptdau nhận đối số là một danh sách cùng số nguyên dương X và xóa 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ừ xoapt nhận đối số là một danh sách cùng số nguyên dương X và xóa tất 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ừ thaythe(X,Y,L,R) trong đó R là danh sách L mà tất cả các phần tử X đã đư 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ừ xoadsc(L1,L2,L3) trong đó L3 là danh sách L1 đã xóa đi lần xuất hiện đầu 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ừ xoaxhds(L1,L2,L3) trong đó L3 là danh sách L1 đã xóa đi tất cả nhữ ng lầ 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).