Tải bản đầy đủ (.pdf) (101 trang)

Tài liệu Lập trình Prolog_chương 1-2-3 pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (970.62 KB, 101 trang )


LÅÌI NỌI ÂÁƯU
Cún sạch ny nhàòm cung cáúp cå såí l thuút v cạc phỉång phạp
láûp trçnh cå bn nháút ca män hc
«
Láûp trçnh lägich
»
(Programming in Logic).
Ngỉåìi âc s âỉåüc lm quen våïi mäüt säú k thût láûp trçnh lägich âỉåüc ỉïng dủng
tỉång âäúi phäø biãún v ch úu trong lénh vỉûc trê tû nhán tảo (Artificial
Intelligence) nhỉ cäng nghãû xỉí l tri thỉïc, mạy hc, hãû chun gia, xỉí l ngän
ngỉỵ tỉû nhiãn, tr chåi, v.v
Cún sạch gäưm nàm chỉång v phủ lủc nhỉ sau :
− Chỉång 1 giåïi thiãûu ngän ngỉỵ láûp trçnh Prolog lägich dỉûa trãn lägich
Horn (Horn logic). Ngỉåìi âc lm quen våïi cạc kiãøu dỉỵ liãûu ca Prolog,
khại niãûm vãư lût, sỉû kiãûn v viãút cạc chỉång trçnh Prolog âån gin.
− Chỉång 2 trçnh by cạc mỉïc nghéa khạc nhau ca mäüt chỉång trçnh
Prolog : nghéa lägich, nghéa khai bạo v nghéa th tủc, cạch Prolog tr
låìi cạc cáu hi, cạch lm tho mn âêch.
− Chỉång 3 trçnh by cạc phẹp toạn säú hc, phẹp so sạnh v âënh nghéa
hm sỉí dủng phẹp âãû quy trong Prolog.
− Chỉång 4 trçnh by cáúu trục danh sạch v cạc phẹp xỉí l cå bn trãn
danh sạch ca Prolog.
− Chỉång 5 trçnh by k thû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 ci âàût sỉí dủng pháưn mãưm ny v mäüt säú chỉång trçnh vê dủ tiãu
biãøu viãút trong SWI Prolog.
Cún sạch ny dng lm giạo trçnh cho sinh viãn ngnh Tin hc v cạc
âäüc gi mún tçm hiãøu thãm vãư k thût láûp trçnh cho lénh vỉûc trê tû nhán tảo.
Trong quạ trçnh biãn soản, tạc gi â nháûn âỉåüc tỉì cạc bản âäưng nghiãûp
nhiãưu âọng gọp bäø êch vãư màût chun män, nhỉỵng âäüng viãn khêch lãû vãư màût


tinh tháưn, sỉû giụp âåỵ vãư biãn táûp âãø cún sạch âỉåüc ra âåìi. Tạc gi xin âỉåüc
by t l
ng biãút ån sáu sàõc. Tạc gi cng chán thnh cm ån mi kiãún phã
bçnh âọng gọp ca bản âc gáưn xa vãư näüi dung ca cún sạch ny.
 Nàơng, ngy 27/05/2004
Tạc gi.




MỦC LỦC

CHỈÅNG 1 MÅÍ ÂÁƯU VÃƯ NGÄN NGỈỴ PROLOG 1
I. GIÅÏI THIÃÛU NGÄN NGỈỴ PROLOG 1
I.1. Prolog l ngän ngỉỵ láûp trçnh lägich 1
I.2. Cụ phạp Prolog 2
I.2.1. Cạc thût ngỉỵ 2
I.2.2. Cạc kiãøu dỉỵ liãûu Prolog 3
I.2.3. Chụ thêch 4
II. CẠC KIÃØU DỈỴ LIÃÛU SÅ CÁÚP CA PROLOG 5
II.1. Cạc kiãøu hàòng (trỉûc kiãûn) 5
II.1.1. Kiãøu hàòng säú 5
II.1.2. Kiãøu hàòng lägich 5
II.1.3. Kiãøu hàòng chùi k tỉû 5
II.1.4. Kiãøu hàòng ngun tỉí 5
II.2. Biãún 6
III. SỈÛ KIÃÛN V LÛT TRONG PROLOG 6
III.1. Xáy dỉûng sỉû kiãûn 6
III.2. Xáy dỉûng lût 10
III.2.1. Âënh nghéa lût 10

III.2.2. Âënh nghéa lût âãû quy 15
III.2.3. Sỉí dủng biãún trong Prolog 18
IV. KIÃØU DỈỴ LIÃÛU CÁÚU TRỤC CA PROLOG 19
IV.1. Âënh nghéa kiãøu cáúu trục ca Prolog 19
IV.2. So sạnh v håüp nháút cạc hảng 22
CHỈÅNG 2 NGỈỴ NGHÉA CA CHỈÅNG TRÇNH PROLOG 31
I. QUAN HÃÛ GIỈỴA PROLOG V LÄGICH TOẠN HC 31
II. CẠC MỈÏC NGHÉA CA CHỈÅNG TRÇNH PROLOG 32
II.1. Nghéa khai bạo ca chỉång trçnh Prolog 33
II.2. Khại niãûm vãư gọi mãûnh âãư 34
i

