Người đọc sẽ được làm quen với một số kỹ thuật lập trình lôgich được ứng dụng tương đối phổ biến và chủ yếu trong lĩnh vực trí tuệ nhân tạo (Artificial Intelligence) như [r]
(1)PGS.TS PHAN HUY KHÁNH
L
LLậậậppp tttrrrìììnnnhhh LLLơơơgggíííccchhh t
ttrrrooonnnggg PPPrrrooollloooggg
(2)(3)PGS.TS PHAN HUY KHÁNH
L
LLậậậppp tttrrrìììnnnhhh L
LLơơơgggíííccchhh t
ttrrrooonnnggg PPPrrrooollloooggg
Prolog ngơn ngữ lập trình lơgich (Prolog = PROgramming in LOGic) GS A Colmerauer đưa lần năm 1972 trường Đại học Marseille, nước Pháp Đến năm 1980, Prolog nhanh chóng áp dụng rộng rãi, người Nhật chọn làm ngôn ngữ phát triển máy tính hệ Prolog cài đặt hầu hết dịng máy tính Unix/Linux, Macintosh, Windows
Prolog cịn gọi ngơn ngữ lập trình ký hiệu (symbolic programming) tương tự lập trình hàm (functional programming), hay lập trình phi số (non-numerical programming) Ngun lý lập trình lơgich dựa phép suy diễn lơgích, liên quan đến khái niệm tốn học phép hợp Herbrand, hợp giải Robinson, lôgich Horn, lôgich vị từ bậc (first order predicate logic), v.v
Prolog thích hợp để giải toán liên quan đến đối tượng mối quan hệ chúng Prolog ứng dụng chủ yếu lĩnh vực trí tuệ nhân tạo (Artificial Intelligence) cơng nghệ xử lý tri thức, hệ chuyên gia, máy học, xử lý ngơn ngữ, trị chơi, v.v
Nội dung sách tập trung trình bày sở lý thuyết kỹ thuật lập trình Prolog, thích hợp cho sinh viên ngành tin học bạn đọc muốn tìm hiểu kỹ thuật lập trình ứng dụng lĩnh vực trí tuệ nhân tạo
VỀ TÁC GIẢ :
Tốt nghiệp ngành Tốn Máy tính năm 1979 trường Đại học Bách khoa Hà Nội Từ 1979 đến giảng dạy khoa Công nghệ Thông tin, trường Đại học Bách khoa, Đại học Đà Nẵng Bảo vệ tiến sĩ năm 1991 Pháp Giữ chức chủ nhiệm khoa
Công nghệ Thông tin 1995-2000
(4)LỜI NÓI ĐẦU
Cuốn sách nhằm cung cấp sở lý thuyết phương pháp lập trình cơ mơn học «Lập trình lơgich» (Programming in Logic) Người đọc được làm quen với số kỹ thuật lập trình lơgich ứng dụng tương đối phổ biến chủ yếu lĩnh vực trí tuệ nhân tạo (Artificial Intelligence) cơng nghệ xử lý tri thức, máy học, hệ chuyên gia, xử lý ngơn ngữ tự nhiên, trị chơi, v.v
Cuốn sách gồm năm chương, chương, tác giả cố gắng đưa vào nhiều ví dụ minh họa Nội dung chương sau :
− Chương giới thiệu ngôn ngữ lập trình Prolog dựa lơgich Horn (Horn
logic) Người đọc làm quen với kiểu liệu Prolog, khái niệm luật, kiện viết chương trình Prolog đơn giản
− Chương trình bày mức nghĩa khác chương trình Prolog :
nghĩa lơgich, nghĩa khai báo nghĩa thủ tục, cách Prolog trả lời câu hỏi, cách Prolog làm thoả mãn đích
− Chương trình bày phép toán số học, phép so sánh đối tượng
định nghĩa hàm sử dụng phép đệ quy Prolog
− Chương trình bày cấu trúc danh sách phép xử lý danh
sách Prolog
− Chương trình bày kỹ thuật lập trình nâng cao với Prolog
− Phần phụ lục giới thiệu ngơn ngữ lập trình SWI-Prolog, hướng dẫn cách cài
đặt sử dụng phần mềm số chương trình ví dụ tiêu biểu viết SWI Prolog chạy có kết
Cuốn sách dùng làm giáo trình cho sinh viên ngành Tin học bạn đọc muốn tìm hiểu thêm kỹ thuật lập trình cho lĩnh vực trí tuệ nhân tạo
Trong q trình biên soạn, tác giả nhận từ bạn đồng nghiệp nhiều đóng góp bổ ích mặt chun mơn, động viên khích lệ mặt tinh thần, giúp đỡ biên tập để sách đời Tác giả xin bày tỏ lòng biết ơn sâu sắc Tác giả chân thành cảm ơn ý kiến phê bình đóng góp bạn đọc gần xa nội dung sách
(5)MỤC LỤC
CHƯƠNG MỞĐẦU VỀ NGÔN NGỮ PROLOG
I GIỚI THIỆU NGÔN NGỮ PROLOG
I.1 Prolog ngơn ngữ lập trình lơgich
I.2 Cú pháp Prolog
I.2.1 Các thuật ngữ
I.2.2 Các kiểu liệu Prolog
I.2.3 Chú thích
II CÁC KIỂU DỮ LIỆU SƠ CẤP CỦA PROLOG
II.1 Các kiểu (trực kiện)
II.1.1 Kiểu số
II.1.2 Kiểu lôgich
II.1.3 Kiểu chuỗi ký tự
II.1.4 Kiểu nguyên tử
II.2 Biến
III SỰ KIỆN VÀ LUẬT TRONG PROLOG
III.1 Xây dựng kiện
III.2 Xây dựng luật 10
III.2.1 Định nghĩa luật 10
III.2.2 Định nghĩa luật đệ quy 16
III.2.3 Sử dụng biến Prolog 18
IV KIỂU DỮ LIỆU CẤU TRÚC CỦA PROLOG 20
IV.1 Định nghĩa kiểu cấu trúc Prolog 20
IV.2 So sánh hợp hạng 23
CHƯƠNG NGỮ NGHĨA CỦA CHƯƠNG TRÌNH PROLOG 31
I QUAN HỆ GIỮA PROLOG VÀ LƠGICH TỐN HỌC 31
II CÁC MỨC NGHĨA CỦA CHƯƠNG TRÌNH PROLOG 32
II.1 Nghĩa khai báo chương trình Prolog 33
II.2 Khái niệm gói mệnh đề 34
II.3 Nghĩa lôgich mệnh đề 35
II.4 Nghĩa thủ tục Prolog 37
(6)III VÍ DỤ : CON KHỈ VÀ QUẢ CHUỐI 48
III.1 Phát biểu toán 48
III.2 Giải toán với Prolog 49
III.3 Sắp đặt thứ tự mệnh đề đích 54
III.3.1 Nguy gặp vịng lặp vơ hạn 54
III.3.2 Thay đổi thứ tự mệnh đề đích trongchương trình 56
CHƯƠNG CÁC PHÉP TOÁN VÀ SỐ HỌC 65
I SỐ HỌC 65
I.1 Các phép toán số học 65
I.2 Biểu thức số học 65
I.3 Định nghĩa phép toán Prolog 68
II CÁC PHÉP SO SÁNH CỦA PROLOG 73
II.1 Các phép so sánh số học 73
II.2 Các phép so sánh hạng 75
II.3 Vị từ xác định kiểu 77
II.4 Một số vị từ xử lý hạng 77
III ĐỊNH NGHĨA HÀM 79
III.1 Định nghĩa hàm sử dụng đệ quy 79
III.2 Tối ưu phép đệ quy 87
III.3 Một số ví dụ khác vềđệ quy 88
III.3.1 Tìm đường đồ thị có định hướng 88
III.3.2 Tính độ dài đường đồ thị 89
III.3.3 Tính gần chuỗi 90
CHƯƠNG CẤU TRÚC DANH SÁCH 95
I BIỂU DIỄN CẤU TRÚC DANH SÁCH 95
II MỘT SỐ VỊ TỪ XỬ LÝ DANH SÁCH CỦA PROLOG 98
III CÁC THAO TÁC CƠ BẢN TRÊN DANH SÁCH 99
III.1 Xây dựng lại số vị từ có sẵn 99
III.1.1 Kiểm tra phần tử có mặt danh sách 99
III.1.2 Ghép hai danh sách 100
III.1.3 Bổ sung phần tử vào danh sách 104
III.1.4 Loại bỏ phần tử khỏi danh sách 104
III.1.5 Nghịch đảo danh sách 105
III.1.6 Danh sách 106
(7)III.3 Một số ví dụ danh sách 109
III.3.1 Sắp xếp phần tử danh sách 109
III.3.2 Tính độ dài danh sách 109
III.3.3 Tạo sinh số tự nhiên 111
CHƯƠNG KỸ THUẬT LẬP TRÌNH PROLOG 117
I NHÁT CẮT 117
I.1 Khái niệm nhát cắt 117
I.2 Kỹ thuật sử dụng nhát cắt 118
I.2.1 Tạo đích giả nhát cắt 118
I.2.2 Dùng nhát cắt loại bỏ hoàn toàn quay lui 119
I.2.3 Ví dụ sử dụng kỹ thuật nhát cắt 122
I.3 Phép phủđịnh 126
I.3.1 Phủđịnh thất bại 126
I.3.2 Sử dụng kỹ thuật nhát cắt phủđịnh 128
II SỬ DỤNG CÁC CẤU TRÚC 131
II.1 Truy cập thông tin cấu trúc từ sở liệu 132
II.2 Trừu tượng hoá liệu 136
II.3 Mô ôtômat hữu hạn 138
II.3.1 Mô ôtômat hữu hạn không đơn định 138
II.3.2 Mô ôtômat hữu hạn đơn định 143
II.4 Ví dụ : lập kế hoạch du lịch máy bay 144
II.5 Bài toán tám quân hậu 150
II.5.1 Sử dụng danh sách toạđộ theo hàng cột 151
II.5.2 Sử dụng danh sách toạđộ theo cột 155
II.5.3 Sử dụng toạđộ theo hàng, cột đường CHÉO 158
II.5.4 Kết luận 161
II.5.5 Bộ diễn dịch Prolog 162
III QUÁ TRÌNH VÀO-RA VÀ LÀM VIỆC VỚI TỆP 163
III.1 Khái niệm 163
III.2 Làm việc với tệp 164
III.2.1 Đọc ghi lên tệp 164
III.2.2 Một số ví dụđọc ghi lên tệp 167
III.2.3 Nạp chương trình Prolog vào nhớ 171
III.3 Ứng dụng chếđộ làm việc với tệp 172
III.3.1 Định dạng hạng 172
III.3.2 Sử dụng tệp xử lý hạng 173
III.3.3 Thao tác ký tự 175
III.3.4 Thao tác nguyên tử 177
(8)PHỤ LỤC A MỘT SỐ CHƯƠNG TRÌNH PROLOG 187
PHỤ LỤC B HƯỚNG DẪN SỬ DỤNG SWI-PROLOG 200
I GIỚI THIÊUU SWI-PROLOG 194
II LAIM VIÊUC VỚI SWI-PROLOG 195
II.1 Đặt câu hỏi 195
II.2 Chạy trình demo 196
II.3 Chạy trình demo XPCE 197
II.4 Các lệnh đơn (Menu commands) 198
II.5 Soạn thảo chương trình 200
III MỘT SỐ LỆNH SWI-PROLOG THÔNG DỤNG 201
(9)CHƯƠNG
Mở đầu ngơn ngữ Prolog
« A program is a theory (in some logic) and computation is deduction from the theory » J A Robinson « Program = data structure + algorithm »
N Wirth « Algorithm = logic + control »
R Kowalski
I. Giới thiệu ngôn ngữ Prolog
I.1. Prolog ngơn ngữ lập trình lơgich
rolog ngôn ngữ sử dụng phổ biến dịng ngơn ngữ
lập trình lơgich (Prolog có nghĩa PROgramming in LOGic) Ngôn ngữ
Prolog giáo sư người Pháp Alain Colmerauer nhóm nghiên cứu
ông đề xuất lần trường Đại học Marseille đầu năm 1970 Đến năm 1980, Prolog nhanh chóng áp dụng rộng rãi châu Âu, người Nhật chọn làm ngôn ngữ phát triển dịng máy tính hệ Prolog
được cài đặt máy vi tính Apple II, IBM-PC, Macintosh
Prolog cịn gọi ngơn ngữlập trình ký hiệu (symbolic programming) tương
tự ngôn ngữ lập trình hàm (functional programming), hay lập trình phi số
(non-numerical programming) Prolog thích hợp để giải toán liên quan đến
các đối tượng (object) mối quan hệ (relation) giữa chúng
Prolog sử dụng phổ biến lĩnh vực trí tuệ nhân tạo Ngun lý lập trình lơgich dựa mệnh đề Horn (Horn logíc) Một mệnh đề Horn biễu diễn kiện hay việc khơng đúng, xảy khơng xảy (có khơng có, v.v )
Ví dụ I.1 : Sau số mệnh đề Horn :
1.Nếu người già mà (và) khôn ngoan thì người hạnh phúc 2. Jim người hạnh phúc
3. Nếu X cha mẹ Y và Y cha mẹ Z thì X ơng Z 4. Tom ông Sue
P
(10)2 Lập trình lơgic Prolog
5. Tất người chết (hoặc Nếu người thì phải chết) 6. Socrat người
Trong mệnh đề Horn trên, mệnh đề 1, 3, gọi luật
(rule), mệnh đề lại gọi sự kiện (fact) Một chương trình
lơgich xem sở liệu gồm mệnh đề Horn, dạng luật, dạng kiện, chẳng hạn tất kiện luật từ đến Người sử dụng (NSD) gọi chạy chương trình lơgich cách đặt
câu hỏi (query/ question) truy vấn sở liệu này, chẳng hạn câu hỏi :
Socrat có chết không ?
(tương đươngkhẳng định Socrat chết đúng hay sai ?)
Một hệ thống lôgich thực chương trình theo cách «suy luận»-tìm kiếm dựa vốn «hiểu biết» có chương trình - sở liệu, để minh chứng câu hỏi khẳng định, đúng (Yes) sai (No) Với câu hỏi trên, hệ thống tìm kiếm sở liệu khẳng định Socrat chết và «tìm thấy» luật thoả
mãn (vế thì) Vận dụng luật 5, hệ thống nhận Socrat người (vế nếu)
chính kiện Từđó, câu trả lời :
Yes
có nghĩa kiện Socrat chết là
I.2. Cú pháp Prolog
I.2.1. Các thuật ngữ
Một chương trình Prolog sở liệu gồm mệnh đề (clause) Mỗi
mệnh đề xây dựng từ vị từ(predicat) Một vị từ phát biểu đối tượng có giá trị chân đúng (true) sai (fail) Một vị từ có
các đối nguyên lôgich (logic atom)
Mỗi nguyên tử (nói gọn) biểu diễn quan hệ hạng (term) Như
vậy, hạng quan hệ hạng tạo thành mệnh đề
Hạng xem đối tượng “dữ liệu” trình Prolog Hạng hạng sơ cấp (elementary term) gồm hằng (constant), biến (variable) hạng phức hợp (compound term)
Các hạng phức hợp biểu diễn đối tượng phức tạp toán cần giải
quyết thuộc lĩnh vực xét Hạng phức hợp hàm tử (functor) có chứa đối (argument), có dạng
Tên_hàm_tử(Đối_1, , Đối_n)
Tên hàm tử chuỗi chữ và/hoặc chũ sốđược bắt đầu chữ
(11)Mở đầu ngôn ngữ Prolog
hàm tửđặc biệt “.” (dấu chấm) biểu diễn cấu trúcdanh sách (list) Kiểu liệu hàm tử tương tự kiểu ghi (record) danh sách (list) tương tự kiểu mảng (array) ngơn ngữ lập trình mệnh lệnh (C, Pascal )
Ví dụ I.2 :
f(5, a, b)
student(robert, 1975, info, 2,
address(6, 'mal juin', 'Caen')) [a, b, c]
Mệnh đề sự kiện, luật (hay quy tắc), hay câu hỏi
Prolog quy ước viết sau mệnh đề dấu chấm để kết thúc sau : • Sự kiện : < >
(tương ứng với luật < > :- true. )
• Luật : < > :- < >. • Câu hỏi ?-< >
(ở chếđộ tương tác có dấu nhắc lệnh)
I.2.2. Các kiểu liệu Prolog
Hình 1.1 biểu diễn phân lớp kiểu liệu Prolog gồm kiểu
dữ liệu sơ cấp kiểu liệu có cấu trúc Sự phân lớp nhận biết kiểu đối tượng nhờ bề cú pháp
Cú pháp Prolog quy định kiểu đối tượng có dạng khác
Prolog khơng cần cung cấp thông tin khác để nhận biết kiểu đối tượng Trong Prolog, NSD không cần khai báo kiểu liệu
Hình I.1 Các kiểu liệu Prolog
Các kiểu liệu Prolog xây dựng từ ký tự ASCII :
• Các chữ in hoa A, B, , Z chữ in thường a, b, , z • Các chữ số 0, 1, ,
kiểu liệu
kiểu sơ cấp kiểu phức hợp hằng biến
(12)4 Lập trình lơgic Prolog
• Các ký tựđặc biệt, chẳng hạn + - * / < > = : & _ ~ I.2.3. Chú thích
Trong chương trình Prolog, chú thích (comment) đặt hai cặp ký hiệu /* */ (tương tự ngôn ngữ C) Ví dụ :
/*************************/ /***Đây thích ***/ /*************************/
Trong trường hợp muốn đặt thích ngắn sau phần khai báo Prolog
cho đến hết dịng, có thểđặt trước ký hiệu %
Ví dụ :
%%%%%%%%%%%%%%%%%%%%% %Đây thích %%%%%%%%%%%%%%%%%%%%%
Prolog bỏ qua tất phần thích thủ tục
II. Các kiểu liệu sơ cấp Prolog
II.1. Các kiểu (trực kiện)
II.1.1. Kiểu số
Prolog sử dụng số nguyên số thực Cú pháp số nguyên số
thực đơn giản, chẳng hạn ví dụ sau :
1 1515 -97
3.14 -0.0035 100.2
Tuỳ theo phiên cài đặt, Prolog xử lý miền số nguyên miền số thực khác Ví dụ phiên Turbo Prolog, miền số nguyên cho
phép từ -32768đến 32767, miền số thực cho phép từ±±±±1e-307 đến ±±±±1e+308
Các số thực sử dụng Prolog Lý chủ yếu chỗ Prolog
ngôn ngữ lập trình ký hiệu, phi số
Các số nguyên thường sử dụng cần đếm số lượng phần tử
(13)Mở đầu ngôn ngữ Prolog
II.1.2. Kiểu lôgich
Prolog sử dụng hai lơgich có giá trị true fail Thông thường
hằng lôgich không dùng tham số mà dùng mệnh đề Hằng fail thường dùng để tạo sinh lời giải toán
II.1.3. Kiểu chuỗi ký tự
Các hằnglà chuỗi (string) ký tựđược đặt hai dấu nháy kép
"Toto \#\{@ tata" chuỗi có tuỳ ý ký tự
"" chuỗi rỗng (empty string)
"\"" chuỗi có dấu nháy kép
II.1.4. Kiểu nguyên tử
Các hằngnguyên tử Prolog chuỗi ký tựở ba dạng sau :
(1) Chuỗi gồm chữ cái, chữ số ký tự_ luôn bắt đầu một chữ in thường
newyork a_
nil x y
x25 tom_cruise
(2)Chuỗi ký tựđặc biệt :
< -> .: ======> ::==
(3)chuỗi đặt hai dấu nháy đơn (quote) được bắt đầu chữ in hoa,
dùng phân biệt với tên biến :
’Jerry’ ’Tom SMITH’
II.2. Biến
Tên biến chuỗi ký tự gồm chữ cái, chữ số, bắt đầu chữ hoahoặc dấu gạch dòng :
X, Y, A
(14)6 Lập trình lơgic Prolog
III. Sự kiện luật Prolog
III.1.Xây dựng kiện
Ví dụ III.1 : Quan hệ gia đình
Để xây dựng kiện chương trình Prolog, ta lấy ví dụ Ta xây dựng gia hệ nhưHình III.1
Trong gia hệ (a), nút người, mũi tên quan hệ cha mẹ
của (parent of) Sự kiện Tom cha mẹ Bill viết thành vị từ Prolog sau (chú ý mệnh đề kết thúc dấu chấm) :
parent(tom, bill) %Chú ý khơng có dấu cách trước dấu mở ngoặc
Ởđây, vị từ parent có hai đối tom bill Người ta biểu diễn vị
từ Hình III.1 (b) : nút gốc tên vị từ, nút đối
(a) (b)
Hình III.1.Cây gia hệ
Từ gia hệ đây, tiếp tục viết vị từ khác để nhận
chương trình Prolog gồm vị từ sau :
parent(mary, bill) parent(tom, bill) parent(tom, liz) parent(bill, ann) parent(bill, sue) parent(sue, jim)
Sau hệ thống Prolog nhận chương trình này, thực chất sở
dữ liệu, người ta đặt câu hỏi liên quan đến quan hệparent Ví dụ mar
y
tom
bil l
liz
ann sue
jim
parent
(15)Mở đầu ngôn ngữ Prolog
câu hỏi Bill có phải cha mẹ Sue gõ vào hệ thống đối thoại Prolog (dấu nhắc ?-_) sau :
?- parent(bill, sue)
Sau tìm thấy kiện chương trình, Prolog trả lời :
Yes
Ta tiếp tục đặt câu hỏi khác :
?- parent(liz, sue) No
Bởi Prolog khơng tìm thấy kiện Liz người mẹ Sue chương trình Tương tự, Prolog trả lời No cho kiện :
?- parent(tom, ben)
Vì tên ben chưa đưa vào chương trình Ta tiếp tục đặt
các câu hỏi thú vị khác Chẳng hạn, cha (hay mẹ) Liz ?
?- parent(X, liz)
Lần này, Prolog không trả lời Yes No, mà đưa giá trị X làm
thoả mãn câu hỏi :
X = tom
Để biết Bill, ta cần viết :
?- parent(bill, X)
Với câu hỏi này, Prolog có hai câu trả lời, :
X = ann ->;
Để biết câu trả lời tiếp theo, hầu hết cài đặt Prolog, NSD
phải gõ vào dấu chấm phẩy (;) sau -> (Arity Prolog) : X = sue
Nếu hết phương án trả lời mà tiếp tục yêu cầu (;), Prolog trả lời No
NSD đặt câu hỏi tổng quát hơn, chẳng hạn : ai cha mẹ ai ?
Nói cách khác, cần tìm X Y cho X cha mẹ Y Ta viết sau :
?- parent(X, Y)
Sau hiển thị câu trả lời đầu tiên, Prolog tìm kiếm cặp cha mẹ− thoả mãn lần lượt hiển thị kết quả nếu chừng NSD yêu
cầu khơng cịn kết lời giải (kết thúc Yes) : X = mary
Y = bill ->; X = tom
(16)8 Lập trình lơgic Prolog
X = tom Y = liz ->; X = bill Y = ann ->; X = bill Y = sue ->; X = sue Y = jim Yes
Tuỳ theo cài đặt Prolog, NSD gõ vào dấu chấm (.) Enter để
chấm dứt chừng luồng trả lời
Ta tiếp tục đưa câu hỏi phức tạp khác, chẳng hạn ai ông (bà) Jim ? Thực tế, quan hệ ông − bà (grandparent) chưa được định
nghĩa, cần phải phân tách câu hỏi thành hai phần sơ cấp : Ai cha (mẹ) Jim ? Giả sử có tên Y
2 Ai cha (mẹ) Y ? Giả sử có tên X
Hình III.2 Quan hệ ơng bà hợp thành từ hai quan hệ cha mẹ
Lúc này, viết Prolog sau :
?- parent(Y, jim), parent(X, Y)
Prolog trả lời :
Y = sue X = bill Yes
Câu hỏi tương ứng với câu hỏi : tìm X Y thoả mãn :
parent(Y, jim)
và
parent(X, Y)
Y X
jim parent
(17)Mở đầu ngôn ngữ Prolog
Nếu thay đổi thứ tự hai thành phần câu hỏi, nghĩa lơgich khơng thay
đổi Prolog trả lời kết (có thể thay đổi thứ tự), nghĩa ta đặt câu hỏi sau :
?- parent(X, Y), parent(Y, jim) X = bill
Y = đường dẫn
Yes
Bây ta đặt câu hỏi ai cháu Tom ? ?- parent(tom, X), parent(X, Y) X = bill
Y = ann->; X = bill Y = sue ->; No
Một câu hỏi khác sau : Ann Sue có người ơng khơng ?
nghĩa ta diễn đạt thành hai giai đoạn :
1 Tìm X cha mẹ Ann
2 X tìm thấy có cha mẹ Sue khơng ? Câu hỏi trả lời Prolog sau :
?- parent(X, ann), parent(X, sue) X = bill
Trong Prolog, câu hỏi cịn gọi đích (goal) cần phải thoả mãn
(satisfy) Mỗi câu hỏi đặt sở liệu tương ứng với
nhiều đích Chẳng hạn dãy đích :
parent(X, ann), parent(X, sue)
tương ứng với câu hỏi phép hội (conjunction) mệnh đề : X cha mẹ Ann, và
X cha mẹ Sue
Nếu câu trả lời Yes, có nghĩa đích thoả mãn, hay thành cơng Trong trường hợp ngược lại, câu trả lời No, có nghĩa đích khơng được thoả mãn, hay thất bại
(18)10 Lập trình lơgic Prolog
III.2. Xây dựng luật
III.2.1.Định nghĩa luật
Từ chương trình gia hệ đây, ta dễ dàng bổ sung thơng tin khác, chẳng hạn bổ sung kiện giới tính (nam, nữ) người nêu tên quan hệparent sau :
woman(mary) man(tom) man(bill) woman(liz) woman(sue) woman(ann) man(jim)
Ta định nghĩa quan hệ đơn (unary) woman man chúng liên
quan đến đối tượng Còn quan hệparent nhị phân, liên quan
đến cặp đối tượng Như vậy, quan hệ đơn dùng để thiết lập thuộc
tính đối tượng Mệnh đề :
woman(mary)
được giải thích : Mary nữ Tuy nhiên, ta cũng sử dụng quan hệ nhị phân
đểđịnh nghĩa giới tính :
sex(mary, female) sex(tom, male) sex(bill, male)
Bây ta đưa vào quan hệ child, đối ngược với parent sau : child(liz, tom)
Từđó, ta định nghĩa luật nhưsau :
child(Y, X) :- parent(X, Y)
Luật hiểu :
Với X Y, Y X X cha (hay mẹ) Y
(19)Mở đầu ngôn ngữ Prolog 11
Với X Y,
nếu X cha (hay mẹ) Y Y X
Có khác kiện luật Một kiện, chẳng hạn :
parent(tom, liz)
là điều ln đúng, khơng có điều kiện ràng buộc Trong đó, luật liên quan đến thuộc tính thoả mãn số điều kiện
được thoả mãn Mỗi luật bao gồm hai phần:
• phần bên phải (RHS: Right Hand Side) điều kiện, gọi thân
(body) luật,
• phần bên trái (LH: Left Hand Side S) kết luận, gọi đầu
(head) luật
Nếu điều kiện parent(X, Y) đúng, child(Y, X)
hậu lôgich phép suy luận (inference)
Câu hỏi sau giải thích cách Prolog sử dụng luật : Liz có phải Tom không ?
?- child(liz, tom)
Thực tế, chương trình khơng có kiện liên quan đến con, mà ta phải tìm cách áp dụng luật Luật dạng tổng quát với đối tượng
X Y bất kỳ, mà ta lại cần đối tượng cụ thểliz tom
Ta cần sử dụng phép (substitution) bằng cách gán giá trị liz cho biến Y
và tom cho X Người ta nói biến X Y ràng buộc (bound) : X = tom
và
Y = liz
Lúc này, phần điều kiện có giá trịparent(tom, liz) trở thành đích con
(sub-goal) để Prolog thay cho đích child(liz, tom) Tuy nhiên, đích
thoả mãn có giá trịYes kiện thiết lập chương trình
Sau đây, ta tiếp tục bổ sung quan hệ Quan hệ mẹmotherđược định
nghĩa sau (chú ý dấu phẩy phép hội hay phép và lôgich) :
mother(X, Y) :- parent(X, Y), woman(X)
child(Y, X) :- parent(X, Y)
(20)12 Lập trình lơgic Prolog
được hiểu :
Với X Y, X mẹ Y X cha (hay mẹ) Y X nữ
Đồ thị sau minh hoạ việc định nghĩa quan hệ child, mother
grandparent sử dụng quan hệ khác :
Trong đồ thị, người ta quy ước : nút tương ứng với đối tượng (là đối quan hệ) Các cung nối nút tương ứng với quan hệ nhị
phân, định hướng từđối thứ đến đối thứ hai quan hệ
Một quan hệđơn biểu diễn tên quan hệ tương ứng với nhãn đối tượng Các quan hệ cần định nghĩa sẽđược biểu diễn cung có nét đứt
Mỗi đồ thị giải thích sau : quan hệ cung có nét liền thoả mãn, quan hệ biểu diễn cung có nét đứt thoả
mãn
Hình III.3 Định nghĩa quan hệ con, mẹ ông bà sử dụng quan hệ khác
Như vậy, quan hệ ông−bà grandparentđược viết như sau :
grandparent(X, Z) :- parent(X, Y), parent(Y, Z)
Để thuận tiện cho việc đọc chương trình Prolog, ta viết luật nhiều dòng, dòng phần đầu luật, dòng phần thân
của luật, đích dịng phân biệt Bây quan hệ grandparent
được viết lại sau :
grandparent(X, Z) :
-parent(X, Y), parent(Y, Z)
Ta tiếp tục định nghĩa quan hệ chị em gái sister sau : Với X Y, X chị (em) gái Y
(1) X Y có cha (cùng mẹ),
(2) X nữ
sister(X, Y) :
-Y X
Y X
Z parent
grandparent parent
Y
X woman