Lập trình Logic và ràng buộc GVBM Phan Văn Đức 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 LO.
Trang 1TRƯỜ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
Trang 4MỤC LỤC VIẾT TẮT
NSD: Người sử dụng
NLT: Người lập trình
Trang 5Chươ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 Y = 0 (luật 1) mà 2 < 0 (đích 2) false Tuy Y = 0 (luật 1) mà 2 < 0 (đích 2) false Tuynhiê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:
Trang 6Hì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) Y = 0 (luật 1) mà 2 < 0 (đích 2) false Tuy 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 ưuthờ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 1Nếu không thì (X >= 3 , X < 6)
Y = 2; / luật 2Nế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
Trang 7Hì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 luôn luôn đúng và fail luôn luôn 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ẻocho 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 hoá dữ liệu như là một kỹ thuật lậptrì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àmchương trình trở nên dễ hiểu
Trang 8Trong 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 toá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 hoá phát biểu bài toá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
Trang 9Truy 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ề toà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ácdòng lệnh sau để hỏi về chồng, vợ, các con, tất cả thành viên, lương, khônglươ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:
Trang 10Hì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
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
Trang 11Mỗ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ệnhà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áyin) tương ứng với dòng vào ra chuẩn user
Trang 12Hì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.
Trang 13Hì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ằnglệ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
Trang 14- Lệnh tell(user): đưa về dòng hiện hành là màn hình (có thể thay thế bằnglệnh seen).
Ví dụ 2: Bài toán lũy thừa 3
Giải bài toá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
Trang 15Hì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
Trang 16Vị từ follow đóng vai trò như là việc xóa khoảng trống Số 32 là dấu cáchtrong 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
Trang 172 BÀI TẬP TỔNG HỢP
Trang 194.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
Trang 21Bai 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ínhchấ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
Trang 23Bà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:
14.2 Lời giải
Hình 39 Đáp án câu 14
Trang 24TÀI LIỆU THAM KHẢO
[1] https://www.swi-prolog.org/pldoc/man?section=quickstart, “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] https://voxuanphong.wordpress.com/2017/04/12/bai-tap-danh-sach-prolog/,
“Tổng hợp bài tập lập trình Prolog”, Võ Xuân Phong