II.3. Nghéa lägich ca cạc mãûnh âãư 35
II.4. Nghéa th tủc ca Prolog 37
II.5. Täø håüp cạc úu täú khai bạo v th tủc 47
III. VÊ DỦ : CON KHÈ V QU CHÚI 48
III.1. Phạt biãøu bi toạn 48
III.2. Gii bi toạn våïi Prolog 49
III.3. Sàõp âàût thỉï tỉû cạc mãûnh âãư v cạc âêch 54
III.3.1. Nguy cå gàûp cạc vng làûp vä hản 54
III.3.2. Thay âäøi thỉï tỉû mãûnh âãư v âêch trong chỉång trçnh 56
CHỈÅNG 3 CẠC PHẸP TOẠN V SÄÚ HC 65
I. SÄÚ HC 65
I.1. Cạc phẹp toạn säú hc 65
I.2. Biãøu thỉïc säú hc 65
I.3. Âënh nghéa cạc phẹp toạn trong Prolog 68
II. CẠC PHẸP SO SẠNH CA PROLOG 73
II.1. Cạc phẹp so sạnh säú hc 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 HM 79
III.1. Âënh nghéa hm 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 âi trong mäüt âäư thë cọ âënh hỉåïng 88
III.3.2. Tênh âäüü di âỉåìng âi trong mäüt âäư thë 89
III.3.3. Tênh gáưn âụng cạc chùi 90
CHỈÅNG 4 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 CA PROLOG 98
III. CẠC THAO TẠC CÅ BN TRÃN DANH SẠCH 99
III.1. Xáy dỉûng lải mäüt säú vë tỉì cọ sàơn 99
III.2. Hoạn vë 107
ii
III.3. Mäüt säú vê dủ vãư danh sạch 109
CHỈÅNG 5 K THÛ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 thût sỉí dủng nhạt càõt 118
I.3. Phẹp ph âënh 126
II. SỈÍ DỦNG CẠC CÁÚU TRỤC 131
II.1. Truy cáûp thäng tin cáúu trục tỉì mäüt cå såí dỉỵ liãûu 132
II.2. Trỉìu tỉåüng hoạ dỉỵ liãûu 136
II.3. Mä phng ätämat hỉỵu hản 138
II.4. Vê dủ : láûp kãú hoảch âi du lëch bàòng mạy bay 144
II.5. Bi toạn tạm qn háûu 150
III. QUẠ TRÇNH VO-RA V LM VIÃÛC VÅÏI TÃÛP 163
III.1. Khại niãûm 163
III.2. Lm viãûc våïi cạc tãûp 164

III.3. ỈÏng dủng chãú âäü lm viãûc våïi cạc tãûp 172
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 194
I. GIÅÏI THIÃUU SWI-PROLOG 194
II. LAIM VIÃUC VÅÏI SWI-PROLOG 195
II.1. Âàût cáu hi 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 tho chỉång trçnh 200
III. MÄÜT SÄÚ LÃÛNH SWI-PROLOG THÄNG DỦNG 201
TI LIÃÛU THAM KHO 203

iii


CHỈÅNG 1
Måí âáưu vãư 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. P
rolog l ngän ngỉỵ âỉåüc sỉí dủng phäø biãún nháút trong dng cạc ngän
ngỉỵ láûp trçnh lägich (Prolog cọ nghéa l PROgramming in LOGic).
Ngän ngỉỵ Prolog do giạo sỉ ngỉåìi Phạp Alain Colmerauer v nhọm

nghiãn cỉïu ca äng âãư xút láưn âáưu tiãn tải trỉåìng Âải hc Marseille âáưu
nhỉỵng nàm 1970. Âãún nàm 1980, Prolog nhanh chọng âỉåüc ạp dủng räüng ri
åí cháu Áu, âỉåüc ngỉåìi Nháût chn lm ngän ngỉỵ phạt triãøn dng mạy tênh
thãú hãû 5. Prolog â âỉåüc ci âàût trãn cạc mạy vi tênh Apple II, IBM-PC,
Macintosh.
rolog l ngän ngỉỵ láûp trçnh lägich
P
P
Prolog cn âỉåüc gi l ngän ngỉỵ láûp trçnh k hiãûu (symbolic programming)
tỉång tỉû cạc ngän ngỉỵ láûp trçnh hm (functional programming), hay láûp trçnh phi
säú (non-numerical programming). Prolog ráút thêch håüp âãø gii quút cạc bi toạn
liãn quan âãún cạc âäúi tỉåüng (object) v mäúi quan hãû (relation) giỉỵa chụng.
Prolog âỉåüc sỉí dủng phäø biãún trong lénh vỉûc trê tû nhán tảo. Ngun l
láûp trçnh lägich dỉûa trãn cạc mãûnh âãư Horn (Horn logêc). Mäüt mãûnh âãư Horn
biãùu diãùn mäüt sỉû kiãûn hay mäüt sỉû viãûc no âọ l âụng hồûc khäng âụng, xy
ra hồûc khäng xy ra (cọ hồûc khäng cọ, v.v ).
1
2 Láûp trçnh logic trong Prolog
Vê dủ I.1 : Sau âáy l mäüt säú mãûnh âãư Horn :
1. Nãúu mäüt ngỉåìi gi m (v) khän ngoan thç ngỉåìi âọ hảnh phục.
2. Jim l ngỉåìi hảnh phục.
3. Nãúu X l cha mẻ ca Y v Y l cha mẻ ca Z thç X l äng ca Z.
4. Tom l äng ca Pat.
5. Táút c mi ngỉåìi âãưu chãút (hồûc Nãúu ai l ngỉåìi thç ai âọ phi chãút).
6. Socrat l ngỉåìi.
Trong cạc mãûnh âãư Horn åí trãn, cạc mãûnh âãư 1, 3, 5 âỉåüc gi l cạc lût
(rule), cạc mãûnh âãư cn lải âỉåüc gi l cạc sỉû kiãûn (fact). Mäüt chỉång trçnh
lägich cọ thãø âỉåüc xem nhỉ l mäüt cå såí dỉỵ liãûu gäưm cạc mãûnh âãư Horn, hồûc
dảng lût, hồûc dảng sỉû kiãûn, chàóng hản nhỉ táút c cạc sỉû kiãûn v lût tỉì 1
âãún 6 åí trãn. Ngỉåìi sỉí dủng (NSD) gi chảy mäüt chỉång trçnh lägich bàòng

cạch âàût cáu hi (query/ question) truy váún trãn cå såí dỉỵ liãûu ny, chàóng
hản cáu hi :
Socrat cọ chãút khäng ?
(tỉång âỉång khàóng âënh Socrat chãút âụng hay sai ?)
Mäüt hãû thäúng lägich s thỉûc hiãûn chỉång trçnh theo cạch «suy lûn»-tçm
kiãúm dỉûa trãn väún «hiãøu biãút» â cọ l chỉång trçnh - cå såí dỉỵ liãûu, âãø minh
chỉïng cáu hi l mäüt khàóng âënh, l âụng (Yes) hồûc sai (No). Våïi cáu hi
trãn, hãû thäúng tçm kiãúm trong cå såí dỉỵ liãûu khàóng âënh Socrat chãút v «tçm
tháúy» lût 5 tho mn (vãú thç). Váûn dủng lût 5, hãû thäúng nháûn âỉåüc Socrat
l ngỉåìi (vãú nãúu) chênh l sỉû kiãûn 5. Tỉì âọ, cáu tr låìi s l :
Yes
cọ nghéa Socrat chãút l âụng.
I.2. Cụ phạp Prolog
I.2.1. Cạc thût ngỉỵ
Mäüt chỉång trçnh Prolog l mäüt cå såí dỉỵ liãûu gäưm cạc mãûnh âãư (clause).
Mäùi mãûnh âãư âỉåüc xáy dỉûng tỉì cạc vë tỉì (predicat). Mäüt vë tỉì l mäüt phạt
biãøu no âọ vãư cạc âäúi tỉåüng cọ giạ trë chán âụng (true) hồûc sai (fail). Mäüt vë
tỉì cọ thãø cọ cạc âäúi l cạc ngun lägich (logic atom).

