Tài liệu Lập trình trí tuệ nhân tạo Prolog - Pdf 85

BK
TP.HCM
BK
TP.HCM

ĐẠI HỌC BÁCH KHOA TPHCM
KHOA CÔNG NGHỆ THÔNG TIN


III.2

Cài đặt và làm việc với B-Prolog__________________________________________________ 7

III.3

Gỡ rối chương trình (debugging)__________________________________________________ 8

III.4

Các thuật ngữ cơ bản trong B-Prolog ______________________________________________ 9

III.5

Các kiểu dữ liệu và các vị từ xây dựng sẵn (built-in) cơ bản trong B-Prolog _______________ 10

Chương IV.

Thực thi chương trình. - Đặt câu hỏi và nhận câu trả lời_________________ 12

Chương V.

IV. Phép hợp nhất - Cơ chế tìm câu trả lời của Prolog. __________________ 15

V.1

Phép hợp nhất _______________________________________________________________ 15

V.2


Chương X.

Danh sách hai chiều _______________________________________________ 29

PHẦN II. LISP ________________________________________________________ 30
Chương I.

Giới thiệu ________________________________________________________ 31

I.1

Lịch sử phát triển _______________________________________________________________ 31

I.2

Đặc điểm của gcLisp ____________________________________________________________ 31

1.

Các đặc điểm của ngôn ngữ_____________________________________________________ 31

2.

Kiểu dữ liệu _________________________________________________________________ 32

Chương II.

Lập trình với gcLisp _______________________________________________ 33



NTHCDR, BUTLAST và LAST _________________________________________________ 36

4.

LENGTH và REVERSE _______________________________________________________ 37

II.3

Thao tác trên Integer, Ratio, Floating-Point Numbers, ... ______________________________ 37

II.4

Lập trình hướng dữ liệu________________________________________________________ 38

1.

ASSOC ____________________________________________________________________ 38

2.

ACONS ____________________________________________________________________ 38

Chương III.

Hàm và Biến cục bộ _______________________________________________ 40

III.1

Định nghĩa hàm – Chương trình đệ quy trong Lisp___________________________________ 40


Vị từ NULL và ENDP_________________________________________________________ 45

IV.5

Các vị từ xác định kiểu dữ liệu __________________________________________________ 45

IV.6

Các vị từ trên số______________________________________________________________ 47

IV.7

Các toán tử logic _____________________________________________________________ 48

1.

AND ______________________________________________________________________ 48

2.

OR ________________________________________________________________________ 49

3.

NOT_______________________________________________________________________ 49

IV.8

Các dạng điều kiện ___________________________________________________________ 50


Pointed pair _________________________________________________________________ 54

3.

Ký hiệu pointed pair __________________________________________________________ 54

4.

Doublets trong LISP __________________________________________________________ 54

V.3

Lời gọi hàm tính toán _________________________________________________________ 55

1.

Apply______________________________________________________________________ 55

2.

Funcall_____________________________________________________________________ 55

V.4

Hàm vô danh ________________________________________________________________ 56

1.

Lambda expression ___________________________________________________________ 56

1.

progn ______________________________________________________________________ 59

2.

prog1 ______________________________________________________________________ 59

Chương VII.

Các thao tác với tập tin __________________________________________ 61

VII.1

Lưu lại tập tin chương trình và dữ liệu ____________________________________________ 61

VII.2

Biên dịch tập tin______________________________________________________________ 61

VII.3

Debugging __________________________________________________________________ 61

Chương VIII.

Cài đặt và sử dụng gcLisp ________________________________________ 63

VIII.1



I.1

Lập trình hướng đối tượng (Object Oriented Programming) với Smalltalk ___________________ 67

1.

Đối tượng (Object) - Các thành phần (member) của đối tượng: Các thuộc tính (properties) và các
phương thức (methods) - Sự bao đóng (encapsulation). ____________________________________ 67

2.

Khái niệm class - Mối quan hệ giữa object và class - Khái niệm instance. _________________ 67

3.

Phương thức - Thông điệp (message) - Đối tượng nhận thông điệp (receiver). Đối số của thông
điệp (argument)___________________________________________________________________ 68

4.

Các loại thông điệp: unary, binary và keyword. Độ ưu tiên giữa các thông điệp.____________ 69

5.

Câu lệnh (statement) - kịch bản (script)____________________________________________ 70

6.

