1. Trang chủ
  2. » Địa lý

Giáo trình Lập trình logic trong prolog: Phần 1 - NXB Đại học Quốc gia

20 79 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

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

L

L

p

p

p

t

t

t

r

r

r

ì

ì

ì

n

n

n

h

h

h

L

L

L

ơ

ơ

ơ

g

g

g

í

í

í

c

c

c

h

h

h

t

t

t

r

r

r

o

o

o

n

n

n

g

g

g

P

P

P

r

r

r

o

o

o

l

l

l

o

o

o

g

g

g

(2)(3)

PGS.TS PHAN HUY KHÁNH

L

L

L

p

p

p

t

t

t

r

r

r

ì

ì

ì

n

n

n

h

h

h

L

L

L

ơ

ơ

ơ

g

g

g

í

í

í

c

c

c

h

h

h

t

t

t

r

r

r

o

o

o

n

n

n

g

g

g

P

P

P

r

r

r

o

o

o

l

l

l

o

o

o

g

g

g

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à () 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 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

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)

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,

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

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 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

Ngày đăng: 09/03/2021, 05:27

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w