Måí âáưu vãư ngän ngỉỵ Prolog 3
Mäùi ngun tỉí (nọi gn) biãøu diãùn mäüt quan hãû giỉỵa cạc hảng (term).
Nhỉ váûy, hảng v quan hãû giỉỵa cạc hảng tảo thnh mãûnh âãư.
Hảng âỉåüc xem l nhỉỵng âäúi tỉåüng “dỉỵ liãûu” trong mäüt trçnh Prolog.
Hảng cọ thãø l hảng så cáúp (elementary term) gäưm hàòng (constant), biãún
(variable) v cạc hảng phỉïc håüp (compound term).
Cạc hảng phỉïc håüp biãøu diãùn cạc âäúi tỉåüng phỉïc tảp ca bi toạn cáưn gii
quút thüc lénh vỉûc âang xẹt. Hảng phỉïc håüp l mäüt hm tỉí (functor) cọ
chỉïa cạc âäúi (argument), cọ dảng
Tãn_hm_tỉí(Âäúi_1, , Âäúi_n)
Tãn hm tỉí l mäüt chùi chỉỵ cại v/hồûc ch säú âỉåüc bàõt âáưu båíi mäüt chỉỵ

cại thỉåìng. Cạc âäúi cọ thãø l biãún, hảng så cáúp, hồûc hảng phỉïc håüp. Trong
Prolog, hm tỉí âàûc biãût “.” (dáúu cháúm) biãøu diãùn cáúu trục danh sạch (list).
Kiãøu dỉỵ liãûu hm tỉí tỉång tỉû kiãøu bn ghi (record) v danh sạch (list) tỉång
tỉû kiãøu mng (array) trong cạc 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 âãư cọ thãø l mäüt sỉû kiãûn, mäüt lût (hay quy tàõc), hay mäüt cáu hi.
Prolog quy ỉåïc viãút sau mäùi mãûnh âãư mäüt dáúu cháúm âãø kãút thục nhỉ sau :
• Sỉû kiãûn : < >. (tỉång ỉïng våïi lût < > :- true. )
• Lût : < > :- < >.
• Cáu hi ?- < >. (åí chãú âäü tỉång tạc cọ dáúu nhàõc lãûnh)
I.2.2. Cạc kiãøu dỉỵ liãûu Prolog
Hçnh 1.1. biãøu diãùn mäüt sỉû phán låïp cạc kiãøu dỉỵ liãûu trong Prolog gäưm
kiãøu dỉỵ liãûu så cáúp v kiãøu dỉỵ liãûu cọ cáúu trục. Sỉû phán låïp ny nháûn biãút
kiãøu ca mäüt âäúi tỉåüng nhåì bãư ngoi cụ phạp.
Cụ phạp ca Prolog quy âënh mäùi kiãøu âäúi tỉåüng cọ mäüt dảng khạc nhau.
Prolog khäng cáưn cung cáúp mäüt thäng tin no khạc âãø nháûn biãút kiãøu ca
mäüt âäúi tỉåüng. Trong Prolog, NSD khäng cáưn khai bạo kiãøu dỉỵ liãûu.

4 Lỏỷp trỗnh logic trong Prolog
kióứu dổợ lióỷu
kióứu sồ cỏỳp kióứu phổùc hồỹp
hũng bióỳn
sọỳ chuọựi kyù tổỷ nguyón tổớ

Hỗnh I.1. Caùc kióứu dổợ lióỷu trong Prolog
Caùc kióứu dổợ lióỷu Prolog õổồỹc xỏy dổỷng tổỡ caùc kyù tổỷ ASCII :
Caùc chổợ caùi in hoa A, B, , Z vaỡ chổợ caùi in thổồỡng a, b, , z.

Caùc chổợ sọỳ 0, 1, , 9.
Caùc kyù tổỷ õỷc bióỷt, chúng haỷn + / < > = : . & _ .
I.2.3. Chuù thờch
Trong mọỹt chổồng trỗnh Prolog, chuù thờch (comment) õổồỹc õỷt giổợa hai
cỷp kyù hióỷu /* vaỡ */ (tổồng tổỷ ngọn ngổợ C). Vờ duỷ :
//
/ ỏy laỡ mọỹt chuù thờch /
//
Trong trổồỡng hồỹp muọỳn õỷt mọỹt chuù thờch ngừn sau mọựi phỏửn khai baùo
Prolog cho õóỳn hóỳt doỡng, coù thóứ õỷt trổồùc mọỹt kyù hióỷu %.
Vờ duỷ :
%%%%%%%%%%%%%%%
% ỏy cuợng laỡ mọỹt chuù thờch
%%%%%%%%%%%%%%%
Prolog seợ boớ qua tỏỳt caớ caùc phỏửn chuù thờch trong thuớ tuỷc.

Måí âáưu vãư ngän ngỉỵ Prolog 5
II. Cạc kiãøu dỉỵ liãûu så cáúp ca Prolog
II.1. Cạc kiãøu hàòng (trỉûc kiãûn)
II.1.1. Kiãøu hàòng säú
Prolog sỉí dủng c säú ngun v säú thỉûc. Cụ phạp ca cạc säú ngun v säú
thỉûc ráút âån gin, chàóng hản nhỉ cạc vê dủ sau :
1 1515 0 -97
3.14 -0.0035 100.2
Tu theo phiãn bn ci âàût, Prolog cọ thãø xỉí l cạc miãưn säú ngun v
miãưn säú thỉûc khạc nhau. Vê dủ trong phiãn bn Turbo Prolog, miãưn säú
ngun 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 ráút khi âỉåüc sỉí dủng trong Prolog. L do ch úu åí

chäù Prolog l ngän ngỉỵ láûp trçnh k hiãûu, phi säú.
Cạc säú ngun thỉåìng chè âỉåüc sỉí dủng khi cáưn âãúm säú lỉåüng cạc pháưn tỉí
hiãûn diãûn trong mäüt danh sạch Prolog dảng [a
1
, a
2
, , a
n
].
II.1.2. Kiãøu hàòng lägich
Prolog sỉí dủng hai hàòng lägich cọ giạ trë l true v fail. Thäng thỉåìng cạc
hàòng lägich khäng âỉåüc dng nhỉ tham säú m âỉåüc dng nhỉ cạc mãûnh âãư.
Hàòng fail thỉåìng âỉåüc dng âãø tảo sinh låìi gii bi toạn.
II.1.3. Kiãøu hàòng chùi k tỉû
Cạc hàòng l chùi (string) cạc k tỉû âỉåüc âàût giỉỵa hai dáúu nhạy kẹp.
"Toto \#\{@ tata" chùi cọ tu k tỉû
"" chùi räùng (empty string)
"\"" chùi chè cọ mäüt dáúu nhạy kẹp.
II.1.4. Kiãøu hàòng ngun tỉí
Cạc hàòng ngun tỉí Prolog l chùi k tỉû åí mäüt trong ba dảng nhỉ sau :
(1) Chùi gäưm chỉỵ cại, chỉỵ säú v k tỉû _ ln ln âỉåüc bàõt âáưu bàòng mäüt
chỉỵ cại in thỉåìng.
newyork a_
nil x__y
x25 tom_cruise

6 Lỏỷp trỗnh logic trong Prolog
(2) Chuọựi caùc kyù tổỷ õỷc bióỷt :
< > .:.
======> ::==


(3) chuọựi õỷt giổợa hai dỏỳu nhaùy õồn (quote) õổồỹc bừt õỏửu bũng chổợ in
hoa, duỡng phỏn bióỷt vồùi caùc tón bióỳn :
Jerry Tom SMITH
II.2. Bióỳn
Tón bióỳn laỡ mọỹt chuọựi kyù tổỷ gọửm chổợ caùi, chổợ sọỳ, bừt õỏửu bồới chổợ hoa
hoỷc dỏỳu gaỷch dổồùi doỡng :
X, Y, A
Result, List_of_members
_x23, _X, _,

III. Sổỷ kióỷn vaỡ luỏỷt trong Prolog
III.1. Xỏy dổỷng sổỷ kióỷn
Vờ duỷ III.1 : Quan hóỷ gia õỗnh
óứ xỏy dổỷng caùc sổỷ kióỷn trong mọỹt chổồng trỗnh Prolog, ta lỏỳy mọỹt vờ duỷ
vóửù. Ta xỏy dổỷng mọỹt cỏy gia hóỷ nhổ sau :
(a) (b)
pam
jim
pat
ann
liz
bob
tom
parent
tom bob
Hỗnh III.1.Cỏy gia hóỷ.

Måí âáưu vãư ngän ngỉỵ Prolog 7
Trong cáy gia hãû (a), cạc nụt chè ngỉåìi, cn cạc mi tãn chè quan hãû cha

mẻ ca (parent of). Sỉû kiãûn Tom l cha mẻ ca Bob âỉåüc viãút thnh mäüt vë
tỉì Prolog nhỉ sau (chụ mãûnh âãư âỉåüc kãút thục båíi mäüt dáúu cháúm) :
parent(tom, bob). % Chụ khäng cọ dáúu cạch trỉåïc dáúu måí ngồûc
ÅÍ âáy, vë tỉì parent cọ hai âäúi l tom v bob. Ngỉåìi ta cọ thãø biãøu diãùn vë
tỉì ny båíi mäüt cáy nhỉ trong Hçnh III.1 (b) : nụt gäúc l tãn vë tỉì, cạc nụt lạ lạ
cạc âäúi.
Tỉì cáy gia hãû trãn âáy, cọ thãø tiãúp tủc viãút cạc vë tỉì khạc âãø nháûn âỉåüc
mäüt chỉång trçnh Prolog gäưm 6 vë tỉì nhỉ sau :
parent(pam, bob).
parent(tom, bob).
parent(tom, liz).
parent(bob, ann).
parent(bob, pat).
parent(pat, jim).
Sau khi hãû thäúng Prolog nháûn âỉåüc chỉång trçnh ny, thỉûc cháút l mäüt cå
såí dỉỵ liãûu, ngỉåìi ta cọ thãø âàût ra cạc cáu hi liãn quan âãún quan hãû parent.
Vê dủ cáu hi Bob cọ phi l cha mẻ ca Pat âỉåüc g vo trong hãû thäúng âäúi
thoải Prolog (dáúu nhàõc ?-_) nhỉ sau :
?- parent(bob, pat).
Sau khi tçm tháúy sỉû kiãûn ny trong chỉång trçnh, Prolog tr låìi :
Yes
Ta tiãúp tủc âàût cáu hi khạc :
?- parent(liz, pat).
No
Båíi vç Prolog khäng tçm tháúy sỉû kiãûn Liz l ngỉåìi mẻ ca Pat trong
chỉång trçnh. Tỉång tỉû, Prolog tr låìi No cho sỉû kiãûn :
?- parent(tom, ben).
Vç tãn ben chỉa âỉåüc âỉa vo trong chỉång trçnh. Ta cọ thãø tiãúp tủc âàût
ra cạc cáu hi thụ vë khạc. Chàóng hản, ai l cha (hay mẻ) ca Liz ?
?- parent(X, liz).

Láưn ny, Prolog khäng tr låìi Yes hồûc No, m âỉa ra mäüt giạ trë ca X
lm tho mn cáu hi trãn âáy :

8 Láûp trçnh logic trong Prolog
X = tom
Âãø biãút âỉåüc ai l con ca Bob, ta chè cáưn viãút :
?- parent(bob, X).
Våïi cáu hi ny, Prolog s cọ hai cáu tr låìi, âáưu tiãn l :
X = ann ->;
Âãø biãút âỉåüc cáu tr låìi tiãúp theo, trong háưu hãút cạc ci âàût ca Prolog,
NSD phi g vo mäüt dáúu cháúm pháøy (;) sau -> (Arity Prolog) :
X = pat
Nãúu â hãút phỉång ạn tr låìi m váùn tiãúp tủc u cáưu (;), Prolog tr låìi
No.
NSD cọ thãø âàût cạc cáu hi täøng quạt hån, chàóng hản : ai l cha mẻ ca
ai ? Nọi cạch khạc, cáưn tçm X v Y sao cho X l cha mẻ ca Y. Ta viãút nhỉ
sau :
?- parent(X, Y).
Sau khi hiãøn thë cáu tr låìi âáưu tiãn, Prolog s láưn lỉåüt tçm kiãúm nhỉỵng
càûp cha mẻ − con tho mn v láưn lỉåüt hiãøn thë kãút qu nãúu chỉìng no NSD
cn u cáưu cho âãún khi khäng cn kãút qu låìi gii no nỉỵa (kãút thục båíi
Yes) :
X = pam
Y = bob ->;
X = tom
Y = bob ->;
X = tom
Y = liz ->;
X = bob
Y = ann ->;