Che giấu thông tin (hiding information) ___________________________________________ 71


5.

Định nghĩa một class mới và phương thức mới - Sự biên dịch offline và online một phương thức
76

6.

Bên trong phương thức - Các từ khóa self và super___________________________________ 76

7.

Các phương thức primitive _____________________________________________________ 78

8.

Khái niệm về MetaClass - Sử dụng MetaClass - Lập trình OOP động (dynamic) với Smalltalk 78

iv
9.

Các lớp đặc biệt: Compiler, Window, ViewManager, Prompter... _______________________ 79

I.3

Một số kỹ thuật lập trình căn bản trên Smalltalk _______________________________________ 79

1.

Sự mô phỏng các cấu trúc điều khiển._____________________________________________ 79


Giới thiệu về một số lớp có sẳn của VWIN_________________________________________ 90

1.

Lớp Object__________________________________________________________________ 90

2.

Lớp Magnitude ______________________________________________________________ 91

3.

Lớp Number, Integer, Float, Character ____________________________________________ 91

4.

Lớp IndexedCollection:________________________________________________________ 91

5.

Lớp Context: ________________________________________________________________ 94

Chương III.

MỘT SỐ KỸ THUẬT LẬP TRÌNH CĂN BẢN VỚI LỚP COLLECTION
TRÊN SMALLTALK - VÍ DỤ VÀ BÀI TẬP _______________________________________ 96

III.1


2.

Bài tập đề nghị: ______________________________________________________________ 98

III.4

Bài tập tổng hợp: _____________________________________________________________ 98

1.

Ví dụ:______________________________________________________________________ 98

2.

Bài tập đề nghị_______________________________________________________________ 98

sử dụng để suy luận,
Prolog không có cơ thế chồng chất hàm như các ngôn ngữ thủ tục khác, chính điều này sẽ
làm những người quen với việc lập trình thủ tục gặp khó khăn khi bước đầu lập trình với
Prolog.
Công việc đầu tiên khi lập trình trên Prolog là định nghĩa các vị từ - các khái niệm mà
mình cần cung cấp cho chương trình.
Xét các ví dụ sau:
VD1:
Dữ kiện ban đầu: Mọi người đều ph
ải chết. Socrates là người.
Yêu cầu: Chúng ta muốn hệ thống phải có khả năng suy luận và trả lời được các vấn đề
liên quan đến các khái niệm trên: ai là người, ai không là người, ai phải chết, ai không phải
chết. Ở đây chúng ta có một sự suy luận thông minh đặc trưng cho sức mạnh của Prolog: hệ
thống sẽ tự động suy luận rằng Socrates phải chết (điều không được cung cấp ban đầu).
Để
biểu diễn các vấn đề trên bằng ngôn ngữ Prolog, chúng ta cần phải xác định cần phải
biểu diễn những khái niệm gì.
Trong vấn đề này chúng ta có hai khái niệm cần biểu diễn: một thực thể nào đó có thể là
người (hoặc không), và một thực thể nào đó có thể chết.
Như vậy chúng ta biểu diễn vấn đề đầu tiên bằng ngôn ngữ Prolog như sau:
nguoi(symbol)
Symbol là một kiểu dữ li
ệu đặc biệt của Prolog, dùng để biểu diễn cho một thực thể, một
khái niệm tổng quát.
Như vậy chúng ta vừa định nghĩa một khái niệm: một symbol nào đó có thể là người, một
symbol nào khác thì không.
Hiểu như một sự định nghĩa hàm, chúng ta có thể xem như định nghĩa một hàm mang tên
nguoi, hàm này có thông số một biến thuộc kiểu dữ liệu symbol, và kết quả của hàm này,
Hướng dẫn sử dụng BProlog
3

theo một cách khác đơn giản, và hợp với tinh thần của Prolog hơn: giai thừa của 0 là 1, và giai
thừa của một số lớn hơn 0 là giai thừa của số liền trước nó nhân với chính nó.
V
ới cách đặt vấn đề này, chúng ta chỉ có một khái niệm phải biểu diễn: giai thừa của một
số là gì? (thật ra chúng ta còn một số khái niệm phải đưa ra: một số đứng trước một số là gì,
nhân hai số nghĩa là gì, tuy nhiên Prolog đã cung cấp các toán tử để giải quyết vấn đề này.
Hiểu theo một nghĩa nào đó, các vấn đề trên là các tiên đề, không cần phải giải thích với hệ
thố
ng.)
Nếu quen với ngôn ngữ lập trình thủ tục, chúng ta có khuynh hướng diễn tả khái niệm giai
thừa như sau:
giaithua(integer)
Ở đây cách đặt vấn đề như vậy là không thích hợp với ngôn ngữ Prolog, vì
Hướng dẫn sử dụng BProlog
4
. Một vị từ chỉ có thể trả lời là đúng hoặc sai, trong khi chúng ta đang mong muốn kết
quả trả về theo cách khai báo này một số
. Ngôn ngữ Prolog không có sự chồng chất hàm, nghĩa là kết quả của hàm (vị từ)
không thể dùng như một thông số cho một vị từ khác, trong khi chúng ta đang định dùng kết
quả của hàm này để tính tiếp giá trị cho một hàm khác.(Chúng ta định dùng hàm này để tính
giai thừa của n -1 , rồ
i nhân tiếp cho n để ra kết quả cuối cùng).
Vị từ thích hợp sẽ như sau:
giaithua(integer,integer)
Điều này, hiểu theo ngôn ngữ thủ tục, nghĩa là chúng ta khai báo một hàm có thông số là
hai số nguyên, và kết quả trả về sẽ là đúng hoặc sai.
Điều chúng ta muốn diễn tả có nghĩa là: giai thừa của một số nguyên (integer) sẽ là một
số nguyên khác.
Nếu chúng ta giải thích được cho Prolog hiểu giai thừa của mộ
t số nguyên sẽ được tính

Như vậy chúng ta sẽ viết phần clause cho vị từ này như sau:
nguoi(socrates).
Chúng ta vừa viết một sự kiện: socrates là người là điề
u chắc chắn đúng. Bất kỳ symbol
nào có tên là socrates là người là chắc chắn đúng, không cần phải có một điều kiện ràng buộc
nào kèm theo.
Lưu ý:
i/ Có hai cách viết dạng hằng (literal) cho symbol trên Prolog:
Một danh hiệu mở đầu bằng ký tự thường (socrates, sOCRATES…)
Một chuỗi ký hiệu đặt trong cặp ký hiệu ‘’ (‘socrates’,’SOCRATES’,’ sOCRATES’,
‘Socrates’…)
ii/ Một mệnh đề luôn kết thúc bằng ký tự '.'
VD4: hãy viết phần clause cho vị từ chet trong VD1.
Dữ ki
ện ban đầu chỉ cung cấp cho chúng ta một sự kiện liên quan đến vấn đề này: symbol
sẽ phải chết nếu (và chỉ nếu) đó là người. Điều này sẽ xác định một quy tắc: symbol sẽ chỉ
phải chết, tức vị từ sẽ trả về kết quả true, nếu symbol đó là người. Vấn đề symbol nào là
người và symbol nào không là người chúng ta đã đưa ra khái niệm và giải thích cho Prolog
trong các ví dụ 1 và 3.
Nh
ư vậy phần mệnh đề sẽ được viết như sau;
chet(X):-nguoi(X).
Mệnh đề dạng rule sẽ bao gồm hai phần, nằm ở hai bên cặp ký hiệu ":-". Phần bên trái cho
biết vị từ đang được đề cập và các thông số tương ứng. Phần bên phải, xác định điều kiện trả
lời đúng cho luật trên, bao gồm các lời gọi các vị từ khác, được ngăn cách bởi ký hiệ
u ',', gọi
Hướng dẫn sử dụng BProlog
6
là các mệnh đề con (sub-clause). Trong ví dụ trên, chỉ có một sub-clause. Một luật chỉ trả lời
đúng nếu tất cả các sub-clause bên vế phải đều trả lời đúng.

sánh 2 biểu thức số học exp1 =:= exp2.
iv./ Phần vị từ trên biểu diễn cho việc sử dụng kỹ thuật lập trình đệ quy, sẽ là sức mạnh
lập trình chủ yếu của Prolog. Xem thêm về phần lập trình đệ quy trên Prolog trong các phần
sau.

Tóm tắt
. Các khái niệm được mô tả qua các vị từ sẽ được giải thích bằng các mệnh đề.
. Có hai loại mệnh đề: sự kiện và luật.
. Thông số được truyền trong lời gọi các mệnh đề con phải là biến.
. Các kỹ thuật chủ yếu để lập trình trên Prolog là hợp nhất và đệ quy.
Hướng dẫn sử dụng BProlog
7
Chương III. Môi trường lập trình B-Prolog

