Như đã trình bày, mọi đối tượng cấu trúc của Prolog đều được biểu diễn dưới dạng cây, xuất hiện trong một chương trình dưới dạng các hạng.. Bây giờ ta sẽ xét phép toán quan trọng nhất [r]
(1)CHƯƠNG
NGÔN NGỮ PROLOG
A line may take us hours, yet if it does not seem a moment's thought All our stitching and unstitching has been as nought
Yeats - Adam's Curse
I. Giới thiệu ngôn ngữ Prolog
I.1. Prolog ngơn ngữ lập trình lơgich
Prolog 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 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 đố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
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ì)
(2)Từ đó, câu trả lời : Yes
có nghĩa kiện Socrat chết
I.1.1. Cú pháp Prolog
I.1.2 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ó đối ngun 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 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, 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 đề 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.1.3 Các kiểu dữ 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
(3)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, ,
• Các ký tự đặc biệt, chẳng hạn + - * / < > = : & _ ~
I.1.4 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
I.2. Các kiểu dữ liệu sơ cấp của Prolog I.2.1 Kiểu hằng 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ử diện danh sách Prolog dạng [a1, a2, , an ]
kiểu liệu
kiểu sơ cấp kiểu phức hợp hằng biến
(4)I.2.2 Kiểu hằng 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
I.2.3 Kiểu hằng chuỗi ký tự
Các hằnglà 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 I.2.4 Kiểu hằng 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 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’
I.2.5 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, _,
II. Sự kiện luật Prolog
II.1. Xây dựng sự kiện Ví dụ II.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 II.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) :
(5)Ở đây, vị từ parent có hai đối tom bill Người ta biểu diễn vị từ Hình II.1 (b) : nút gốc tên vị từ, nút đối
(a) (b) Hình II.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ụ 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 ->;
mar tom
bil
l liz
ann sue
jim
parent
(6)Để 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 cịn kết lời giải (kết thúc Yes) :
X = mary Y = bill ->; X = tom
Y = bill ->; 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 ông (bà) của 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 :
1 Ai cha (mẹ) Jim ? Giả sử có tên Y Ai cha (mẹ) Y ? Giả sử có tên X
Hình II.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 : Y
X
jim parent
(7)parent(Y, jim)
và
parent(X, Y)
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 của 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 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 được 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
II.2. Xây dựng luật
II.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
như sau :
(8)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 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
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 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)
child(Y, X) :- parent(X, Y)
(9)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 thế (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
và
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)
đượ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 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 II.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)
Y X
Y X
Z parent
grandparent parent
Y
X woman
(10)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) :
-parent(Z, X), parent(Z, Y), woman(X)
Hình II.4 Định nghĩa quan hệ chị (em) gái
Chú ý cách giải thích điều kiện X Y có cha mẹ : Z phải cha mẹ X, Z phải cha mẹ Y
Hay nói cách khác : Z1 cha mẹ X, Z2 cha mẹ Y, Z1 đồng với Z2
An nữ, Ann Sue cha mẹ nên Ann chị em gái Sue, ta có :
?- sister(ann, sue) Yes
Ta hỏi chị em gái Sue sau :
?- sister(X, sue)
Prolog đưa hai câu trả lời :
X = ann ->; X = sue -> Yes
Vậy Sue lại em gái ?! Điều sai ta chưa giải thích rõ định nghĩa chị em gái Nếu dựa vào định nghĩa câu trả lời Prolog hồn tồn hợp lý Prolog suy luận X Y đồng với nhau, người đàn bà có cha mẹ em gái Ta cần sửa lại định nghĩa cách thêm vào điều kiện X Y khác Như thấy sau này, Prolog có nhiều cách để giải quyết, nhiên lúc ta giả sử quan hệ :
different(X, Y)
đã Prolog nhận biết thoả mãn X Y không Định nghĩa chị (em) gái sau :
sister(X, Y) :
-parent(Z, X), parent(Z, Y), woman(X)
different(X, Y)
Ví dụ II.2 :Ta lấy lại ví dụ cổ điển sử dụng hai tiên đề sau : Tất người chết
Socrate người
Ta viết Prolog sau :
parent parent woman
sister X
Z
(11)mortal(X) :- man(X)
man(socrate)
Một định lý suy luận cách lôgich từ hai tiên đề Socrate phải chết Ta đặt câu hỏi sau :
?- mortal(socrate) Yes
Ví dụ II.3 :
Để Paul người, Bonzo vật, ta viết kiện :
man(paul) animal(bonzo)
Con người nói khơng phải loại vật, ta viết luật :
speak(X) :- man(X), not(animal(bonzo))
Ta đặt câu hỏi sau :
?- speak(bonzo) No
?- speak(paul) Yes
Ví dụ II.4 :
Ta xây dựng kiện luật có dạng vị từ chứa tham đối, sau đây, ta lấy ví dụ khác kiện luật không chứa tham đối :
'It is sunny' 'It is summer' 'It is hot' :-
'It is summer', 'It is sunny' 'It is cold' :-
'It is winter', 'It is snowing'
Từ chương trình trên, ta đặt câu hỏi :
?- 'It is hot' Yes
Câu trả lời 'It is hot' có kiện 'It is sunny' 'It is
summer' chương trình Cịn câu hỏi « ?- 'It is cold.' » có câu trả lời sai
II.2.2 Định nghĩa luật đệ quy
Bây ta tiếp tục thêm quan hệ vào chương trình Quan hệ sử dụng quan
hệ parent, có hai luật Luật thứ định nghĩa tổ tiên trực tiếp, luật thứ hai định
nghĩa tổ tiên gián tiếp
Ta nói X tổ tiên gián tiếp Z tồn liên hệ cha mẹ (ông bà) X Z :
Trong gia hệ Hình II.1, Tom tổ tiên trực tiếp Liz, tổ tiên gián tiếp Sue Ta định nghĩa luật (tổ tiên trực tiếp) sau :
Với X Z,
X tổ tiên Z X cha mẹ Z
(12)-parent(X, Z)
Hình II.5 Quan hệ tổ tiên : (a) X tổ tiên trực tiếp Z, (b) X tổ tiên gián tiếp Z
Định nghĩa luật (tổ tiên gián tiếp) phức tạp hơn, trình Prolog trở nên dài dòng hơn, mở rộng mức tổ tiên hậu duệ Hình II.6
Kể luật 1, ta có quan hệ tổ tiên định nghĩa sau :
ancestor(X, Z) :- % luật định nghĩa tổ tiên trực tiếp
parent(X, Z)
ancestor(X, Z) :- % luật : tổ tiên gián tiếp ông bà (tam đại)
parent(X, Y), parent(Y, Z)
ancestor(X, Z) :- % tổ tiên gián tiếp cố ông cố bà (tứ đại)
parent(X, Y1), parent(Y1, Y2), parent(Y2, Z)
ancestor(X, Z) :- % ngũ đại đồng đường
parent(X, Y1), parent(Y1, Y2), parent(Y2, Y3), parent(Y3, Z)
Tuy nhiên, tồn cách định nghĩa tổ tiên gián tiếp mức nhờ phép đệ quy (recursive) sau :
Với X Z,
X tổ tiên Z tồn Y cho
(1) X cha mẹ Y (2) Y tổ tiên Z
parent ancestor
(a) Z X
parent
parent
ancesto r
parent (b)
(13)Hình II.6 Các cặp tổ tiên hậu duệ gián tiếp mức khác
ancestor(X, Z) :
-parent(X, Z)
ancestor(X, Z) :
-parent(X, Y), ancestor(Y, Z) ?- ancestor(mary, X) X = jim ->;
X = ann ->; X = sue ->; X = bill Yes
Trong Prolog, hầu hết chương trình phức tạp sử dụng đệ quy, đệ quy khả mạnh Prolog
Hình II.7.Dạng đệ quy quan hệ tổ tiên (được quay ngang cho thuận tiện)
Cho đến lúc này, ta định nghĩa nhiều quan hệ (parent, woman, man, grandparent,
child, sister, mother ancestor) Ta thấy quan hệ tương ứng với mệnh
đề, nhiên, quan hệ ancestor lại có hai mệnh đề
Người ta nói mệnh đề liên quan (concern) đến quan hệ ancestor Trong trường hợp tất mệnh đề liên quan đến quan hệ, người ta nhận thủ
tục (procedure)
parent
ancestor parent Y
X
Z
parent
parent ancestor
parent Y1
X
Y2
Z
ancestor Y1
X
Y2 Y3 Z
ancestor parent
ancestor
Y
(14)II.2.3 Sử dụng biến Prolog
Khi tính tốn, NSD thay biến mệnh đề đối tượng khác Lúc ta nói biến bị ràng buộc
Các biến xuất mệnh đề gọi biến tự Người ta giả thiết biến lượng tử tồn thể đọc «với mọi» Tuy hiên có nhiều cách giải thích khác trường hợp biến xuất phần bên phải luật Ví dụ :
haveachil(X) :- parent(X, Y)
có thể đọc sau : (a) Với X Y,
nếu X cha (hay mẹ) Y X có người (b) Với X,
X có người tồn một Y cho X cha (hay mẹ) Y
Khi biến xuất lần mệnh đề khơng cần đặt tên cho Prolog cho phép sử dụng biến nặc danh (anonymous variable) biến có tên dấu gạch dịng _ Ta xét ví dụ sau :
have_a_child(X) :- parent(X, Y)
Luật nêu lên với X, X có X cha Y Ta thấy đích have_a_child khơng phụ thuộc vào tên con, sử dụng biến nặc danh sau :
have_a_child(X) :- parent(X, _)
Mỗi vị trí xuất dấu gạch dòng _ mệnh đề tương ứng với biến nặc
danh Ví dụ ta muốn thể tồn người có tồn hai đối tượng cho đối tượng cha đối tượng kia, ta viết :
someone_has_a_child :- parent(_, _)
Mệnh đề tương đương với :
someone_has_a_child :- parent(X, Y)
nhưng hoàn toàn khác với :
someone_has_a_child :- parent(X, X)
Nếu biến nặc danh xuất câu hỏi, Prolog không hiển thị giá trị biến kết trả Nếu ta muốn tìm kiếm người có con, mà khơng quan tâm đến tên gì, cần viết :
?- parent(X, _)
hoặc tìm kiếm người con, mà khơng quan tâm đến cha mẹ :
?- parent(_ , X)
(15)III. Kiểu liệu cấu trúc Prolog
III.1. Định nghĩa kiểu cấu trúc của Prolog
Kiểu liệu có cấu trúc, tương tự cấu trúc ghi, đối tượng có nhiều thành phần, thành phần lại cấu trúc Prolog xem thành phần đối tượng xử lý cấu trúc Để tổ hợp thành phần thành đối tượng nhất, Prolog sử dụng hàm tử
Ví dụ III.1 :
Cấu trúc gồm thành phần ngày tháng năm tạo hàm tử date
Ngày 2/9/1952 viết sau : date(2, september, 1952)
Mọi thành phần hàm tử date (hai số nguyên nguyên tử) Tuy nhiên ta thay thành phần biến hay cấu trúc khác Chẳng hạn ta thay thành phần thứ biến Day (chú ý tên biến bắt đầu chữ hoa) thể ngày tháng :
date(Day, may, 1890)
Chú ý Day biến, ràng buộc xử lý sau
Trong Prolog, mặt cú pháp, đối tượng hạng Trong ví dụ trên, may
date(Day, september, 2003) hạng
Hình III.1 Ngày tháng đối tượng có cấu trúc :
(a) biểu diễn dạng cấu trúc ; (b) giải thích cách viết Prolog
Mọi đối tượng có cấu trúc biểu diễn hình học dạng (tree), với hàm tử gốc, thành phần tham đối nhánh Nếu thành phần cấu trúc, thành phần tạo thành ban đầu Hai hạng có cấu trúc có biểu diễn có thành phần (pattern of variables) Hàm tử gốc gọi hàm tử hạng
Ví dụ III.2 :
Cấu trúc (đơn giản) sách gồm ba thành phần tiêu đề tác giả cấu trúc (con), năm xuất biến :
book(title(Name), author(Author), Year)
Ví dụ III.3 :
Xây dựng đối tượng hình học đơn giản không gian hai chiều Mỗi điểm xác định hai toạ độ, hai điểm tạo thành đường thẳng, ba điểm tạo thành tam giác Ta xây dựng hàm tử sau :
point biểu diễn điểm,
seg biểu diễn đoạn thẳng (segment),
triangle biểu diễn tam giác
date
02 september 2003
(a)
các tham đối
date( Day, september, 2003 )
hàm tử biến ký hiệu số
(16)Hình III.2 Một sốđối tượng hình học đơn giản Từ đó, đối tượng Hình III.2 biểu diễn hạng sau :
P1 = point(1, 1) P2 = point(2, 3)
S = seg(P1, P2) = seg(point(1, 1), point(2, 3)) T = triangle(point(4, 2), point(6, 4), point(7, 1))
Nếu chương trình, ta có điểm khơng gian ba chiều, ta định nghĩa hàm tử point3 sau :
point3(X, Y, Z)
Prolog cho phép sử dụng tên hai cấu trúc khác Ví dụ :
point(X1, Y1) point(X, Y, Z)
là hai cấu trúc khác
Trong chương trình, tên đóng hai vai trò khác nhau, trường hợp
point trên, Prolog vào số lượng đối số để phân biệt Cùng tên
tương ứng với hai hàm tử, hàm tử có hai đối số hàm tử có ba đối số Như vậy, hàm tử định nghĩa hai yếu tố :
Hình III.3 Biểu diễn dạng đối tượng (1) Tên hàm tử có cú pháp cú pháp nguyên tử
(2) Kích thước hàm tử số đối số
Biểu diễn dạng đối tượng điểm, đoạn thẳng tam giác cho Hình III.3 Như trình bày, đối tượng cấu trúc Prolog biểu diễn dạng cây, xuất chương trình dạng hạng
| | | | | | | | ⎯
4 ⎯ ⎯ ⎯ ⎯
(6, 4)
(4, 2)
(7, 1) a P2 = (2, 3)
P1 = (1, 1)
P1 = seg
point point
1
P1 = point
1
T = triangle point point point
(17)Hình III.4 Cấu trúc biểu thức (a + b) * (c − 5) Ví dụ biểu thức số học : (a + b) * (c − 5)
có dạng cây, viết dạng biểu thức tiền tố gồm hàm tử *, + − :
*(+(a, b), −(c, 5))
III.2. So sánh hợp nhất hạng
Ta vừa xét cách biểu diễn cấu trúc liệu sử dụng hạng Bây ta xét phép toán quan trọng liên quan đến hạng phép so khớp (matching), thực chất phép so sánh (comparison operators) hạng vị từ
Trong Prolog, việc so khớp tương ứng với việc hợp (unification) nghiên cứu lý thuyết lôgich Cho hai hạng, người ta nói chúng hợp với nhau, :
(1) chúng giống hệt nhau,
(2) biến xuất hai hạng ràng buộc cho hạng đối tượng trở nên giống hệt
Thứ tự chuẩn (standard order) hạng định nghĩa sau : Biến < Nguyên tử < Chuỗi < Số < Hạng
2 Biến cũ < Biến
3 Nguyên tử so sánh theo thứ tự ABC (alphabetically) Chuỗi so sánh theo thứ tự ABC
5 Số so sánh theo giá trị (by value) Số nguyên số thực xử lý (treated identically)
6 Các hạng phức hợp (compound terms) so sánh bậc hay số lượng tham đối (arity) trước, sau so sánh tên hàm tử (functor-name) theo thứ tự ABC cuối so sánh cách đệ quy (recursively) tham đối từ trái qua phải (leftmost argument first)
Ví dụ hai hạng date(D, M, 1890) date(D1, May, Y1) với nhờ ràng buộc sau :
• D ràng buộc với D1
• M ràng buộc với May
• Y1được ràng buộc với 1890
Trong Prolog, ta viết :
D = D1 M = May Y1 = 1890
Tuy nhiên, ta ràng buộc hai hạng date(D, M, 1890) date(D1, May,
2000), hay date(X, Y, Z) point(X, Y, Z)
Cấu trúc book(title(Name), author(Author)) so khớp với :
*
+ -
(18)book(title(lord_of_the_rings), author(tolkien))
nhờ phép :
Name = lord_of_the_rings Author = tolkien
Thuật toán hợp Herbrand so khớp hai hạng S T :
(1) Nếu S T hằng, S T khớp chúng có giá trị (chỉ đối tượng)
(2) Nếu S biến, T đối tượng bất kỳ, S T khớp nhau, với S ràng buộc với T Tương tự, T biến, T ràng buộc với S
(3) Nếu S T cấu trúc, S T khớp : (a) S T có hàm tử chính,
(b) tất thành phần khớp đôi
Như vậy, ràng buộc xác định ràng buộc thành phần
Ta quan sát luật thứ ba cách biểu diễn hạng dạng Hình III.5 Quá trình so khớp gốc (hàm tử chính) Nếu hai hàm tử giống nhau, trình tiếp tục với cặp tham đối chúng Mọi trình so khớp xem dãy phép tính đơn giản sau :
triangle = triangle point(1, 1) = X A = point(4, Y)
point(2, 3) = point(2, Z)
Một trình so khớp tích cực (positive), tất q trình so khớp bổ trợ tích cực
Hình III.5 Kết so khớp :
triangle(point(1, 1), A, point(2, 3)))= triangle(X, point(4, Y), point(2, Z)))
Sự ràng buộc nhận sau :
X = point(1, 1) A = point(4, Y) Z =
Sau ví dụ minh hoạ sử dụng kỹ thuật so khớp để nhận biết đoạn thẳng cho nằm ngang hay thẳng đứng
Một đoạn thẳng thẳng đứng hoành độ (abscissa) hai mút nhau, tương tự, nằm ngang tung độ (ordinate) hai mút
Ta sử dụng quan hệ đơn phân để biểu diễn tính chất sau : triangle
point A point
1
triangle
X point point
(19)vertical(seg(point(X, Y), point(X, Y1))) horizontal(seg(point(X, Y), point(X1, Y)))
Ta có :
?- vertical(seg(point(1, 1), point(1, 2))) Yes
?- vertical(seg(point(1, 1), point(2, Y))) No
?- horizontal(seg(point(1, 1), point(2, Y))) Y =
Yes
Hình III.6 Minh hoạ đoạn thẳng nằm ngang thẳng đứng
Với câu hỏi thứ nhất, Prolog trả lời Yes kiện so khớp Với câu hỏi thứ hai, khơng có kiện so khớp nên Prolog trả lời No Với câu hỏi thứ ba, Prolog cho Y giá trị để so khớp
Ta đặt câu hỏi tổng quát sau : Cho biết đoạn thẳng thẳng đứng có mút cho trước (2, 3) ?
?- vertical(seg(point(2, 3), P)) P = point(2, _0104)
Yes
Câu trả lời có nghĩa đường thẳng có phương trình X = thẳng đứng Chú ý đây, ta không nhận tên biến mong muốn (là Y), mà tuỳ theo phiên cài đặt cụ thể, Prolog tạo tên biến thực chương trình, _0104 ví dụ trên, nhằm tránh đặt lại tên biến NSD với hai lý sau Thứ nhất, tên biến xuất mệnh đề khác biểu diễn biến khác Thứ hai, áp dụng liên tiếp mệnh đề, «copy» sử dụng với biến khác
Bây ta đặt tiếp câu hỏi thú vị sau : Có tồn đoạn thẳng vừa thẳng đứng vừa nằm ngang hay không ?
?- vertical(S), horizontal(S)
S = seg(point(_00E8, _00EC), point(_00E8, _00EC)) Yes
Câu trả lời có nghĩa đoạn thẳng suy biến thành điểm vừa thẳng đứng, lại vừa nằm ngang Ta thấy kết nhận nhờ so khớp Ở đây, tên biến _00E8
_00EC, tương ứng với X Y, tạo Prolog
point(X, Y) point(X,
Y1)
point(X, Y)
(20)Sau ví dụ khác minh hoạ hai cấu trúc số khớp với
Hình III.7 Kết so khớp :
student( jean, X, address(maljuin, caen) ) = student( jean,info, Y )
IV. Quan hệ Prolog lơgich tốn học
Prolog có quan hệ chặt chẽ với lơgich tốn học Dựa vào lơgich tốn học, người ta diễn tả cú pháp nghĩa Prolog cách ngắn gọn súc tích Tuy nhiên khơng mà người học lập trình Prolog cần phải biết số khái niệm lôgich toán học Thật may mắn khái niệm lơgich tốn học khơng thực cần thiết để hiểu sử dụng Prolog công cụ lập trình Sau số quan hệ Prolog lơgich tốn học
Prolog có cú pháp công thức lôgich vị từ bậc (first order predicate logic), viết dạng mệnh đề (các lượng tử ∀ ∃ không xuất cách tường minh), hạn chế đơn dạng mệnh đề Horn, mệnh đề có trực kiện dương (positive literals) Năm 1981, Clocksin Mellish đưa chương trình Prolog chuyển cơng thức tính vị từ bậc thành dạng mệnh đề
Cách Prolog diễn giải chương trình theo kiểu Tốn học : Prolog xem kiện luật tiên đề, xem câu hỏi NSD định lý cần đốn Prolog tìm cách chứng minh định lý này, nghĩa định lý suy luận cách lơgich từ tiên đề
Về mặt thủ tục, Prolog sử dụng phương pháp suy diễn quay lui (back chaining) để hợp giải (resolution) toán, gọi chiến lược hợp giải SLD (Selected, Linear, Definite : Linear resolution with a Selection function for Definite sentences) J Herbrand A Robinson đề xuất năm 1995
Có thể tóm tắt sau : để chứng minh P(a), người ta tìm kiện
P(t)
hoặc luật :
P(t) :- L1, L2, …, Ln
sao cho a hợp (unifiable) với t nhờ so khớp Nếu tìm P(t) kiện vậy, việc chứng minh kết thúc Còn tìm P(t) luật, cần chứng minh vế bên phải L1, L2, , Ln
Trong Prolog, câu hỏi luôn dãy từ đến nhiều đích Prolog trả lời câu hỏi cách tìm kiếm để xố (erase) tất đích Xố đích nghĩa chứng minh đích thoả mãn, với giả thiết quan hệ chương trình Nói cách
student
jean X address
maljuin caen
student