Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
299,81 KB
Nội dung
PGS.TS PHAN HUY KHÁNH Lập t rình Lơ g ích Prolog NHÀ XUẤT BẢN ĐẠI HỌC QUỐC GIA HÀ NỘI 2004 PGS.TS PHAN HUY KHÁNH L ậ p tr ìn h L ơg í ch t r ong Pr ol og 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 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) Nguyên 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 toá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 tố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 Hướng nghiên cứu : xử lý ngơn ngữ, xử lý đa ngữ, lý thuyết tính tốn E-mail: khanhph@vnn.vn 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 mơn học «Lập trình lơgich» (Programming in Logic) Người đọ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 tố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 Đà Nẵng, ngày 27/05/2004 Tác giả 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 I II II.1 II.2 II.3 II.4 II.5 NGỮ NGHĨA CỦA CHƯƠNG TRÌNH PROLOG 31 QUAN HỆ GIỮA PROLOG VÀ LƠGICH TỐN HỌC 31 CÁC MỨC NGHĨA CỦA CHƯƠNG TRÌNH PROLOG 32 Nghĩa khai báo chương trình Prolog 33 Khái niệm gói mệnh đề 34 Nghĩa lôgich mệnh đề 35 Nghĩa thủ tục Prolog 37 Tổ hợp yếu tố khai báo thủ tục 47 i III III.1 III.2 III.3 III.3.1 III.3.2 VÍ DỤ : CON KHỈ VÀ QUẢ CHUỐI 48 Phát biểu toán 48 Giải toán với Prolog 49 Sắp đặt thứ tự mệnh đề đích 54 Nguy gặp vòng lặp vơ hạn 54 Thay đổi thứ tự mệnh đề đích chương trình 56 CHƯƠNG I I.1 I.2 I.3 II II.1 II.2 II.3 II.4 III III.1 III.2 III.3 III.3.1 III.3.2 III.3.3 CÁC PHÉP TOÁN VÀ SỐ HỌC 65 SỐ HỌC 65 Các phép toán số học 65 Biểu thức số học 65 Định nghĩa phép toán Prolog 68 CÁC PHÉP SO SÁNH CỦA PROLOG 73 Các phép so sánh số học 73 Các phép so sánh hạng 75 Vị từ xác định kiểu 77 Một số vị từ xử lý hạng 77 ĐỊNH NGHĨA HÀM 79 Định nghĩa hàm sử dụng đệ quy 79 Tối ưu phép đệ quy 87 Một số ví dụ khác đệ quy 88 Tìm đường đồ thị có định hướng 88 Tính độ dài đường đồ thị 89 Tính gần chuỗi 90 CHƯƠNG I II III III.1 III.1.1 III.1.2 III.1.3 III.1.4 III.1.5 III.1.6 III.2 CẤU TRÚC DANH SÁCH 95 BIỂU DIỄN CẤU TRÚC DANH SÁCH 95 MỘT SỐ VỊ TỪ XỬ LÝ DANH SÁCH CỦA PROLOG 98 CÁC THAO TÁC CƠ BẢN TRÊN DANH SÁCH 99 Xây dựng lại số vị từ có sẵn 99 Kiểm tra phần tử có mặt danh sách 99 Ghép hai danh sách 100 Bổ sung phần tử vào danh sách 104 Loại bỏ phần tử khỏi danh sách 104 Nghịch đảo danh sách 105 Danh sách 106 Hoán vị 107 III.3 III.3.1 III.3.2 III.3.3 Một số ví dụ danh sách 109 Sắp xếp phần tử danh sách 109 Tính độ dài danh sách 109 Tạo sinh số tự nhiên 111 CHƯƠNG I I.1 I.2 I.2.1 I.2.2 I.2.3 I.3 I.3.1 I.3.2 II II.1 II.2 II.3 II.3.1 II.3.2 II.4 II.5 II.5.1 II.5.2 II.5.3 II.5.4 II.5.5 III III.1 III.2 III.2.1 III.2.2 III.2.3 III.3 III.3.1 III.3.2 III.3.3 III.3.4 III.3.5 KỸ THUẬT LẬP TRÌNH PROLOG 117 NHÁT CẮT 117 Khái niệm nhát cắt 117 Kỹ thuật sử dụng nhát cắt 118 Tạo đích giả nhát cắt 118 Dùng nhát cắt loại bỏ hoàn toàn quay lui 119 Ví dụ sử dụng kỹ thuật nhát cắt 122 Phép phủ định 126 Phủ định thất bại 126 Sử dụng kỹ thuật nhát cắt phủ định 128 SỬ DỤNG CÁC CẤU TRÚC 131 Truy cập thông tin cấu trúc từ sở liệu 132 Trừu tượng hoá liệu 136 Mô ôtômat hữu hạn 138 Mô ôtômat hữu hạn không đơn định 138 Mô ôtômat hữu hạn đơn định 143 Ví dụ : lập kế hoạch du lịch máy bay 144 Bài toán tám quân hậu 150 Sử dụng danh sách toạ độ theo hàng cột 151 Sử dụng danh sách toạ độ theo cột 155 Sử dụng toạ độ theo hàng, cột đường CHÉO 158 Kết luận 161 Bộ diễn dịch Prolog 162 QUÁ TRÌNH VÀO-RA VÀ LÀM VIỆC VỚI TỆP 163 Khái niệm 163 Làm việc với tệp 164 Đọc ghi lên tệp 164 Một số ví dụ đọc ghi lên tệp 167 Nạp chương trình Prolog vào nhớ 171 Ứng dụng chế độ làm việc với tệp 172 Định dạng hạng 172 Sử dụng tệp xử lý hạng 173 Thao tác ký tự 175 Thao tác nguyên tử 177 Một số vị từ xử lý sở liệu 180 iii PHỤ LỤC A MỘT SỐ CHƯƠNG TRÌNH PROLOG 187 PHỤ LỤC B I II II.1 II.2 II.3 II.4 II.5 III HƯỚNG DẪN SỬ DỤNG SWI-PROLOG 200 GIỚI THIÊUU SWI-PROLOG 194 LAIM VIÊUC VỚI SWI-PROLOG 195 Đặt câu hỏi 195 Chạy trình demo 196 Chạy trình demo XPCE 197 Các lệnh đơn (Menu commands) 198 Soạn thảo chương trình 200 MỘT SỐ LỆNH SWI-PROLOG THÔNG DỤNG 201 TÀI LIỆU THAM KHẢO 203 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ài đặt máy vi tính Apple II, IBM-PC, Macintosh Prolog 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ố (nonnumerical programming) Prolog thích hợp để giải toán liên quan đến đối tượng (object) mối quan hệ (relation) chúng Prolog sử dụng phổ biến lĩnh vực trí tuệ nhân tạo Nguyên 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 : Nếu người già mà (và) khơn ngoan người hạnh phúc Jim người hạnh phúc Nếu X cha mẹ Y Y cha mẹ Z X ơng Z Tom ơng Sue P Lập trình lơgic Prolog Tất người chết (hoặc Nếu người phải chết) Socrat người Trong mệnh đề Horn trên, mệnh đề 1, 3, gọi luật (rule), mệnh đề lại gọi 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 đương khẳng định Socrat chết 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, (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 «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) kiện Từ đó, câu trả lời : Yes có nghĩa kiện Socrat chết 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 (true) sai (fail) Một vị từ 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 (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 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ố bắt đầu chữ thường Các đối biến, hạng sơ cấp, hạng phức hợp Trong Prolog, Mở đầu ngôn ngữ Prolog hàm tử đặc biệt “.” (dấu chấm) biểu diễn cấu trúc danh 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 đề 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 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 kiểu liệu kiểu sơ cấp số kiểu phức hợp biến chuỗi ký tự nguyên tử 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, , 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, 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 hết dòng, đặ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 : 3.14 1515 -0.0035 -97 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ử diện danh sách Prolog dạng [a1, a2, , an ] 5 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 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 chuỗi (string) ký tự đặ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 nguyê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 chữ in thường newyork nil x25 a_ x y tom_cruise (2) Chuỗi ký tự đặc biệt : < -> : ======> ::== (3) chuỗi đặt hai dấu nháy đơn (quote) 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ữ hoa dấu gạch dòng : X, Y, A Result, List_of_members _x23, _X, _, 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ệ Hình III.1 Trong gia hệ (a), nút người, mũi tên quan hệ cha mẹ (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 tom mar y bil l parent liz tom bill sue ann jim (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ở liệu, người ta đặt câu hỏi liên quan đến quan hệ parent Ví dụ 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â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 : cha mẹ ? 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 hiển thị kết chừng NSD yêu cầu khơng kết lời giải (kết thúc Yes) : X Y X Y = = = = mary bill ->; tom bill ->; Lập trình lơgic Prolog X = Y = X = Y = X = Y = X = Y = Yes tom liz ->; bill ann ->; bill sue ->; sue jim 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 ông (bà) Jim ? Thực tế, quan hệ ông − bà (grandparent) chưa đị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 Ai cha (mẹ) Y ? Giả sử có tên X X parent Y parent grandparent jim 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) parent(X, Y) 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 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 : Tìm X cha mẹ Ann 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 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, 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 thoả mãn, hay thất bại Nếu có nhiều câu trả lời cho câu hỏi, Prolog đưa câu trả lời chờ yêu cầu NSD tiếp tục 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) giải thích : Mary nữ Tuy nhiên, ta 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 sau : child(Y, X) :- parent(X, Y) Luật hiểu : Với X Y, Y X X cha (hay mẹ) Y hay Mở đầu ngôn ngữ Prolog 11 Với X Y, 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) đ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 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) child(Y, X) :- parent(X, Y) đầu thân 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) cách gán giá trị liz cho biến Y tom cho X Người ta nói biến X Y ràng buộc (bound) : X = tom Y = liz Lúc này, phần điều kiện có giá trị parent(tom, liz) trở thành đích (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 định nghĩa sau (chú ý dấu phẩy phép hội hay phép lôgich) : mother(X, Y) :- parent(X, Y), woman(X) 12 Lập trình lơgic Prolog 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 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 X X parent child parent Y woman mother Y X parent Y parent grandparent Z 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 viết 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 luật, đích dòng phân biệt Bây quan hệ grandparent 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) :- ... III.3.4 III.3.5 KỸ THUẬT LẬP TRÌNH PROLOG 11 7 NHÁT CẮT 11 7 Khái niệm nhát cắt 11 7 Kỹ thuật sử dụng nhát cắt 11 8 Tạo đích giả nhát cắt 11 8 Dùng nhát cắt loại... _, 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ệ Hình III .1 Trong gia. .. 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ụ