TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI TP HCM BÁO CÁOMÔ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í Min.
Trang 1BÁ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
Trang 3PHẦ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
Trang 46.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
Trang 512.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
Trang 10?- [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ềunà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ànhphầ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 danhsách các thành phần của nó
Trang 11?- 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 danhsá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ợpcon 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ậphợ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ịchProlog, nó sẽ trả về true, cho biết rằng [4,3] là tập hợp con của [2,3,5,4]
Trang 14Khi 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ịchProlog, 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 đượcdanh 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ịchProlog, 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:
Trang 158 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:
Trang 169 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:
Trang 1810.3 Mô phỏng SWI - Prolog:
Trang 2012 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:
Trang 21tử 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ánvới giá trị mong đợi Nếu mọi phép toá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
Trang 2213.3 Mô phỏng SWI - Prolog:
14 BÀI TẬP 14.
14.1 Đề bài:
Trang 2314.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:
Trang 2415.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 haykhô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 danhsách L2 hay không
Ví dụ:
?- prefixe([a,b], [a,b,c,d])
true
Trang 25?- suffixe([c,d], [a,b,c,d]).
true
?- isin([a,c], [a,b,c,d])
true
Trang 2716.3 Mô phỏng SWI - Prolog: