Bài tập chương

Một phần của tài liệu Giáo trình lập trình logic trong prolog phần 2 nxb đại học quốc gia (Trang 83 - 86)

III. Quá trình vào-ra và làm việc với tệp 1.Khái niệm

Bài tập chương

1. Cho chương trình : p( 1 ).

p( 2 ) :- !. p( 3 ).

Cho biết các câu trả lời của Prolog tù các câu hỏi sau : (a) ?- p( X ).

(b) ?- p( X ), p( Y ). (c) ?- p( X ), !, p( Y ).

2. Quan hệ sau đây cho biết một số có thể là dương, bằng không, hoặc âm : sign( Number, positive) :-

Number > 0. sign( 0, null).

sign( Number, negative) :- Number < 0.

Hãy sử dụng kỹ thuật nhát cắt để viết lại chương trình trên hiệu quả hơn. 3. Thủ tục separate(Number, Positive, Negative) xếp các phần tử

trong danh sách Number lần lượt thành hai danh sách, danh sách Positive chỉ chứa các số dương, hoặc bằng không, danh sách Negative chỉ chứa các số âm. Ví dụ :

separate( [ 3, -1, 0, 5, -2 ], [ 3, 0, 5 ], [ -1, -2 ] ) Hãy định nghĩa thủ tục trên theo hai cách, một cách không sử dụng kỹ thuật nhát cắt, một cách có sử dụng kỹ thuật nhát cắt.

178 Lập trình lägich trong Prolog

4. Cho hai danh sách, Accept và Reject, hãy viết danh sách các đích sử dụng kỹ thuật quay lui và các 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.

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 các tập hợp được biểu diễn bởi các danh sách.. Chẳng hạn :

difference( [ a, b, c, d ], [ b, d, e, f ], [ a, c ] ) 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ụ :

?- unifiable( [ X, bibo, t( Y ) ], t(a), List ). List = [X, t( Y )]

Chú ý rằng X và Y vẫn là các biến tự do không thực hiện phép thế t(a) cho X, hay phép thế a cho Y. Muốn vậy, thực hiện hướng dẫn sau :

Sử dụng phép phủ định not( Term1 = Term2). Nếu quan hệ Term1 = Term2 được thoả mãn, khi đó, not( Term1 = Term2) sẽ thất bại, và phép thế biến không xảy ra.

7. Bài toán mã đi tuần. Giả sử các ô của bàn cờ vua 8×8 được biểu diễn bởi các cặp toạ độ có dạng X/Y, với X và Y nằm trong khoảng 1 và 8.

(a)Định nghĩa quan hệ jump( case1, case2 ), bằng cách sử dụng luật đi của quân mã, và giả sử rằng case1 luôn luôn bị ràng buộc. Ví dụ :

?- jump( 1/1, C ). C = 3/2;

C = 2/3; No No

(b)Định nghĩa quan hệ mvt_ knight( path ), với path là một danh sách gồm các ô biểu diễn lộ trình các bước nhảy hợp lý của quân mã trên bàn cờ rỗng.

(c)Sử dụng quan hệ mvt_ knight, viết một câu hỏi để tìm tất cả các lộ trình bốn bước nhảy hợp lý của quân mã, xuất phát từ ô có toạ độ 2/1, để đến biên bên phải của bàn cờ (Y = 8) và để đến ô 5/4 sau hai bước nhảy. 8. Cho f một tệp chứa các 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 ?

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.

Kỹ thuật lập trình Prolog 179 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.

11.Tương tự bài 3 cho các dấu chấm câu khác như dấu chấm (period), dấu chấm phẩy (semicolon), dấu chấm hỏi (question mark), v.v...

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 không (Atom bắt đầu bởi Char) ?

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

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 có chứa từ khoá Keyword. Câu Sentence phải ở dạng mới được đọc vào chưa xử lý, nghĩa là được biểu diễn bởi một chuỗi ký tự, hoặc bởi một nguyên tử.

Một phần của tài liệu Giáo trình lập trình logic trong prolog phần 2 nxb đại học quốc gia (Trang 83 - 86)