BÀI TẬP KIỂM TRA GIỮA KỲ Môn học Lập trình Logic và ràng buộc Học viên Nguyễn Duy Quốc Thái 1 Viết chương trình find max và find min tìm Min và Max của hai số? 2 Tìm phần tử Tìm phần tử cuối cùng của.
Trang 1BÀI TẬP KIỂM TRA GIỮA KỲ Môn học Lập trình Logic và ràng buộc Học viên: Nguyễn Duy Quốc Thái
1. Viết chương trình find_max và find_min tìm Min và Max của hai số?
2. Tìm phần tử
- Tìm phần tử cuối cùng của danh sách:
?- member( c, [ a, b, c ] )
Yes
- Tìm phần tử kề cuối của danh sách? (phần tử cuối cùng thứ 2):
- Tìm phần tử thứ K của một danh sách:
? - member_at(X, [a, b, c, d], 2, R)
X = b
R = [a, c, d]
- Tìm số phần tử của danh sách?
?- length( [ a, b, c, d, e ], L ).
L=5
Yes
?- length( [ a, [ b, c ], d, e ], N ).
N = 4
Yes
Trang 23. Đảo ngược danh sách?
4. Tìm xem một danh sách có phải là một palindrome hay không? Một
palindrome có thể được đọc về phía trước hoặc phía sau; ví dụ: [x, a, m,a, x].
?- palindrome([ x, a, m, a, x ])
Yes
Trang 35. Loại bỏ các phần tử danh sách trùng lặp liên tiếp?
Ví dụ:
:? - remove([a, a, a, a, b, c, c, a, a, d, e, e, e, e], X)
1X = [a, b, c, a, d, e]
6. Đóng gói các phần tử danh sách trùng lặp liên tiếp thành danh sách con?
Ví dụ:
:? - pack([a, a, a, a, b, c, c, a, a, d, e, e, e, e], X)
X = [[a, a, a, a], [b], [c, c], [a, a], [d], [e, e, e, e]]
7. Sao chép các phần tử của danh sách?
Ví dụ:
:? - Dupli([a, b, c, c, d], X)
X = [a, a, b, b, c, c, c, c, d, d]
8. Nhân đôi các phần tử của danh sách một số lần nhất định?
Ví dụ:
:? - Dupli([a, b, c], 3, X)
X = [a, a, a, b, b, b, c, c, c]
9. Bỏ mọi phần tử thứ N khỏi danh sách?
Ví dụ:
:? - drop([a, b, c, d, e, f, g, h, i, k], 3, X)
X = [a, b, d, e, g, h, k]
10. Chia danh sách thành hai phần; chiều dài của phần đầu tiên đã cho?
Ví dụ: :? - split([a, b, c, d, e, f, g, h, i, k], 3, L1, L2).
L1 = [a, b, c]
L2 = [d, e, f, g, h, i, k
Trang 411.Xóa phần tử K khỏi danh sách?
Ví dụ:
? - remove_at(X, [a, b, c, d], 2, R)
X = b
R = [a, c, d]
Trang 5Môn học: Lập trình logic và ràng buộc TS Phan Văn Đức
2
Bài 1 :
+ Tìm Max: X là max khi X >= Y và ngược lại
find_max(X,Y,X):-X>=Y
find_max(X,Y,Y):-X<Y
Trang 6Môn học: Lập trình logic và ràng buộc TS Phan Văn Đức
3
+ Tìm Min : X là min khi X <Y và ngược lại
find_min(X,Y,X):-X<Y
find_min(X,Y,Y):-X>=Y
Bài 2 :
- Tìm phần tử cuối của danh sách :
last([H],H)
last([H|T],L):-last(T,L)
Trang 7Môn học: Lập trình logic và ràng buộc TS Phan Văn Đức
4
- Kiểm tra phần tử K có thuộc danh sách :
member(Z,[H|T])
member((Z,[_|T]):-member(Z,T)
- Tìm số phần tử của danh sách :
sumMem([],0)
sumMem([_|T],N):-sumMem(T,N1), N is N1 +1
Bài 3 :
Sử dụng lệnh reverse với quy tắc reverse([Danh sách],Kết_quả)
Trang 8Môn học: Lập trình logic và ràng buộc TS Phan Văn Đức
5
Trong đó, danh sách là [a,b,c,d,e,f], L là kết quả xuất ra danh sách ngược
Bài 4 :
palindrome(X):-reverse(X,X)
Bài 5 :
remove([],[])
remove([H|T],X):-remove(T,[H],Z),reverse(Z,X)
remove([],X,X)
remove([H|T],[K|Z],X):-H=K,remove(T,[H|Z],X)
remove([H|T],[K|Z],X):-H\=K,remove(T,[H,K|Z],X)
Trang 9Môn học: Lập trình logic và ràng buộc TS Phan Văn Đức
6
Bài 6 :
pack(X,Y) :- pack(X,[],_,Y)
pack([H,H|T],Acc,X,R) :- pack([H|T],[H|Acc],X,R)
pack([H,H1|T], Acc, X,R)
:-H\=H1,
Acc1=[H|Acc],
append(X, [Acc1], X1),
pack([H1|T],[],X1,R)
pack([H], Acc, X,R)
:-Acc1=[H|Acc],
append(X, [Acc1], X1),
R = X1
Trang 10Môn học: Lập trình logic và ràng buộc TS Phan Văn Đức
7
Bài 7 :
dups([],[])
dups([H|T],[H,H|T2]):-dups(T,T2)
Bài 8 :
appendlist([], X, X)
appendlist([H|T], L1, [H|L2]) :- appendlist(T, L1, L2)
dupli([], M, []) :-!
dupli([X], 1, [X]) :-!
dupli([X], M, [X|L]) :- N is M - 1, dupli([X], N, L), !
dupli([H|T], M, L1) :- dupli([H], M, H1), dupli(T, M, T1), appendlist(H1, T1, L1), !
Trang 11Môn học: Lập trình logic và ràng buộc TS Phan Văn Đức
8
Bài 9 :
drop(L, N,
X):-drop2(L, N, X, N)
drop2(_, _, _, 1)
drop2(L, N, X,
C):-N mod C =:= 0,
remove(L, N, X),
Z is C-1,
drop2(L, N, X, Z)
drop2(L, N, X,
C):-Z is C-1,
drop2(L, N, X, Z)
remove([_|T], 1, T)
remove([H|T1], N,
[H|T2]):-N > 1,
Z is N - 1,
remove(T1, Z, T2)
Trang 12Môn học: Lập trình logic và ràng buộc TS Phan Văn Đức
9
Bài 10 :
split([],[],[])
split([X],[X],[])
split([X,Y|T],[X|L1],[Y|L2]):-split(T,L1,L2)
Bài 11 :
remover( _, [], [])
remover( R, [R|T], T2) :- remover( R, T, T2)
remover( R, [H|T], [H|T2]) :- H \= R, remover( R, T, T2)