X = bob
Y = pat ->;
X = pat
Y = jim
Yes
Tu theo ci âàût Prolog, NSD cọ thãø g vo mäüt dáúu cháúm (.) hồûc Enter
âãø cháúm dỉït giỉỵa chỉìng lưng tr låìi.

Måí âáưu vãư ngän ngỉỵ Prolog 9
Ta cọ thãø tiãúp tủc âỉa ra nhỉỵng cáu hi phỉïc tảp hån khạc, chàóng hản ai
l äng (b) ca Jim ? Thỉûc tãú, quan hãû äng − b (grandparent) chỉa âỉåüc
âënh nghéa, cáưn phi phán tạch cáu hi ny thnh hai pháưn så cáúp hån :
1. Ai l cha (mẻ) ca Jim ? Gi sỉí cọ tãn l Y.
2. Ai l cha (mẻ) ca Y ? Gi sỉí cọ tãn l X.

Y
X
j
im
parent
grandparent
parent
Hçnh III.2. Quan hãû äng b âỉåüc håüp thnh tỉì hai quan hãû cha mẻ.
Lục ny, cọ thãø viãút trong Prolog nhỉ sau :
?- parent(Y, jim), parent(X, Y).
Prolog tr låìi :
Y = pat
X = bob
Yes
Cáu hi trãn âáy tỉång ỉïng våïi cáu hi : tçm X v Y tho mn :

parent(Y, jim)
v
parent(X, Y).
Nãúu thay âäøi thỉï tỉû hai thnh pháưn cáu hi, thç nghéa lägich váùn khäng
thay âäøi v Prolog tr låìi cng kãút qu (cọ thãø thay âäøi vãư thỉï tỉû), nghéa l
ta cọ thãø âàût cáu hi nhỉ sau :
?- parent(X, Y), parent(Y, jim).
X = bob
Y = âỉåìng dáùn
Yes
Báy giåì ta âàût cáu hi ai l chạu ca Tom ?
?- parent(tom, X), parent(X, Y).
X = bob
Y = ann->;

10 Láûp trçnh logic trong Prolog
X = bob
Y = pat ->;
No
Mäüt cáu hi khạc cọ thãø nhỉ sau : Ann v Pat cọ cng ngỉåìi äng khäng ?
nghéa l ta diãùn âảt thnh hai giai âoản :
1. Tçm X l cha mẻ ca Ann.
2. X tçm tháúy cọ cng l cha mẻ ca Pat khäng ?
Cáu hi v tr låìi trong Prolog nhỉ sau :
?- parent(X, ann), parent(X, pat).
X = bob
Trong Prolog, cáu hi cn âỉåüc gi l âêch (goal) cáưn phi âỉåüc tho mn
(satisfy). Mäùi cáu hi âàût ra âäúi våïi cå såí dỉỵ liãûu cọ thãø tỉång ỉïng våïi mäüt
hồûc nhiãưu âêch. Chàóng hản dy cạc âêch :
parent(X, ann), parent(X, pat).

tỉång ỉïng våïi cáu hi l phẹp häüi (conjunction) ca 2 mãûnh âãư :
X l mäüt cha mẻ ca Ann, v
X l mäüt cha mẻ ca Pat.
Nãúu cáu tr låìi l Yes, thç cọ nghéa âêch â âỉåüc tho mn, hay â thnh
cäng. Trong trỉåìng håüp ngỉåüc lải, cáu tr låìi l No, cọ nghéa âêch khäng âỉåüc
tho mn, hay â tháút bải.
Nãúu cọ nhiãưu cáu tr låìi cho mäüt cáu hi, Prolog s âỉa ra cáu tr låìi âáưu
tiãn v chåì u cáưu ca NSD tiãúp tủc.
III.2. Xáy dỉûng lût
III.2.1. Âënh nghéa lût
Tỉì chỉång trçnh gia hãû trãn âáy, ta cọ thãø dãù dng bäø sung cạc thäng tin
khạc, chàóng hản bäø sung cạc sỉû kiãûn vãư giåïi tênh (nam, nỉỵ) ca nhỉỵng ngỉåìi
â nãu tãn trong quan hãû parent nhỉ sau :
woman(pam).
man(tom).
man(bob).
woman(liz).
woman(pat).

Måí âáưu vãư ngän ngỉỵ Prolog 11
woman(ann).
man(jim).
Ta â âënh nghéa cạc quan hãû âån (unary) woman v man vç chụng chè
liãn quan âãún mäüt âäúi tỉåüng duy nháút. Cn quan hãû parent l nhë phán, vç
liãn quan âãún mäüt càûp âäúi tỉåüng. Nhỉ váûy, cạc quan hãû âån dng âãø thiãút
láûp mäüt thüc tênh ca mäüt âäúi tỉåüng. Mãûnh âãư :
woman(pam).
âỉåüc gii thêch : Pam l nỉỵ. Tuy nhiãn, ta cng cọ thãø sỉí dủng quan hãû nhë
phán âãø âënh nghéa giåïi tênh :
sex(pam, female).

sex(tom, male).
sex(bob, male).
. . .
Báy giåì ta âỉa vo mäüt quan hãû måïi child, âäúi ngỉåüc våïi parent nhỉ sau :
child(liz, tom).
Tỉì âọ, ta âënh nghéa lût måïi nhỉ sau :
child(Y, X) :- parent(X, Y).
Lût trãn âỉåüc hiãøu l :
Våïi mi X v Y, hay
Y l con ca X nãúu
X l cha (hay mẻ) ca Y.
Våïi mi X v Y,
nãúu X l cha (hay mẻ) ca Y thç
Y l con ca X.
Cọ sỉû khạc nhau cå bn giỉỵa sỉû kiãûn v lût. Mäüt sỉû kiãûn, chàóng hản :
parent(tom, liz).
l mäüt âiãưu gç âọ ln âụng, khäng cọ âiãưu kiãûn gç rng büc. Trong khi âọ,
cạc lût liãn quan âãún cạc thüc tênh chè âỉåüc tho mn nãúu mäüt säú âiãưu
kiãûn no âọ âỉåüc tho mn. Mäùi lût bao gäưm hai pháưn:
• pháưn bãn phi (RHS: Right Hand Side) chè âiãưu kiãûn, cn âỉåüc gi l
thán (body) ca lût, v
• pháưn bãn trại (LH: Left Hand Side S) chè kãút lûn, cn âỉåüc gi l âáưu
(head) ca lût.

