BỘ GIÁO DỤC VÀ ĐÀO TẠO
BỘ GIAO THÔNG VẬN TẢI
TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI TP.HCM
--------- oOo --------
BÀI TẬP
CHƯƠNG 5: KỸ THUẬT LẬP TRÌNH PROLOG
MƠN HỌC: LẬP TRÌNH LOGIC VÀ RÀNG BUỘC
TP.HCM, 2023
MỤC LỤC
MỤC LỤC
2
MỤC LỤC VIẾT TẮT
4
1. LÝ THUYẾT CHƯƠNG
5
1. KỸ THUẬT NHÁT CẮT VÀ PHỦ ĐỊNH
5
1.1. NHÁT CẮT
5
1.2. PHÉP PHỦ ĐỊNH NOT
6
1.3. PHÉP TRUE VÀ FAIL
7
2. SỬ DỤNG CÁC CẤU TRÚC
7
2.1. CÁC CẤU TRÚC TRONG PROLOG
7
2.2. VÍ DỤ VỀ CƠ SỞ DỮ LIỆU TRONG PROLOG
8
3. LÀM VIỆC VỚI TỆP
10
3.1. LÀM VIỆC VỚI TỆP
10
3.2. LÀM VIỆC VỚI KÝ TỰ
16
2. BÀI TẬP TỔNG HỢP
18
BÀI
1:
18
1.1. CÂU HỎI
18
1.2. LỜI GIẢI
18
BÀI 2:
18
2.1. CÂU HỎI
18
2.2. LỜI GIẢI
19
BÀI 3:
19
3.1. CÂU HỎI
19
3.2. LỜI GIẢI
20
BÀI 4:
20
4.1. CÂU HỎI
20
4.2. LỜI GIẢI
20
TP.HCM, 2023
Nhóm 5
Lập trình logic và ràng buộc
BÀI 5:
20
5.1. CÂU HỎI
20
5.2. LỜI GIẢI
20
BÀI 6:
21
6.1. CÂU HỎI
21
6.2. LỜI GIẢI
21
BÀI 8:
22
8.1. CÂU HỎI
22
8.2. LỜI GIẢI
22
BÀI 9:
22
9.1. CÂU HỎI
22
9.2. LỜI GIẢI
22
BÀI 10:
22
10.1. CÂU HỎI
22
10.2. LỜI GIẢI
23
BÀI 11:
23
11.1. CÂU HỎI
23
11.2. LỜI GIẢI
23
BÀI 12:
23
12.1. CÂU HỎI
23
12.2. LỜI GIẢI
23
BÀI 13:
24
13.1. CÂU HỎI
24
13.2. LỜI GIẢI
24
BÀI 14:
24
14.1. CÂU HỎI
24
14.2. LỜI GIẢI
25
tài liệu tham khảo
26
Nhóm thực hiện: Nhóm 5
Trang 3 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
MỤC LỤC VIẾT TẮT
NSD: Người sử dụng
NLT: Người lập trình
Nhóm thực hiện: Nhóm 5
Trang 4 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
1. LÝ THUYẾT CHƯƠNG
1. KỸ THUẬT NHÁT CẮT VÀ PHỦ ĐỊNH
1.1. Nhát cắt
Nhát cắt ngăn cản sự quay lui, không những làm tăng hiệu quả chạy chương
trình mà cịn làm tối ưu tính biểu hiện của ngôn ngữ. Chỉ ra cho Prolog thấy con
đường dẫn đến thất bại.
Chương trình khơng dùng lát cắt:
Hình 1 Chương trình Prolog khơng có nhát cắt
Truy vấn và kế quả:
Hình 2 Kết quả truy vấn chương trình khơng có nhát cắt
Quá trình thực hiện: là X = 1 < 3 Y = 0 (luật 1) mà 2 < 0 (đích 2) false.
Tuy nhiên, Prolog sẽ khơng trả kết quả false ngay mà sẽ kiểm tra tiếp luật 2 và
luật 3. Ta biết nó sẽ sai tiếp (do X = 1) nhưng Prolog thì khơng.
Chương trình dùng lát cắt:
Nhóm thực hiện: Nhóm 5
Trang 5 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Hình 3 Chương trình có sử dụng nhát cắt
Truy vấn và kế quả:
Hình 4 Kết quả truy vấn chương trình có sử dụng nhát cắt
Quá trình thực hiện: là X = 1 < 3 Y = 0 (luật 1) mà 2 < 0 (đích 2) false.
Prolog sẽ trả kết quả false ngay mà không kiểm tra tiếp luật 2 và luật 3 tối ưu
thời gian xử lý.
Nhát cắt cho phép tạo ra các kết luận loại trừ nhau dạng:
Nếu (X < 3)
Y = 0;
/ luật 1
Nếu khơng thì (X >= 3 , X < 6)
Y = 2;
/ luật 2
Nếu không
Y = 4;
/ luật 3
1.2. Phép phủ định NOT
not Goal : true = Goal : false
Giải thích như sau nếu not Goal đúng thì Goal khơng not là sai.
Nhóm thực hiện: Nhóm 5
Trang 6 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Hình 5 Ví dụ về phép phủ định
1.3. Phép true và fail
Prolog có hai đích đặc biệt là true ln ln đúng và fail ln ln sai.
Hình 6 Ví dụ về true và fail
Hình 7 kết quả truy vấn của ví dụ true và fail
Chương trình vẫn sẽ cho kết quả đúng khi khơng có true và fail. Tuy nhiên, ta
sẽ dùng chúng khi muốn chỉ định trực tiếp kết quả cho Prolog biết.
2. SỬ DỤNG CÁC CẤU TRÚC
2.1. Các cấu trúc trong Prolog
Trong Prolog, tập hợp các sự kiện đủ để biểu diễn một cơ sở dữ liệu.
Kỹ thuật đặt câu hỏi và so khớp của Prolog là những phương tiện mềm dẻo
cho phép truy cập từ cơ sở dữ liệu những thông tin có câu trúc.
Cần sử dụng phương pháp trừu tượng hố dữ liệu như là một kỹ thuật lập
trình cho phép sử dụng các câu trúc dữ liệu phức tạp một cách đơn giản, làm
chương trình trở nên dễ hiểu.
Nhóm thực hiện: Nhóm 5
Trang 7 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Trong Prolog, phương pháp trừu tượng hoá dữ liệu rất dễ triển khai.
Người ta có thể tiếp cận đến nhiều lời giải khác nhau cho một bài toán nhờ sử
dụng nhiều cách biểu diễn dữ liệu khác nhau.
Cách biểu diễn dữ liệu sử dụng nhiều thơng tin tiết kiệm được tính tốn, mặc
dù làm cho chương trình trở nên rườm rà, khó cơ đọng.
Kỹ thuật tổng quát hoá một bài toán, tuy trừu tượng, nhưng lại làm tăng khả
năng hướng đến lời giải, làm đơn giản hố phát biểu bài tốn.
2.2. Ví dụ về cơ sở dữ liệu trong Prolog
Cấu trúc của một gia đình như sau:
Hình 8 Cấu trúc minh họa của một gia đình 4 thành viên
Khai báo gia đình này trong Prolog như sau:
Hình 9 Câu lệnh khai báo trong Prolog về gia đình 4 thành viên
Nhóm thực hiện: Nhóm 5
Trang 8 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Truy vấn liệu người đầu tiên trong family có phải họ Smith khơng?:
Hình 10 Hỏi Prolog xem người đầu tiên có phải tên là Smith khơng?
Truy vấn thơng tin người đầu tiên trong family?:
Hình 11 Hỏi Prolog về tồn bộ thơng tin của người đầu tiên
Truy vấn dài dòng người sử dụng dể gặp lỗi. Rất khó cho người mới có thể
thực hiện được truy vấn. Do đó để người dung dể dàng truy vấn ta thêm các
dòng lệnh sau để hỏi về chồng, vợ, các con, tất cả thành viên, lương, không
lương. Ta thêm các dịng mơ tả như sau:
Hình 12 Mơ tả cụ thể các trường thông tin của family
Bây giờ ta sẽ thử truy vấn Prolog để kiểm tra:
Nhóm thực hiện: Nhóm 5
Trang 9 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Hình 13 Truy vấn Prolog với các câu hỏi mới
Thông tin được truy vấn dễ dàng hơn tuy nhiên chương trình lại trở nên rườm
rà hơn.
3. LÀM VIỆC VỚI TỆP
3.1. Làm việc với tệp
Giống như các ngơn ngữ lập trình khác, Prolog xem các thiết bị vào ra chuẩn
(bàn phím, màn hình) là các tệp đặc biệt. Quá trình vào ra trên các thiết bị này
và trên các thiết bị lưu trữ ngoài được xem là quá trình làm việc với các tệp.
Hình 14 Liên lạc giữa trình Prolog và nhiều tệp
Nhóm thực hiện: Nhóm 5
Trang 10 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Mỗi một chương trình Prolog chỉ có 1 dịng vào hiện hành và 1 dòng ra hiện
hành.
Tệp đang được đọc gọi là dòng hiện hành ( active input stream). Tệp đang
được ghi được gọi là dòng ra hiện hành (active output stream).
Tệp đang được đọc là bàn phím và tệp đang được ghi là màn hình (hoặc máy
in) tương ứng với dịng vào ra chuẩn user.
Nhóm thực hiện: Nhóm 5
Trang 11 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Hình 15 Một số vị từ làm việc với tệp
Ví dụ về việc đọc một tệp.
Hình 16 Truy vấn gọi tệp exp.pl và đọc hạng đầu tiên.
Nhóm thực hiện: Nhóm 5
Trang 12 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Hình 17 Tệp exp.pl được tạo sẵn
Trong đó:
- Lệnh see(‘exp.pl’): dùng để chọn dịng vào hiện hành là file exp.pl (đã
được tạo sẵn).
- Lệnh read(T): đọc một hạng đầu tiên.
- Lệnh see(user): đưa về dịng hiện hành là bàn phím (có thể thay thế bằng
lệnh told).
Ví dụ về việc ghi một tệp.
Hình 18 Ghi vào tệp exp.pl nội dung parent(huu,vinh).
Hình 19 Nội dung đã được ghi vào file exp.pl
Trong đó:
- Lệnh tell(‘exp.pl’): dùng để chọn dòng ra hiện hành là file exp.pl (đã
được tạo sẵn).
- Lệnh write(‘parent(huu,vinh).’): ghi ghi nội dung vào tệp.
Nhóm thực hiện: Nhóm 5
Trang 13 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
- Lệnh tell(user): đưa về dịng hiện hành là màn hình (có thể thay thế bằng
lệnh seen).
Ví dụ 2: Bài tốn lũy thừa 3.
Giải bài tốn với câu lệnh thơng thường:
Hình 20 Câu lệnh bình thường cho lũy thừa 3
Hình 21 21 Kết quả cho chương trình lũy thừa 3 dùng câu lệnh bình thường
NSD cần gọi hàm cube nhiều lần khi cần truy vấn nhiều lần.
Ta sẽ sử dụng các hàm làm việc với tệp để người dùng tự nhập nhiều lần.
Hình 22 Câu lệnh có sử dụng các vị từ làm việc với tệp
Nhóm thực hiện: Nhóm 5
Trang 14 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Hình 23 Kết quả truy vân tệp chuẩn
NSD không cần gọi hàm cube nhiều lần khi cần truy vấn nhiều lần.
3.2. Làm việc với ký tự
Làm việc với các ký tự: ta vận dụng các vị từ sở hình số 15 để tác động lên
ký tự.
Ví Dụ: Nhập chuỗi từ bàn phím và xóa dấu cách dư thừa:
Hình 24 Chương trình Prolog xóa dấu cách thừa
Hình 25 Truy vấn kết quả của chương trình xóa dấu cách thừa
Nhóm thực hiện: Nhóm 5
Trang 15 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Vị từ follow đóng vai trị như là việc xóa khoảng trống. Số 32 là dấu cách
trong mã ASCII, 44 là dấu chấm trong mã ASCII.
Prolog có vị từ name cho phép tương tác với các nguyên tử với các mã
ASCII.
name(Word, Detail)
Trong đó Word là các ký tự hoặc chuỗi trong dấu nháy đơn, Detail là kết quả
mã ASCII trả về cho từng ký tự của Word.
Hình 26 Ví dụ về vị từ name
Nhóm thực hiện: Nhóm 5
Trang 16 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
2. BÀI TẬP TỔNG HỢP
BÀI 1:
1.1. Câu hỏi
1.2. Lời giải
Hình 27 Đáp án câu 1
BÀI 2:
2.1. Câu hỏi
Nhóm thực hiện: Nhóm 5
Trang 17 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
2.2. Lời giải
Hình 28 Đáp án câu 2
BÀI 3:
3.1. Câu hỏi
3.2. Lời giải
Nhóm thực hiện: Nhóm 5
Trang 18 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Hình 29 Đáp án câu 3
BÀI 4:
4.1. Câu hỏi
Bài 4 cho hai sách accept và reject, hãy viết danh sách các đích sử dụng kỹ
thuật quay lui và quan hệ member và not để tìm các phần tử có mặt trong accept
nhưng khơng có mặt trong reject.
4.2. Lời giải
Hình 30 Đáp án câu 4
BÀI 5:
5.1. Câu hỏi
Bài 5 Định nghĩa thủ tục difference(Set1,Set2,SetDiff) tìm hiệu hai tập hợp Set1
và Set2 với quy ước tập hợp được biểu diễn bởi các danh sách. Chẳn hạn:
5.2. Lời giải
Nhóm thực hiện: Nhóm 5
Trang 19 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Hình 31 Đáp án bài 5
BÀI 6:
6.1. Câu hỏi
Bai 6 Hãy định nghĩa vị từ unifiable(List1,Term,List2) để kiểm tra so khớp,
trong đó List2 là danh sách tất cả các phần tử của List1 có thể so khớp với Term
nhưng không thực hiện phép thế trên các biến đã được so khớp. Ví dụ:
?- unfiable([X,bibo,t(Y)],t(a),List).
List=[X,t(Y)]
6.2. Lời giải
Hình 32 Đáp án bài 6
BÀI 8:
8.1. Câu hỏi
Nhóm thực hiện: Nhóm 5
Trang 20 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Bai 8 Cho f một tệp chứa hạng hãy định nghĩa thủ tục findTerm(Term) để đưa
ra màn hình hạng đầu tiên của f khớp được với Term?
8.2. Lời giải
Hình 33 Đáp án bài 8
BÀI 9:
9.1. Câu hỏi
Bài 9 Cho f một tệp chứa các hạng, hãy định nghĩa thủ tục findallterm(Term)
để đưa ra màn hình tất cả các hạng của f khớp được với Term? Kiểm tra tính
chất biến Term khơng thể được gán giá trị khi thực hiện tìm kiếm.
9.2. Lời giải
Hình 34 Đáp án bài 9
BÀI 10:
10.1. Câu hỏi
Bài 10 Hãy mở rộng thủ tục del_space đã được trình bày trong phần lý thuyết để
có thể xử lý loại bỏ các dấu cách thừa nằm trước dấu phẩy (comma) và chỉ giữ
lại một dấu cách nằm ngay sau dấu phẩy.
10.2. Lời giải
Nhóm thực hiện: Nhóm 5
Trang 21 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Hình 35 Đáp án bài 10
BÀI 11:
11.1. Câu hỏi
Bài 11 Tương tự bài 3 cho các dấu chấm câu khác nhau như dấu chấm
(period), dấu chấm phẩy (semicolon), dấu chấm hỏi (question mark), v.v…
11.2. Lời giải
Hình 36 Đáp án câu 11
BÀI 12:
12.1. Câu hỏi
Bai 12 Định nghĩa quan hệ firstchar(Atom,Char) cho phép kiểm tra Char có
phải là ký tự đầu tiên của Atom hay khơng (Atom bắt đầu bởi Char)?
12.2. Lời giải
Hình 37 Đáp án bài 12
BÀI 13:
13.1. Câu hỏi
Nhóm thực hiện: Nhóm 5
Trang 22 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
Bài 13 Định nghĩa thủ tục cho phép đổi một danh từ tiếng Anh từ số ít
(singular) sang số nhiều (plural) được thực hiện như sau:
?- plural(table,X).
X=tables
Yes
13.2. Lời giải
Hình 38 Đáp án bài 13
BÀI 14:
14.1. Câu hỏi
Bài 14 Áp dụng thủ tục readsentence đã được trình bày trong phần lý thuyết
để xây dựng thủ tục:
?-find(Keyword,Sentence).
Cho phép tìm trong tệp đang đọc một câu chứa từ khóa Keyword. Câu
Sentence phải ở dạng mới được đọc vào chưa xử lý, nghĩa là biểu diễn bởi một
chuỗi ký tự, hoặc bởi một nguyên tử.
14.2. Lời giải
Hình 39 Đáp án câu 14
Nhóm thực hiện: Nhóm 5
Trang 23 trên 24
GVHD: TS. Phan Văn Đức
Nhóm 5
Lập trình logic và ràng buộc
TÀI LIỆU THAM KHẢO
[1] “Prolog
Tutorials”, SWI Prolog.
[2] Lập trình Lơgích trong Prolog, PSG. TS. Phan Duy Khánh, Nhà Xuất Bản
Đại Học Quốc Gia Hà Nội, 2004.
[3] />“Tổng hợp bài tập lập trình Prolog”, Võ Xuân Phong.
Nhóm thực hiện: Nhóm 5
Trang 24 trên 24
GVHD: TS. Phan Văn Đức