TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI TP.HCM
BÁO CÁO MÔN LẬP TRÌNH LOGIC VÀ
RÀNG BUỘC
Người thực hiện: Nguyễn Duy Quốc Thái
Nguyễn Thanh Lưu
Tên lớp: TD2201
Giảng viên hướng dẫn:TS. Phan Văn Đức
TP. Hồ Chí Minh, tháng 03 năm 2023
MỤC LỤC
PHẦN 1: BÀI TẬP CHƯƠNG 4 .............................................................................................. 1
1. BÀI TẬP 1. ........................................................................................................................1
1.1. Đề bài: .............................................................................................................................1
1.2. Lời giải: .......................................................................................................................... 1
1.3. Mô phỏng SWI-Prolog. .................................................................................................. 1
2. BÀI TẬP 2. ........................................................................................................................2
2.1. Đề bài: .............................................................................................................................2
2.2. Lời giải: .......................................................................................................................... 2
2.3. Mô phỏng SWI-Prolog: ..................................................................................................2
3. BÀI TẬP 3. ........................................................................................................................3
3.1. Đề bài: .............................................................................................................................3
3.2. Lời giải: .......................................................................................................................... 3
3.3. Mô phỏng SWI - Prolog: ................................................................................................3
4. BÀI TẬP 4. ........................................................................................................................4
4.1. Đề bài: .........................................................................................................................4
4.2. Lời giải: ...................................................................................................................... 4
4.3. Mô phỏng SWI - Prolog: ............................................................................................4
5. BÀI TẬP 5. ........................................................................................................................5
5.1. Đề bài: .........................................................................................................................5
5.2. Lời giải: ...................................................................................................................... 5
6. BÀI TẬP 6. ........................................................................................................................6
6.1. Đề bài: .........................................................................................................................6
1
6.2. Lời giải: ...................................................................................................................... 6
6.3. Mô phỏng SWI - Prolog: ............................................................................................6
7. BÀI TẬP 7. ........................................................................................................................8
7.1. Đề bài: .........................................................................................................................8
7.2. Lời giải: ...................................................................................................................... 8
7.3. Mô phỏng SWI - Prolog: ............................................................................................9
8. BÀI TẬP 8. ......................................................................................................................10
8.1. Đề bài: ...................................................................................................................... 10
8.2. Lời giải: .................................................................................................................... 10
8.3. Mô phỏng SWI - Prolog: ..........................................................................................10
9. BÀI TẬP 9. ......................................................................................................................11
9.1. Đề bài: ...................................................................................................................... 11
9.2. Lời giải: .................................................................................................................... 11
9.3. Mô phỏng SWI - Prolog: ..........................................................................................11
10. BÀI TẬP 10. ..................................................................................................................12
10.1. Đề bài: .................................................................................................................... 12
10.2. Lời giải: .................................................................................................................. 12
10.3. Mô phỏng SWI - Prolog: ........................................................................................13
11. BÀI TẬP 11. ..................................................................................................................13
11.1. Đề bài: .................................................................................................................... 13
11.2. Lời giải: .................................................................................................................. 13
11.3. Mô phỏng SWI - Prolog: ........................................................................................14
12. BÀI TẬP 12. ..................................................................................................................15
12.1. Đề bài: .................................................................................................................... 15
2
12.2. Lời giải: .................................................................................................................. 15
12.3. Mô phỏng SWI - Prolog: ........................................................................................15
13. BÀI TẬP 13. ..................................................................................................................16
13.1. Đề bài: .................................................................................................................... 16
13.2. Lời giải: .................................................................................................................. 16
13.3. Mô phỏng SWI - Prolog: ........................................................................................17
14. BÀI TẬP 14. ..................................................................................................................17
14.1. Đề bài: .................................................................................................................... 17
14.2. Lời giải: .................................................................................................................. 18
14.3. Mô phỏng SWI - Prolog: ........................................................................................18
15. BÀI TẬP 15. ..................................................................................................................18
15.1. Đề bài: .................................................................................................................... 18
15.2. Lời giải: .................................................................................................................. 19
15.3. Mô phỏng SWI - Prolog: ........................................................................................19
16. BÀI TẬP 16. ..................................................................................................................21
16.1. Đề bài: .................................................................................................................... 21
16.2. Lời giải: .................................................................................................................. 21
16.3. Mô phỏng SWI - Prolog: ........................................................................................22
17. BÀI TẬP 17. ..................................................................................................................23
17.1. Đề bài: .................................................................................................................... 23
17.2. Lời giải: .................................................................................................................. 23
17.3. Mô phỏng SWI - Prolog: ........................................................................................23
3
Mơn học: Lập trình logic và ràng buộc
GVHD:TS. Phan Văn Đức
PHẦN 1: BÀI TẬP CHƯƠNG 4
1. BÀI TẬP 1.
1.1. Đề bài:
1.2. Lời giải:
Giải:
remove_last_three(L, L1) :- append(L1, [_,_,_], L).
1.3. Mô phỏng SWI-Prolog.
1
Mơn học: Lập trình logic và ràng buộc
GVHD: TS. Phan Văn Đức
2. BÀI TẬP 2.
2.1. Đề bài:
2.2. Lời giải:
remove_first_and_last_three(L, L2) :- append([_,_,_], L1, L), append(L2, [_,_,_], L1).
2.3. Mô phỏng SWI-Prolog:
2
Mơn học: Lập trình logic và ràng buộc
GVHD:TS. Phan Văn Đức
3. BÀI TẬP 3.
3.1. Đề bài:
3.2. Lời giải:
last_element_append(Object, List) :- append(_, [Object], List).
last_element_no_append(Object, [Object]).
last_element_no_append(Object, [_|T]) :- last_element_no_append(Object, T).
3.3. Mô phỏng SWI - Prolog:
3
Mơn học: Lập trình logic và ràng buộc
GVHD: TS. Phan Văn Đức
4. BÀI TẬP 4.
4.1. Đề bài:
4.2. Lời giải:
even_length([]).
even_length([_,_|Tail]) :- even_length(Tail).
odd_length([_]).
odd_length([_,_|Tail]) :- odd_length(Tail).
4.3. Mô phỏng SWI - Prolog:
4
Mơn học: Lập trình logic và ràng buộc
GVHD:TS. Phan Văn Đức
5. BÀI TẬP 5.
5.1. Đề bài:
5.2. Lời giải:
?- [1,2,3] = [1|X]. sẽ trả về true và gán giá trị cho biến X là [2,3]. Điều này có nghĩa là danh
sách [1,2,3] có thể được viết dưới dạng [1|[2,3]].
?- [1,2,3] = [1,2|X]. cũng sẽ trả về true và gán giá trị cho biến X là [3]. Điều này có nghĩa là
danh sách [1,2,3] có thể được viết dưới dạng [1,2|[3]].
?- [1|[2,3]] = [1,2,X]., Prolog sẽ trả về true và gán giá trị cho biến X là 3. Điều này có nghĩa
là danh sách [1|[2,3]] có thể được viết dưới dạng [1,2,3].
?- [1|[2,3,4]] = [1,2,x]., Prolog sẽ trả về false vì hai danh sách không giống nhau về cấu trúc.
?- [1|[2,3,4]] = [1,2|X]., Prolog sẽ trả về true và gán giá trị cho biến X là [3,4]. Điều này có
nghĩa là danh sách [1|[2,3,4]] có thể được viết dưới dạng [1,2|[3,4]].
?- b(o,n,j,o,u,r) = ..L., Prolog sẽ trả về true và gán giá trị cho biến L là [b,o,n,j,o,u,r]. Điều
này có nghĩa là cấu trúc b(o,n,j,o,u,r) có thể được viết dưới dạng một danh sách các thành
phần của nó.
?- bon(Y) = ..[X,jour]., Prolog sẽ trả về true và gán giá trị cho biến X là bon và
biến Y là jour. Điều này có nghĩa là cấu trúc bon(Y) có thể được viết dưới dạng một danh
sách các thành phần của nó.
5
Mơn học: Lập trình logic và ràng buộc
GVHD: TS. Phan Văn Đức
?- X(Y) = ..[bon,jour]., Prolog sẽ trả về true và gán giá trị cho biến X là bon và
biến Y là jour. Điều này có nghĩa là cấu trúc X(Y) có thể được viết dưới dạng một danh
sách các thành phần của nó.
6. BÀI TẬP 6.
6.1. Đề bài:
6.2. Lời giải:
subset2([], _).
subset2([H|T], Y) :- member(H, Y), subset2(T, Y).
6.3. Mô phỏng SWI - Prolog:
Đây là một đoạn code Prolog đơn giản có thể kiểm tra xem một danh sách có phải là tập hợp
con của một danh sách khác không:
subset2([], _).
subset2([H|T], Y) :- member(H, Y), subset2(T, Y).
Trong đó, subset2([], _). là một trường hợp cơ sở cho biết rằng một danh sách rỗng là tập
hợp con của bất kỳ danh sách nào.
subset2([H|T], Y) :- là một quy tắc cho biết rằng nếu phần tử đầu tiên H của danh
sách [H|T] là một phần tử của danh sách Y, và nếu các phần tử còn lại T của danh
sách [H|T] cũng là tập hợp con của danh sách Y, thì [H|T] là tập hợp con của Y.
Khi chạy câu hỏi ?- subset2([4,3], [2,3,5,4]). với đoạn code này trong một trình thơng dịch
Prolog, nó sẽ trả về true, cho biết rằng [4,3] là tập hợp con của [2,3,5,4].
6
Mơn học: Lập trình logic và ràng buộc
GVHD:TS. Phan Văn Đức
7
Mơn học: Lập trình logic và ràng buộc
GVHD: TS. Phan Văn Đức
7. BÀI TẬP 7.
7.1. Đề bài:
7.2. Lời giải:
takeout(X, [X|R], R).
takeout(X, [F|R], [F|S]) :- takeout(X,R,S).
Trong đó, takeout(X, [X|R], R). là một trường hợp cơ sở cho biết rằng nếu X là phần tử đầu
tiên của danh sách [X|R], thì danh sách kết quả R sẽ khơng có phần tử X.
takeout(X, [F|R], [F|S]) :- takeout(X,R,S). là một quy tắc cho biết rằng nếu X không phải là
phần tử đầu tiên của danh sách [F|R], thì chúng ta sẽ lấy ra X từ danh sách con R và kết quả
sẽ được lưu trong danh sách S. Sau đó, chúng ta thêm phần tử đầu tiên F vào danh sách kết
quả [F|S].
8
Mơn học: Lập trình logic và ràng buộc
GVHD:TS. Phan Văn Đức
Khi chạy câu hỏi ?- takeout(3, [1,2,3], [1,2]). với đoạn code này trong một trình thơng dịch
Prolog, nó sẽ trả về true, cho biết rằng khi lấy ra phần tử 3 từ danh sách [1,2,3], ta được
danh sách kết quả [1,2].
Khi chạy câu hỏi ?- takeout(X,[1,2,3],L). với đoạn code này trong một trình thơng dịch
Prolog, nó sẽ trả về nhiều kết quả khác nhau cho biến X và L. Điều này cho biết rằng có
nhiều cách để lấy ra một phần tử từ danh sách [1,2,3].
7.3. Mô phỏng SWI - Prolog:
9
Mơn học: Lập trình logic và ràng buộc
GVHD: TS. Phan Văn Đức
8. BÀI TẬP 8.
8.1. Đề bài:
8.2. Lời giải:
getEltFromList([H|_], 0, H).
getEltFromList([_|T], N, E) :- N > 0, N1 is N - 1, getEltFromList(T, N1, E).
8.3. Mô phỏng SWI - Prolog:
10
Mơn học: Lập trình logic và ràng buộc
GVHD:TS. Phan Văn Đức
9. BÀI TẬP 9.
9.1. Đề bài:
9.2. Lời giải:
maxmin(List, Max, Min) :-max_list(List, Max), min_list(List, Min).
9.3. Mô phỏng SWI - Prolog:
11
Mơn học: Lập trình logic và ràng buộc
GVHD: TS. Phan Văn Đức
10. BÀI TẬP 10.
10.1. Đề bài:
10.2. Lời giải:
flatten([], []).
my_flatten(X,[X]) :- \+ is_list(X).
my_flatten([],[]).
my_flatten([X|Xs],Zs) :- my_flatten(X,Y), my_flatten(Xs,Ys), append(Y,Ys,Zs).
12
Mơn học: Lập trình logic và ràng buộc
GVHD:TS. Phan Văn Đức
10.3. Mô phỏng SWI - Prolog:
11. BÀI TẬP 11.
11.1. Đề bài:
11.2. Lời giải:
% Kiểm tra xem một phần tử có thuộc một tập hợp hay không
?- member(a, [a, b, c]).
true.
% Tìm hợp của hai tập hợp
?- union([a, b], [b, c], Union).
13
Mơn học: Lập trình logic và ràng buộc
GVHD: TS. Phan Văn Đức
Union = [a, b, c].
% Tìm giao của hai tập hợp
?- intersection([a, b], [b, c], Intersection).
Intersection = [b].
% Kiểm tra xem một tập hợp có là tập con của một tập hợp khác hay không
?- subset([a], [a, b]).
true.
11.3. Mô phỏng SWI - Prolog:
14
Mơn học: Lập trình logic và ràng buộc
GVHD:TS. Phan Văn Đức
12. BÀI TẬP 12.
12.1. Đề bài:
12.2. Lời giải:
disjoint(List1, List2) :- forall(member(X, List1), \+ member(X, List2)).
12.3. Mô phỏng SWI - Prolog:
15
Mơn học: Lập trình logic và ràng buộc
GVHD: TS. Phan Văn Đức
13. BÀI TẬP 13.
13.1. Đề bài:
13.2. Lời giải:
Vị từ forall(Cond, Action) thực hiện kiểm tra sự so khớp tương ứng giữa Cond và Action.
Nếu Cond đúng cho mọi trường hợp, thì Action cũng phải đúng cho mọi trường hợp đó.
Trong ví dụ của bạn, forall/2 được sử dụng để kiểm tra xem mọi phép toán số học trong
danh sách L có đúng đắn hay khơng. Vị từ member/2 được sử dụng để duyệt qua từng phần
tử của danh sách L, và mỗi phần tử được kiểm tra bằng cách so sánh kết quả của phép toán
với giá trị mong đợi. Nếu mọi phép tốn đều đúng đắn, thì câu truy vấn sẽ trả về true.
Ví dụ:
?- forall(member(Result = Formula, [2 = 1 + 1, 4 = 2 * 2]), Result =:= Formula).
true.
16
Mơn học: Lập trình logic và ràng buộc
GVHD:TS. Phan Văn Đức
13.3. Mô phỏng SWI - Prolog:
14. BÀI TẬP 14.
14.1. Đề bài:
17
Mơn học: Lập trình logic và ràng buộc
GVHD: TS. Phan Văn Đức
14.2. Lời giải:
subset3(Sub, Set) :- forall(member(X, Sub), member(X, Set)).
14.3. Mô phỏng SWI - Prolog:
15. BÀI TẬP 15.
15.1. Đề bài:
18
Mơn học: Lập trình logic và ràng buộc
GVHD:TS. Phan Văn Đức
15.2. Lời giải:
prefixe(L1, L2) :- append(L1, _, L2).
suffixe(L1, L2) :- append(_, L1, L2).
isin([], _).
isin([H|T], L2) :- member(H, L2),
isin(T, L2).
15.3. Mô phỏng SWI - Prolog:
Có thể sử dụng vị từ append/3 để viết các chương trình Prolog thực hiện các việc sau:
- prefixe(L1, L2): kiểm tra xem danh sách L1 có đứng trước danh sách L2 hay không.
- suffixe(L1, L2): kiểm tra xem danh sách L1 có đứng sau danh sách L2 hay không.
- isin(L1, L2): kiểm tra xem các phần tử của danh sách L1 có mặt trong danh sách L2 hay
khơng.
Đây là một ví dụ về cách viết các chương trình này:
prefixe(L1, L2) :- append(L1, _, L2).
suffixe(L1, L2) :- append(_, L1, L2).
isin([], _).
isin([H|T], L2) :- member(H, L2), isin(T, L2).
Chương trình prefixe/2 và suffixe/2 sử dụng vị từ append/3 để kiểm tra xem danh
sách L1 có đứng trước hoặc đứng sau danh sách L2 hay khơng. Chương trình isin/2 sử dụng
đệ quy để duyệt qua từng phần tử của danh sách L1 và kiểm tra xem chúng có thuộc danh
sách L2 hay khơng.
Ví dụ:
?- prefixe([a,b], [a,b,c,d]).
true.
19
Mơn học: Lập trình logic và ràng buộc
GVHD: TS. Phan Văn Đức
?- suffixe([c,d], [a,b,c,d]).
true.
?- isin([a,c], [a,b,c,d]).
true.
20