12 Láûp trçnh logic trong Prolog
Nãúu âiãưu kiãûn parent(X, Y) l âụng, thç child(Y, X) cng âụng v l háûu
qu lägich ca phẹp suy lûn (inference).
child(Y, X) :- parent(X, Y).
âáưu thán


Cáu hi sau âáy gii thêch cạch Prolog sỉí dủng cạc lût : Liz cọ phi l
con ca Tom khäng ?
?- child(liz, tom)
Thỉûc tãú, trong chỉång trçnh khäng cọ sỉû kiãûn no liãn quan âãún con, m
ta phi tçm cạch ạp dủng cạc lût. Lût trãn âáy åí dảng täøng quạt våïi cạc âäúi
tỉåüng X v Y báút k, m ta lải cáưn cạc âäúi tỉåüng củ thãø liz v tom.
Ta cáưn sỉí dủng phẹp thãú (substitution) bàòng cạch gạn giạ trë liz cho biãún
Y v tom cho X. Ngỉåìi ta nọi ràòng cạc biãún X v Y â âỉåüc rng büc
(bound) :
X = tom
v
Y = liz
Lục ny, pháưn âiãưu kiãûn cọ giạ trë parent(tom, liz) v tråí thnh âêch con
(sub-goal) âãø Prolog thay thãú cho âêch child(liz, tom). Tuy nhiãn, âêch ny
tho mn v cọ giạ trë Yes vç chênh l sỉû kiãûn â thiãút láûp trong chỉång
trçnh.
Sau âáy, ta tiãúp tủc bäø sung cạc quan hãû måïi. Quan hãû mẻ mother âỉåüc
âënh nghéa nhỉ sau (chụ dáúu pháøy chè phẹp häüi hay phẹp v lägich) :
mother(X, Y) :- parent(X, Y), woman(X).
âỉåüc hiãøu l :
Våïi mi X v Y, X l mẻ ca Y nãúu
X l cha (hay mẻ) ca Y v X l nỉỵ.
Âäư thë sau âáy minh hoả viãûc âënh nghéa cạc quan hãû child, mother v
grandparent sỉí dủng mäüt quan hãû khạc :
Trong âäư thë, ngỉåìi ta quy ỉåïc ràòng : cạc nụt tỉång ỉïng våïi cạc âäúi tỉåüng
(l cạc âäúi ca mäüt quan hãû). Cạc cung näúi cạc nụt tỉång ỉïng våïi cạc quan hãû

Måí âáưu vãư ngän ngỉỵ Prolog 13
nhë phán, âỉåüc âënh hỉåïng tỉì âäúi thỉï nháút âãún âäúi thỉï hai ca quan hãû.
Mäüt quan hãû âån âỉåüc biãøu diãùn båíi tãn quan hãû tỉång ỉïng våïi nhn ca

âäúi tỉåüng âọ. Cạc quan hãû cáưn âënh nghéa âỉåüc biãøu diãùn båíi cạc cung cọ nẹt
âỉït. Mäùi âäư thë âỉåüc gii thêch nhỉ sau : nãúu cạc quan hãû âỉåüc chè båíi cạc
cung cọ nẹt liãưn âỉåüc tho mn, thç quan hãû biãøu diãùn båíi cung cọ nẹt âỉït
cng âỉåüc tho mn.
Y
X
Y

X

p
arent child
p
arent mother
Y
X
Z
parent
grandparent
parent
woman

Hçnh III.3. Âënh nghéa quan hãû con, mẻ v äng b sỉí dủng mäüt 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).
Âãø thûn tiãûn cho viãûc âc chỉång trçnh Prolog, ta cọ thãø viãút mäüt lût
trãn nhiãưu dng, dng âáưu tiãn l pháưn âáưu ca lût, cạc dng tiãúp theo l
pháưn thán ca lût, mäùi âêch trãn mäüt dng phán biãût. Báy giåì quan hãû
grandparent âỉåüc viãút lải nhỉ 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 nhỉ sau :
sister(X, Y) :-
parent(Z, X),
parent(Z, Y),
woman(X).
Våïi mi X v Y, X l mäüt chë (em) gại ca Y nãúu
(1) X v Y cọ cng cha (cng mẻ), v
(2) X l nỉỵ .
parent parent
woman
sister
Y
Z
X

Hçnh III.4. Âënh nghéa quan hãû chë (em) gại.

14 Láûp trçnh logic trong Prolog
Chụ cạch gii thêch âiãưu kiãûn X v Y cọ cng cha mẻ : mäüt Z no âọ
phi l mäüt cha mẻ ca X, v cng Z âọ phi l mäüt cha mẻ ca Y.
Hay nọi mäüt cạch khạc l : Z1 l mäüt cha mẻ ca X, Z2 l mäüt cha mẻ ca
Y, v Z1 âäưng nháút våïi Z2.
An l nỉỵ, Ann v Pat cng cha mẻ nãn Ann l chë em gại ca Pat, ta cọ :
?- sister(ann, pat).
Yes
Ta cng cọ thãø hi ai l chë em gại ca Pat nhỉ sau :
?- sister(X, pat).
Prolog s láưn lỉåüt âỉa ra hai cáu tr låìi :

X = ann ->;
X = pat ->.
Yes
Váûy thç Pat lải l em gại ca chênh mçnh ?! Âiãưu ny sai vç ta chỉa gii
thêch r trong âënh nghéa chë em gại. Nãúu chè dỉûa vo âënh nghéa trãn âáy
thç cáu tr låìi ca Prolog l hon ton håüp l. Prolog suy lûn ràòng X v Y cọ
thãø âäưng nháút våïi nhau, mäùi ngỉåìi ân b cọ cng cha mẻ s l em gại ca
chênh mçnh. Ta cáưn sỉía lải âënh nghéa bàòng cạch thãm vo âiãưu kiãûn X v Y
khạc nhau. Nhỉ s tháúy sau ny, Prolog cọ nhiãưu cạch âãø gii quút, tuy
nhiãn lục ny ta gi sỉí ràòng quan hãû :
different(X, Y)
â âỉåüc Prolog nháûn biãút v âỉåüc tho mn nãúu v chè nãúu X v Y khäng
bàòng nhau. Âënh nghéa chë (em) gại måïi nhỉ sau :
sister(X, Y) :-
parent(Z, X),
parent(Z, Y),
woman(X).
different(X, Y).
Vê dủ III.2 : Ta láúy lải vê dủ cäø âiãøn sỉí dủng hai tiãn âãư sau âáy :
Táút c mi ngỉåìi âãưu chãút.
Socrate l mäüt ngỉåìi.
Ta viãút trong Prolog nhỉ sau :
mortal(X) :- man(X).
man(socrate).