Trước khi thực thi các chương trình viết bằng ngôn ngữ Prolog ở trên, chúng ta cần phải
chọn một môi trường lập trình cụ thể. Trong môn học này, chúng ta sẽ sử dụng phần mềm lập
trình B-Prolog ( của Neng-Fa
Zhou làm công cụ lập trình cho ngôn ngữ Prolog. Phần này đầu tiên sẽ giới thiệu sơ lược về
B-Prolog: cách cài đặt, một phiên làm việc trên nó, các kiểu dữ liệu và một số vị từ có sẵn.
Phần ti
ếp theo sẽ trình bày cách sử dụng B-Prolog để viết các chương trình ví dụ đơn giản.

III.1 Giới thiệu sơ nét về B-Prolog
B-Prolog ngoài việc hỗ trợ viết các chương trình bằng ngôn ngữ Prolog chuẩn còn cung
cấp một môi trường cho phép người sử dụng có thể nạp (consult, load), dịch (compile), debug
và thực thi chương trình. Đặc biệt là môi trường này cho phép sử dụng lại các lệnh đã gọi
trước đó thông qua phím mũi tên lên và xuống. Ngoài ra, B-Prolog còn có thể liên kế
t với
ngôn ngữ C, C++, Java; hỗ trợ lập trình đồ họa cũng như cho phép lập trình ràng buộc
(Constraint Logic Programming) trên nó.

Để dịch một chương trình Prolog trong môi trường B-Prolog thì chúng ta dùng lệnh
compile(file-name) với file-name là tên chương trình cần dịch. Nếu tên file này có phần mở
rộng là .pl thì có thể không cần gõ vào phần mở rộng đó. File được dịch sẽ có cùng tên file-
name với file dịch nhưng có phần mở rộng là .out. Để thực thi một file trong B-Prolog chúng
ta phải n
ạp các file đã được dịch này vào bộ nhớ bằng lệnh load(file-name). Một cách để kết
hợp cả giai đoạn dịch và nạp này là sử dụng lệnh consult(file-name) hoặc đơn giản là gõ [file-
name] ở dấu nhắc lệnh.
Sau khi nạp chương trình, chúng ta có thể thực thi chương trình thông qua các câu hỏi
(query). Với mỗi câu hỏi hệ thống sẽ thực thi chương trình và trả kết quả về là yes
nếu thành
công và no nếu việc thực thi chương trình thất bại. Nếu trong câu hỏi có chứa biến và việc
thực thi thành công thì chương trình sẽ thông báo cho chúng ta giá trị ràng buộc với các biến
đó. Chúng ta có thể yêu cầu hệ thống tìm thêm lời giải khác bằng cách gõ dấu ; và enter sau
lời giải đã biết.
III.3 Gỡ rối chương trình (debugging)
Hướng dẫn sử dụng BProlog
9
Để gỡ rối cho một chương trình Prolog cũng như để hiểu rõ hơn cơ chế hoạt động của
Prolog, chúng ta sẽ sử dụng lệnh trace. Khi gõ lệnh trace ở dấu nhắc, hệ thống sẽ chuyển sang
chế độ gỡ rối. Khi đang ở chế độ gỡ rối, tất cả các lệnh, câu hỏi nhập vào cho hệ thống sẽ
được thực hiện theo từ
ng bước. Để thoát khỏi chế độ gỡ rối, chúng ta sử dụng lệnh notrace.
III.4 Các thuật ngữ cơ bản trong B-Prolog
Toán hạng (term) trong B-Prolog là các hằng, biến hoặc các toán hạng tổ hợp (compound
term). Có 2 loại hằng: atom và số.
Atom là chuỗi các ký tự, số hoặc dấu gạch dưới có ký tự bắt đầu ở dạng chữ thường. Bất
kỳ chuỗi nào nằm giữa cặp dấu nháy đơn đề
u là atom. Đây chính là kiểu litteral mà ở phần
trước chúng ta đã đề cập đến. Một dấu nháy đơn cũng được dùng để biểu diễn ký tự escape.

• var(X): kiểm tra X có là một biến hay không
• compound(X): X là một toán hạng tổ hợp. Vị từ này trả về đúng nếu X là một cấu
trúc hay là một danh sách
Các vị từ hợp nhất (sẽ được trình bày chi tiết về phép hợp nhất ở phần sau):
• X = Y: hợp nhất giữa X và Y
• X \= Y : 2 toán hạng X và Y không th
ể hợp nhất
Các vị từ so sánh và thao tác trên các toán hạng :
• Term1 == Term2: hai toán hạng Term1 và Term2 là đồng nhất (strictly identical)
• Term1 \== Term2: hai toán hạng Term1 và Term2 không đồng nhất
Các vị từ trên số:
• Exp1 is Exp2: đã trình bày ở phần trước
• X =:= Y: hai biểu thức số X và Y bằng nhau (numerically)
• X =\= Y: hai biểu thức số X và Y khác nhau
• X<Y, X=<Y, X>Y,X>=Y : là các phép toán so sánh giữa các biểu thức số khác
Các phép toán số học:
• X + Y, X – Y, X * Y, X / Y : các phép toán cộng trừ nhân chia đơn giản
• X // Y : phép chia nguyên
Term Atom
Number
Variable
Compound Term
Floating-point
Integer
Structure
List
Array
Hashtable
Hướng dẫn sử dụng BProlog
11

nguoi(‘Socrates’)
Hướng dẫn sử dụng BProlog
13
Dựa trên tinh thần của của khái niệm, câu phát biểu của chúng ta có nghĩa là "Socrates là
người", hệ thống sẽ hiểu rằng chúng ta muốn đặt một câu hỏi nghi vấn "Socrates là người phải
không?"
Sau khi ấn Enter, chúng ta sẽ thấy hệ thống có ngay câu trả lời: yes.
Thay bằng một tên khác, ví dụ:
nguoi(‘Xeda’)
Hệ thống sẽ trả lời no.
Chúng ta thấy các câu trả lời của hệ thống dựa trên kiến thức mà chúng ta đã cung cấ
p.
Dựa vào những gì mà chúng ta đã cung cấp, hệ thống chỉ biết có một người là Socrates, tất cả
những symbol khác đều không phải là người.
Tuy nhiên, với cơ chế suy luận mà chúng ta cung cấp, hệ thống có thể suy luận ra những
điều chưa được cung cấp sẳn. Đây chính là điểm tạo nên sức mạnh lập trình của Prolog.
Nhập vào câu hỏi như sau:
chet(‘Socrates’)
Câu trả lời là: Yes.
Với mộ
t tên người khác:
chet(‘Xeda’)
Câu trả lời là: No.
Hệ thống đã tự động suy luận theo nguyên lý mà chúng ta muốn nó phải "học": ai là người
thì người đó phải chết.
Ngoài những câu hỏi dạng Yes/No, Prolog có thể trả lời các câu hỏi yêu cầu tìm đáp số.
Chúng ta nhập vào một câu hỏi như sau:
chet(X)
Đến đây, trong câu hỏi của chúng ta có một biến: X (nhắc lại: mọi danh hiệu mở đầu là ký
tự hoa đều là biến). Khi trong câu hỏi c

Chúng ta sẽ đặt câu hỏi theo dạng tìm lời giải:
giaithua(3,X)
Câu trả lời sẽ là X = 6
Chúng ta cũng có thể đặt câu hỏi ngược:
giaithua(X,6)
Ý tưởng của câu hỏi sẽ là: giai thừa của số nào sẽ bằng 6.
Tuy nhiên chúng ta không cung cấp cho hệ thống cơ chế suy luận để trả lời câu hỏi này
nên h
ệ thống sẽ báo lỗi.
Tất nhiên chúng ta cũng có thể đặt câu hỏi như sau:
giaithua(X,Y)
Cả hai thông số đều là biến. Như vậy câu hỏi có thể hiểu là: số nào (X) giai thừa thì thành
một số khác (Y). Câu hỏi gần như vô nghĩa và những câu trả lời của hệ thống cũng sẽ chẳng
mang một ý nghĩa thực sự có nghĩa nào.

Tóm tắt:
. Chương trình Prolog sẽ hoạt động theo cơ
chế tương tác. Người sử dụng sẽ cung cấp yêu cầu
và hệ thống sẽ trả lời các yêu cầu này.
. Nếu câu hỏi không chứa biến thì hệ thống sẽ kiểm tra phát biểu của chúng ta là đúng hoặc
sai, ngược lại, hệ thống sẽ tìm các giá trị của các biến làm cho phát biểu của ta là đúng.

Hướng dẫn sử dụng BProlog
15
Chương V. IV. Phép hợp nhất - Cơ chế tìm câu trả lời
của Prolog.

V.1 Phép hợp nhất
Công việc quan trọng nhất của Prolog trong việc tìm câu trả lời là thực hiện việc hợp nhất.
Để tiện cho việc theo dõi, phép hợp nhất được ở đây sẽ được biểu diễn bởi dấu =. Nó có hai

ường
hợp a
Hướng dẫn sử dụng BProlog
16
X = Y Æ true nếu cả X và Y đều đã có giá trị và những giá trị này bằng nhau
X -1 = Y Æ false nếu X và Y đều đã có giá trị và X nhỏ hơn Y
. Trường hợp 2: tất cả các biến của một vế đều đã có giá trị, chúng ta sẽ quay
về về trường hợp b
X = Y Æ true nếu X chưa có giá trị và Y đã có giá trị, sau phép hợp nhất, X sẽ
nhận giá trị của Y
X - 1 = Y Æ true nếu X chưa có giá tr
ị, Y đã có giá trị. Sau phép hợp nhất, X
sẽ có giá trị bằng Y +1
. Trường hợp 3: cả hai vế đều còn chứa biến ở tình trạng unbound Æ hợp nhất
vẫn thành công và mỗi khi một biến nào đó trong vế phải hoặc vế trái có giá trị
thì biến còn lại cũng sẽ được ràng buộc với giá trị đó
X = Y Æ true nếu cả X và Y đều chưa gán giá trị
X-1 = Y Æ true nếu cả
X và Y đều chưa gán giá trị
V.2 Cơ chế tìm câu trả lời của Prolog
Nếu chúng ta đặt ra cho Prolog một câu hỏi, Prolog sẽ thực hiện công việc so trùng
(match), tức là tìm mệnh đề đầu tiên đề cập đến khái niệm mà chúng ta muốn hỏi. Nói một
cách chi tiết hơn, Prolog sẽ dùng phép hợp nhất đã trình bày ở phần trên trong quá trình so
trùng cấu trúc dữ liệu một subgoal với một mệnh đề.
Trở lại VD6, sau khi đã hoàn tất ch
ương trình, chúng ta đặt ra câu hỏi như sau:
nguoi(‘Socrates’)
Prolog sẽ tìm mệnh đề đầu tiên có liên quan đến khái niệm nguoi. Hiển nhiên, mệnh đề
đầu tiên (và duy nhất) có liên quan đến khái niệm này là:
nguoi(‘Socrates’)

biến cần tìm đã có giá trị (ở đây chỉ có một biến là X), nên hệ thống sẽ công bố đã tìm ra lời
giải và in ra giá trị của X ( X = ‘Socrates’)
Chúng ta xét trường hợp khi ở câu hỏi so trùng với một lu
ật:
chet(Y)
Chúng ta hoàn toàn có thể đặt câu hỏi là chet(X), nhưng chúng ta sẽ đặt tên biến khác để
tiện phân biệt giữa biến trong câu hỏi và thông số cục bộ ở mệnh đề. Thực ra, B-Prolog sẽ tự
tạo ra và quản lý các biến của nó trong quá trình đi tìm lời giải cho một goal nào đó. Chúng ta
có thể thấy rõ điều này qua quá trình debug (dùng lệnh trace) chương trình. Các biến này
được bắt đầu bằng dấu gạch dưới và một dãy 6 số hoặ
c ký tự tiếp theo. Để hiểu rõ cơ chế tìm
câu trả lời của B-Prolog chúng ta có thể chuyển sang chế độ debug khi đặt câu hỏi.
Câu hỏi được so trùng với mệnh đề sau:
chet(X): - nguoi (X).
Vì hai biến X (thông số của mệnh đề) và Y (thông số của câu hỏi) đều chưa chứa giá trị,
hệ thống sẽ xem cả hai biến là một, tức là, khi X có được giá trị thì Y cũng có giá trị đó và
ngược lại.
Do đ
ây là một luật, nên hệ thống sẽ tiến hành thực hiện các sub-clause. Hệ thống sẽ thực
hiện sub-clause đầu tiên nguoi(X).
Quá trình thực hiện các sub-clause ở vế phải sẽ được thực hiện như sau:
• Nếu sub-clause này có thông số là biến unbound, Prolog sẽ tìm giá trị của biến
này để sub-clause có giá trị Yes, nếu không tìm được giá trị như vậy, sub-
clause sẽ thất bại.
• Nếu sub-clause có thông số đều là biến bound (
đã có giá trị) hoặc là hằng,
Prolog sẽ kiểm tra xem sub-clause có trả về giá trị Yes hay không, nếu không,
sub-clause sẽ thất bại.
Các sub-clause sẽ được tiến hành từ trái qua phải, và nếu có một sub-clause thất bại,
mệnh đề được so trùng sẽ thất bại.

nguoi(‘Xeda’).
vua(‘Xeda’).
sungsuong(X) :- nguoi(X), vua(X).
Như vậy trong ví dụ này, ngoài khái niệm về người, chúng ta đưa ra khái niệm về vua và
sự sung sướng. Diễn giải những thông tin trong các dữ kiện trên thành ngôn ngữ t
ự nhiên,
chúng ta có được các điều sau: "Thế giới mà chúng ta sống có hai người là Socrates và Xeda.
Chúng ta có một vua la Xeda, và một thực thể nào đó chỉ sung sướng nếu thực thể đó vừa
người vừa là vua."
Lưu ý rằng trong ví dụ trên, các mệnh đề liên quan đến cùng một vị từ phải viết liên tiếp
nhau.
Xét khi hệ thống trả lời câu hỏi sau:
sungsuong(X)
Trước tiên hệ thống sẽ so trùng câu hỏi trên với mệnh đề
sungsuong(X) :-
nguoi(X),vua(X). Lưu ý rằng vào lúc này chúng ta có hai biến X: một biến X là thông số của
câu hỏi và một biến X là thông số của mệnh đề. Về nguyên tắc, hai biến X này hòan tòan
khác nhau.
Tuy nhiên, khi so trùng câu hỏi với mệnh đề, do cả hai biến X lúc này đều chưa chứa giá
trị, nên chúng sẽ được xem như một. Nhưng cần chú ý rằng biến X sử dụng trong các sub-
clause là biến X thông số của mệnh đề.
Sau đó Prolog sẽ tiế
n hành các sub-clause. Ở sub-clause đầu tiên, nguoi(X), tương tự như
VD6, Prolog sẽ tìm được câu trả lời là X = Socrates.
Khi thực hiện sub-clause thứ hai, vua(X), do X đã có giá trị (Socrates), Prolog sẽ kiểm tra
xem giá trị này có làm giá trị của mệnh đề là true hay không.
Như các ví dụ trên, việc tiến hành trả lời một sub-clause cũng tương tự như khi trả lời một
câu hỏi, Prolog lại so trùng sub-clause với một mệnh đề cùng tên. Prolog tìm thấy một mệnh
Hướng dẫn sử dụng BProlog
20

đầu tiên của ví dụ trên (P(X) :- Q(X), !.) thì chúng ta sẽ chỉ có một kết quả cho dù chúng ta có
dùng dấu ‘;’ để yêu cầu B-Prolog cung cấp thêm lời giải khác.
Vị từ nhát cắt được viết là !, được viết ở thân của một mệnh đề sẽ loại bỏ tất cả các khả
năng lựa chọn có thể của các vị từ đứng trước (bên trái) nó trong mệnh đề.
VD11: sử dụng vị từ
findall để tìm tất cả các lời giải
?-findall(X, member(X,[(1,a),(2,b),(3,c)]), Xs)
Xs = [(1,a),(2,b),(3,c)]
Trong ví dụ trên, vị từ member là một vị từ được xây dựng sẵn (built-in) trong B-Prolog.
Vị từ này có hai đối số, dùng để kiểm tra xem đối số thứ nhất có phải là phần tử của đối số thứ
hai hay không.

Trích đoạn DOLIST Hỗ trợ lặp trên danh sách Chương VII Các thao tác với tập tin Phương thức Thông điệp (message) Đối tượng nhận thông điệp (receiver) Đối số của thông điệp (argument) Các loại thông điệp: unary, binary và keyword Độ ưu tiên giữa các thông điệp. Sự thừa kế (inheritance) Che phủ (override) Sự dẩn xuất (derivation) M ối quan hệ giữa các đối tượng: cây các lớp
Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status