Tải bản đầy đủ (.doc) (26 trang)

Lời giải bài tập prolog chương 5 Kỹ thuật lập trình prolog môn lập trình logic và ràng buộc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (7.14 MB, 26 trang )

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



×