Mồớ õỏửu vóử ngọn ngổợ Prolog 15
Mọỹt õởnh lyù õổồỹc suy luỏỷn mọỹt caùch lọgich tổỡ hai tión õóử naỡy laỡ Socrate
phaới chóỳt. Ta õỷt caùc cỏu hoới nhổ sau :
?- mortal(socrate).
Yes

Vờ duỷ III.3 :
óứ chố Paul cuợng laỡ ngổồỡi, coỡn Bonzo laỡ con vỏỷt, ta vióỳt caùc sổỷ kióỷn :
man(paul).
animal(bonzo).
Con ngổồỡi coù thóứ noùi vaỡ khọng phaới laỡ loaỷi vỏỷt, ta vióỳt luỏỷt :
speak(X) :- man(X), not(animal(bonzo)).
Ta õỷt caùc cỏu hoới nhổ sau :
?- speak(bonzo).
No
?- speak(paul).
Yes
Vờ duỷ III.4 :
Ta õaợ xỏy dổỷng caùc sổỷ kióỷn vaỡ caùc luỏỷt coù daỷng vở tổỡ chổùa tham õọỳi, sau
õỏy, ta lỏỳy mọỹt vờ duỷ khaùc vóử sổỷ kióỷn vaỡ 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 coù thóứ õỷt cỏu hoới :
?- 'It is hot'.
Yes
Cỏu traớ lồỡi 'It is hot' laỡ õuùng vỗ õaợ coù caùc sổỷ kióỷn 'It is sunny' vaỡ 'It is
summer' trong chổồng trỗnh. Coỡn cỏu hoới ô ?- 'It is cold.' ằ coù cỏu traớ lồỡi sai.
III.2.2. ởnh nghộa luỏỷt õóỷ quy
Bỏy giồỡ ta tióỳp tuỷc thóm mọỹt quan hóỷ mồùi vaỡo chổồng trỗnh. Quan hóỷ naỡy
chố sổớ duỷng quan hóỷ parent, vaỡ chố coù hai luỏỷt. Luỏỷt thổù nhỏỳt õởnh nghộa caùc
tọứ tión trổỷc tióỳp, luỏỷt thổù hai õởnh nghộa caùc tọứ tión giaùn tióỳp.


16 Lỏỷp trỗnh logic trong Prolog
Ta noùi rũng X laỡ mọỹt tọứ tión giaùn tióỳp cuớa Z nóỳu tọửn taỷi mọỹt lión hóỷ cha
meỷ (ọng baỡ) giổợa X vaỡ Z :

parent

parent ancestor
parent
(b)
Y
X
parent ancestor
(a)
Z
X

Hỗnh III.5. Quan hóỷ tọứ tión : (a) X laỡ tọứ tión trổỷc tióỳp cuớa Z,
(b) X laỡ tọứ tión giaùn tióỳp cuớa Z.
Trong cỏy gia hóỷ ồớ Hỗnh III.1, Tom laỡ tọứ tión trổỷc tióỳp cuớa Liz, vaỡ tọứ tión
giaùn tióỳp cuớa Pat. Ta õởnh nghộa luỏỷt 1 (tọứ tión trổỷc tióỳp) nhổ sau :
ancestor(X, Z) :-
parent(X, Z).
Vồùi moỹi X vaỡ Z,
X laỡ mọỹt tọứ tión cuớa Z nóỳu
X laỡ cha meỷ cuớa Z .
ởnh nghộa luỏỷt 2 (tọứ tión giaùn tióỳp) phổùc taỷp hồn, trỗnh Prolog trồớ nón
daỡi doỡng hồn, mọựi khi caỡng mồớ rọỹng mổùc tọứ tión hỏỷu duóỷ nhổ chố ra trong
Hỗnh III.6. Kóứ caớ luỏỷt 1, ta coù quan hóỷ tọứ tión õổồỹc õởnh nghộa nhổ sau :
ancestor(X, Z) :- % luỏỷt 1 õởnh nghộa tọứ tión trổỷc tióỳp
parent(X, Z).

ancestor(X, Z) :- % luỏỷt 2 : tọứ tión giaùn tióỳp laỡ ọng baỡ (tam õaỷi)
parent(X, Y),
parent(Y, Z).
ancestor(X, Z) :- % tọứ tión giaùn tióỳp laỡ cọỳ ọng cọỳ baỡ (tổù õaỷi)
parent(X, Y1),
parent(Y1, Y2),
parent(Y2, Z).
ancestor(X, Z) :- % nguợ õaỷi õọửng õổồỡng
parent(X, Y1),
parent(Y1, Y2),
parent(Y2, Y3),
parent(Y3, Z).


Mồớ õỏửu vóử ngọn ngổợ Prolog 17
parent
ancestor
parent
Y

Z
X

parent
parent ancestor
parent
Y
1
Y
2

Z
X
Y
1
Y
2
Y
3
Z
X
ancestor

Hỗnh III.6. Caùc cỷp tọứ tión hỏỷu duóỷ giaùn tióỳp ồớ caùc mổùc khaùc nhau.
Tuy nhión, tọửn taỷi mọỹt caùch õởnh nghộa tọứ tión giaùn tióỳp ồớ mổùc bỏỳt kyỡ nhồỡ
pheùp õóỷ quy (recursive) nhổ sau :
ancestor(X, Z) :-
parent(X, Z).
ancestor(X, Z) :-
parent(X, Y),
ancestor(Y, Z).
Vồùi moỹi X vaỡ Z,
X laỡ mọỹt tọứ tión cuớa Z nóỳu
tọửn taỷi Y sao cho
(1) X laỡ cha meỷ cuớa Y vaỡ
(2) Y laỡ mọỹt tọứ tión cuớa Z.
ancestor
parent
. . .
ancestor
Y


Z
X


Hỗnh III.7.Daỷng õóỷ quy cuớa quan hóỷ tọứ tión (õổồỹc quay ngang cho thuỏỷn tióỷn).
?- ancestor(pam, X).
X = jim ->;
X = ann ->;
X = pat ->;
X = bob
Yes
Trong Prolog, hỏửu hóỳt caùc chổồng trỗnh phổùc taỷp õóửu sổớ duỷng õóỷ quy, õóỷ
quy laỡ mọỹt khaớ nng maỷnh cuớa Prolog.

18 Láûp trçnh logic trong Prolog
Cho âãún lục ny, ta â âënh nghéa nhiãưu quan hãû khạc nhau (parent,
woman, man, grandparent, child, sister, mother v ancestor). Ta tháúy mäùi quan
hãû chè tỉång ỉïng våïi mäüt mãûnh âãư, tuy nhiãn, quan hãû ancestor lải cọ hai
mãûnh âãư.
Ngỉåìi ta nọi ràòng nhỉỵng mãûnh âãư ny liãn quan (concern) âãún quan hãû
ancestor. Trong trỉåìng håüp táút c cạc mãûnh âãư âãưu liãn quan âãún mäüt quan
hãû, ngỉåìi ta nháûn âỉåüc mäüt th tủc (procedure).
III.2.3. Sỉí dủng biãún trong Prolog
Khi tênh toạn, NSD cọ thãø thay thãú mäüt biãún trong mäüt mãûnh âãư båíi mäüt
âäúi tỉåüng khạc. Lục ny ta nọi biãún â bë rng büc.
Cạc biãún xút hiãûn trong mäüt mãûnh âãư âỉåüc gi l biãún tỉû do. Ngỉåìi ta
gi thiãút ràòng cạc biãún l âỉåüc lỉåüng tỉí ton thãø v âỉåüc âc l «våïi mi».
Tuy hiãn cọ nhiãưu cạch gii thêch khạc nhau trong trỉåìng håüp cạc biãún chè
xút hiãûn trong pháưn bãn phi ca lût. Vê dủ :

haveachil(X) :- parent(X, Y).
cọ thãø âỉåüc âc nhỉ sau :
(a) Våïi mi X v Y,
nãúu X l cha (hay mẻ) ca Y thç X cọ mäüt ngỉåìi con.
(b) Våïi mi X,
X cọ mäüt ngỉåìi con nãúu täưn tải mäüt Y sao cho X l cha (hay mẻ)
ca Y.
Khi mäüt biãún chè xút hiãûn mäüt láưn trong mäüt mãûnh âãư thç khäng cáưn âàût
tãn cho nọ. Prolog cho phẹp sỉí dủng cạc biãún nàûc danh (anonymous variable)
l cạc biãún cọ tãn chè l mäüt dáúu gảch dỉåïi dng _. Ta xẹt vê dủ sau :
have_a_child(X) :- parent(X, Y).
Lût trãn nãu lãn ràòng våïi mi X, X cọ mäüt con nãúu X l cha ca mäüt Y
no âọ. Ta tháúy âêch have_a_child khäng phủ thüc gç vo tãn ca con, vç váûy
cọ thãø sỉí dủng biãún nàûc danh nhỉ sau :
have_a_child(X) :- parent(X, _).
Mäùi vë trê xút hiãûn dáúu gảch dỉåïi dng _ trong mäüt mãûnh âãư tỉång ỉïng
våïi mäüt biãún nàûc danh måïi. Vê dủ nãúu ta mún thãø hiãûn täưn tải mäüt ngỉåìi

Måí âáưu vãư ngän ngỉỵ Prolog 19
no âọ cọ con nãúu täưn tải hai âäúi tỉåüng sao cho mäüt âäúi tỉåüng ny l cha ca
âäúi tỉåüng kia, thç ta cọ thãø viãút :
someone_has_a_child :- parent(_, _).
Mãûnh âãư ny tỉång âỉång våïi :
someone_has_a_child :- parent(X, Y).
nhỉng hon ton khạc våïi :
someone_has_a_child :- parent(X, X).
Nãúu biãún nàûc danh xút hiãûn trong mäüt cáu hi, thç Prolog s khäng hiãøn
thë giạ trë ca biãún ny trong kãút qu tr vãư. Nãúu ta mún tçm kiãúm nhỉỵng
ngỉåìi cọ con, m khäng quan tám âãún tãn con l gç, thç chè cáưn viãút :
?- parent(X, _).

hồûc tçm kiãúm nhỉỵng ngỉåìi con, m khäng quan tám âãún cha mẻ l gç :
?- parent(_ , X).
Táưm vỉûc tỉì vỉûng (lexical scope) ca cạc biãún trong mäüt mãûnh âãư khäng
vỉåüt ra khi mãûnh âãư âọ. Cọ nghéa l nãúu, vê dủ, biãún X15 xút hiãûn trong
hai mãûnh âãư khạc nhau, thç s tỉång ỉïng våïi hai biãún phán biãût nhau. Trong
cng mäüt mãûnh âãư, X15 ln ln chè biãøu diãùn mäüt biãún. Tuy nhiãn âäúi våïi
cạc hàòng thç tçnh húng lải khạc : mäüt ngun tỉí thãø hiãûn mäüt âäúi tỉåüng
trong táút c cạc mãûnh âãư, cọ nghéa l trong táút c chỉång trçnh.
IV. Kiãøu dỉỵ liãûu cáúu trục ca Prolog
IV.1. Âënh nghéa kiãøu cáúu trục ca Prolog
Kiãøu dỉỵ liãûu cọ cáúu trục, tỉång tỉû cáúu trục bn ghi, l âäúi tỉåüng cọ nhiãưu
thnh pháưn, mäùi thnh pháưn lải cọ thãø l mäüt cáúu trục. Prolog xem mäùi
thnh pháưn nhỉ l mäüt âäúi tỉåüng khi xỉí l cạc cáúu trục. Âãø täø håüp cạc thnh
pháưn thnh mäüt âäúi tỉåüng duy nháút, Prolog sỉí dủng cạc hm tỉí.
Vê dủ IV.1 :
Cáúu trục gäưm cạc thnh pháưn ngy thạng nàm tảo ra hm tỉí date.
Ngy 2/9/1952 s âỉåüc viãút nhỉ sau : date(2, september, 1952)
Mi thnh pháưn trong hm tỉí date âãưu l hàòng (hai säú ngun v mäüt
ngun tỉí). Tuy nhiãn ta cọ thãø thay thãú mäùi thnh pháưn bàòng mäüt biãún hay

×