1. Trang chủ
  2. » Công Nghệ Thông Tin

Lập trình lôgich

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

Thông tin cơ bản

Định dạng
Số trang 193
Dung lượng 1,23 MB

Nội dung

Cuốn sách này nhằm cung cấp cơ sở lý thuyết và các phương pháp lập trình cơ bản nhất của môn học «Lập trình lôgich» (Programming in Logic). 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ư 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... ...

LÅÌI NỌI ÂÁƯU Cún ny nhàịm cung cáúp cå sồớ lyù thuyóỳt vaỡ caùc phổồng phaùp lỏỷp trỗnh cồ baớn nhỏỳt cuớa mọn hoỹc ôLỏỷp trỗnh lọgichằ (Programming in Logic) Ngỉåìi âc s âỉåüc lm quen våïi mäüt säú kyợ thuỏỷt lỏỷp trỗnh lọgich õổồỹc ổùng duỷng tổồng õọỳi phäø biãún v ch úu lénh vỉûc trê tû nhán tảo (Artificial Intelligence) 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 gäưm nàm chỉång v phủ lủc sau : − Chỉång giồùi thióỷu 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 vaỡ vióỳt caùc chổồng trỗnh Prolog õồn giaớn Chổồng trỗnh baỡy caùc mổùc nghộa khaùc cuớa mọỹt chổồng trỗnh Prolog : nghộa lọgich, nghộa khai baùo v nghéa th tủc, cạch Prolog tr låìi cạc cáu hoới, caùch laỡm thoaớ maợn õờch Chổồng 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 Prolog Chổồng trỗnh baỡy cỏỳu truùc danh saùch vaỡ cạc phẹp xỉí l cå bn trãn danh ca Prolog Chổồng trỗnh baỡy kyợ thuỏỷt lỏỷp trỗnh náng cao våïi Prolog − Pháưn phủ lủc giåïi thiãûu ngổợ lỏỷp trỗnh SWI-Prolog, hổồùng dỏựn caùch caỡi õỷt sổớ duỷng phỏửn móửm naỡy vaỡ mọỹt sọỳ chổồng trỗnh vê dủ tiãu biãøu viãút SWI Prolog Cún naỡy duỡng laỡm giaùo trỗnh cho sinh vión ngaỡnh Tin hoỹc vaỡ caùc õọỹc giaớ muọỳn tỗm hióứu thóm vóử kyợ thuỏỷt lỏỷp trỗnh cho lộnh vổỷc trờ tuóỷ nhỏn taỷo Trong quaù trỗnh bión soaỷn, taùc giaớ õaợ nhỏỷn âỉåüc tỉì cạc âäư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 âỉåüc âåìi Tạc gi xin âỉåüc by t lng biãút ån sáu sàõc Tạc gi cng chỏn thaỡnh caớm ồn moỹi yù kióỳn phó bỗnh õoùng gọp ca âc gáưn xa vãư näüi dung ca cún ny  Nàơng, ngy 27/05/2004 Tạc gi MUC LUC CHặNG I M ệU Vệ NGN NGặẻ PROLOG GIẽI THIU NGN NGặẻ PROLOG I.1 Prolog laì ngổợ lỏỷp trỗnh lọgich I.2 Cụ phạp Prolog I.2.1 Caïc thuáût ngỉỵ I.2.2 Cạc kiãøu dỉỵ liãûu Prolog I.2.3 Chuï thêch II CAẽC KIỉU Dặẻ LIU S CP CUA PROLOG II.1 Cạc kiãøu hàịng (trỉûc kiãûn) II.1.1 Kiãøu hàòng säú II.1.2 Kiãøu hàòng lägich II.1.3 Kiãøu hàòng chuäùi kyï tæû II.1.4 Kiãøu hàịng ngun tỉí II.2 III Biãún SỈÛ KIÃÛN V LÛT TRONG PROLOG III.1 Xáy dæûng sæû 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 15 III.2.3 Sỉí dủng biãún Prolog 18 IV KIỉU Dặẻ LIU CU 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 NGặẻ NGHẫA CUA CHặNG TRầNH PROLOG 31 I QUAN H GIặẻA PROLOG VAè LGICH TOAẽN HOĩC 31 II CAẽC MặẽC NGHẫA CUA CHặNG TRầNH PROLOG 32 II.1 Nghộa khai baùo cuớa 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Ê DUÛ : 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ä haûn 54 III.3.2 Thay âäøi thỉï tỉû mãûnh âãư v âêch chỉång trỗnh 56 CHặNG I CAẽC PHEẽP TOAẽN VAÌ SÄÚ HOÜC .65 SÄÚ HOÜC 65 I.1 Cạc phẹp toạn säú hc 65 I.2 Biãøu thæïc säú hoüc 65 I.3 Âënh nghéa cạc phẹp toạn Prolog 68 II CẠC PHẸP SO SẠNH CA PROLOG 73 II.1 Cạc phẹp so saïnh säú hoü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ỉí lyï haûng 77 III ÂËNH NGHÉA HAÌM 79 III.1 Âënh nghéa hm sỉí dủng âãû quy 79 III.2 Täúi æu pheïp âãû quy 87 III.3 Mäüt säú vê dủ khạc vãö âãû quy 88 III.3.1 Tỗm õổồỡng õi mọỹt õọử thở coù âënh hỉåïng 88 III.3.2 Tênh âäüü di âỉåìng âi mäüt âäư thë 89 III.3.3 Tênh gáưn âụng cạc chùi 90 CHỈÅNG CÁÚU TRỤC DANH SAÏ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 ii III.1 Xáy dỉûng lải mäüt säú vë tỉì cọ sàơn 99 III.2 Hoaïn vë 107 III.3 CHỈÅNG I Mäüt säú vê dủ vãư danh 109 KYẻ THUT LP TRầNH PROLOG 117 NHAÏT CÀÕT 117 I.1 Khaïi niãûm nhaï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 Khaï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 PHUÛ LUÛC A MÄÜT SÄÚ CHặNG TRầNH PROLOG 187 PHU LUC 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 hoíi 195 II.2 Chaỷy trỗnh demo 196 II.3 Chaỷy trỗnh demo XPCE 197 II.4 Caïc lãûnh âån (Menu commands) 198 II.5 Soaỷn thaớo chổồng trỗnh 200 III MÄÜT SÄÚ LÃÛNH SWI-PROLOG THÄNG DỦNG 201 TI LIÃÛU THAM KHAÍO 203 iii CHỈÅNG 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 Prolog l ngổợ lỏỷp trỗnh lọgich P rolog laỡ ngổợ âỉåüc sỉí dủng phäø biãún nháút dng cạc ngän ngổợ lỏỷp trỗnh lọgich (Prolog coù nghộa laỡ PROgramming in LOGic) Ngän ngỉỵ Prolog 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 thãú hãû Prolog â âỉåüc ci âàût trãn cạc mạy vi Apple II, IBM-PC, Macintosh Prolog cn âỉåüc gi l ngän ngổợ lỏỷp trỗnh kyù hióỷu (symbolic programming) tổồng tổỷ caùc ngổợ lỏỷp trỗnh haỡm (functional programming), hay lỏỷp trỗnh phi säú (non-numerical programming) Prolog ráút thêch håüp âãø giaíi 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 lénh vỉûc trê tû nhán taỷo Nguyón lyù lỏỷp trỗnh lọgich dổỷa trón caù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 hồûc khäng xy (coù hoỷc khọng coù, v.v ) Lỏỷp trỗnh logic Prolog Vê dủ I.1 : Sau âáy l mäüt säú mãûnh âãư Horn : Nãúu mäüt ngỉåìi giaỡ maỡ (vaỡ) khọn ngoan thỗ ngổồỡi õoù haỷnh phuùc Jim l ngỉåìi hảnh phục Nãúu X l cha mẻ ca Y v Y l cha mẻ ca Z thỗ X laỡ ọng cuớa Z Tom laỡ äng ca Pat Táút c mi ngỉåìi âãưu chãút (hoỷc Nóỳu laỡ ngổồỡi thỗ õoù phaới chóỳt) Socrat l ngỉåìi Trong cạc mãûnh âãư Horn åí trãn, cạc mãûnh âãư 1, 3, âỉåüc gi l cạc lût (rule), cạc mãûnh âãư cn lải âỉåüc gi laỡ caùc sổỷ kióỷn (fact) Mọỹt chổồng trỗnh lọgich coù thãø âỉåüc xem 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 táút c cạc sỉû kiãûn v lût tỉì âãún åí trãn Ngỉåìi sỉí duỷng (NSD) goỹi chaỷy mọỹt chổồng trỗnh lọgich bũng caùch âàût cáu hoíi (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 caùch ôsuy luỏỷnằ-tỗm kióỳm dổỷa trón vọỳn ôhióứu bióỳtằ õaợ coù laỡ 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 cồ sồớ dổợ lióỷu khúng õởnh Socrat chóỳt vaỡ ôtỗm thỏỳyằ luỏỷt thoaớ maợn (vóỳ thỗ) Vỏỷn duỷng luỏỷt 5, hóỷ thọỳng nhỏỷn âỉåüc Socrat l ngỉåìi (vãú nãúu) chênh l sỉû kiãûn 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 Caùc thuỏỷt ngổợ Mọỹt chổồng trỗnh Prolog laỡ 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 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” mọỹt trỗnh Prolog Haỷng coù thóứ laỡ haỷ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 (list) Kiãøu dỉỵ liãûu hm tỉí tỉång tỉû kiãøu bn ghi (record) v danh (list) tỉång tỉû kióứu maớng (array) caùc ngổợ lỏỷp trỗnh móỷnh lãûnh (C, Pascal ) Vê duû 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 luáût (hay quy tàõc), hay mäüt cáu hoíi Prolog quy ỉåïc viãút sau mäùi mãûnh âãư mäüt dáúu cháúm âãø kãút thục sau : • Sỉû kiãûn : < > • Luáût : < > :- < > • Cáu hi ?- < > I.2.2 (tæång æïng våïi luáût < > :- true ) (åí chãú âäü tỉång tạc cọ dáúu nhàõc lãûnh) Caù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 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 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 Lỏỷp trỗnh logic Prolog kióứu dổợ liãûu kiãøu så cáúp hàịng säú chùi k tỉû kiãøu phổùc hồỹp bióỳn nguyón tổớ Hỗnh I.1 Caùc kióứu dổợ liãûu Prolog Cạc kiãøu dỉỵ liãûu Prolog âỉåüc xáy dổỷng tổỡ caùc kyù tổỷ ASCII : ã Caùc chổợ cại in hoa A, B, , Z v chỉỵ cại in thổồỡng a, b, , z ã Caùc chổợ sọỳ 0, 1, , • Cạc k tỉû âàûc biãût, chàóng hản + − ∗ / < > = : & _ ∼ I.2.3 Chụ thêch Trong mäüt chỉång trỗnh Prolog, chuù thờch (comment) õổồỹc õỷt giổợa hai cỷp k hiãûu /* v */ (tỉång tỉû ngän ngỉỵ C) Vê dủ : /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ /∗∗∗ Âáy l mäüt chụ thêch ∗∗∗/ /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ Trong trỉåìng håüp mún âàût mäüt chụ thêch ngàõn sau mäùi pháưn khai bạo Prolog cho âãún hãút dng, cọ thãø âàût trỉåïc mäüt k hiãûu % Vê dủ : %%%%%%%%%%%%%%% % Âáy cng l mäüt chụ thêch %%%%%%%%%%%%%%% Prolog s b qua táút c cạc pháưn chụ thờch thuớ tuỷc Lỏỷp trỗnh lọgich Prolog 172 Yes Prolog cho pheïp viãút goün mäüt danh sau : ?- [‘myexp.pl' ] Âãø nảp v bión dởch õọửng thồỡi nhióửu tóỷp chổồng trỗnh khaùc nhau, cọ thãø liãût kã mäüt danh sau : ?- ['file1.pl', 'file2.pl'] Sau caùc chổồng trỗnh õaợ âỉåüc nảp vo bäü nhåï, NSD bàõt âáưu thỉûc hiãûn chổồng trỗnh NSD coù thóứ xem nọỹi dung toaỡn bọỹ chổồng trỗnh nhồỡ tổỡ : ?- listing hoỷc xem mäüt mãûnh âãư no âọ : ?- listing(displaylist) displaylist( [ ]) displaylist( [X | L ] ) :write( X ), tab( 1), displaylist( L), nl Yes III.3 ỈÏng dủng chãú âäü lm viãûc våïi cạc tãûp III.3.1 Âënh dảng cạc hảng Gi sỉí mäüt bn ghi cå såí dỉỵ liãûu, l mäüt sỉû kiãûn cọ dảng cáúu trục hm tỉí ca Prolog, cọ näüi dung sau : family( individual(tom, smith, date(7, may, 1960), work(microsoft, 30000)), individual( ann, smith, date(9, avril, 1962), inactive), [ individual( roza, smith, date(16, june, 1991), inactive), individual( eric, smith, date(23, march, 1993), inactive) ] ) Ta cáưn in näüi dung bn ghi sỉí dủng vë tỉì write(F) theo quy cạch sau : parents tom smith, birth day may 7,1960, work microsoft, salary 30000 ann smith, birth day avril 9, 1962, out of work children roza smith, birth day june 16, 1991, out of work eric smith, birth day march 23, 1993, out of work Ta xáy dỉûng th tủc writefamily( F) sau : Kyợ thuỏỷt lỏỷp trỗnh Prolog 173 writefamily(family(Husband, Wife, Children)) :nl, write(parents),nl, nl, writeindividual(Husband) ,nl, writeindividual(Wife), nl, nl, write(children), nl, nl, writeindividual(Children) writeindividual(individual(Firstname, Name, date(D, M, Y), Work)) :tab(4), write(Firstname), tab(1), write(Name), write(', birth day '), write(M), tab(1), write(D), tab(1), write(', '), write(Y), write(', '), writework(Work) writeindividual([ ]) writeindividual([ P | L] ):writeindividual( P), nl, writeindividual( L) writework(inactive):write('out of work') writework(work(Soc, Sal)):write(' work '), write(Soc), write(', salaire '), write(Sal) Thæûc hiãûn âêchX = , writefamily(X), ta nháûn âỉåüc kãút qu nhæ sau ?- X = family(individual( tom, smith, date(7, may, 1960), work(microsoft, 30000) ),individual( ann, smith, date(9, avril, 1962), inactive),[individual( roza, smith, date(16, june, 1991), inactive),individual( eric, smith, date(23, march, 1993), inactive) ] ), writefamily(X) parents tom smith, birth day may , 1960, work microsoft, salaire 30000 ann smith, birth day avril , 1962, out of work children roza smith, birth day june 16 , 1991, out of work eric smith, birth day march 23 , 1993, out of work X = family(individual(tom, smith, date(7, may, 1960), work(microsoft, 30000)), individual(ann, smith, date(9, avril, 1962), inactive), [individual(roza, smith, date(16, june, 1991), inactive), individual(eric, smith, date(23, march, 1993), inactive)]) Yes III.3.2 Sỉí dủng tãûp xỉí l cạc hảng Âãø âc dỉỵ liãûu trãn tãûp, ngỉåìi ta sỉí dủng dy âêch sau : , see( F), fileprocess, see( user), Láûp trỗnh lọgich Prolog 174 Thuớ tuỷc fileprocess õoỹc vaỡ xỉí l láưn lỉåüt tỉìng hảng ca F cho âãún õoỹc hóỳt tóỷp Mọ hỗnh thuớ tuỷc nhổ sau : filetreat :read( Term), treat( Term) treat( end_of_file) :- ! treat( Term) :treatment( Term), filetreat % Kãút thuïc tãûp % Xỉí l hảng hiãûn hnh % Xỉí l pháưn cn lải ca tãûp Trong th tủc trãn, treatment( Terme) thãø hiãûn mi thao tạc cọ thãø tạc âäüng lãn hảng Chàóng hản th tủc dỉåïi âáy liãût kã tỉìng hảng ca tãûp kãø tỉì dng thỉï N tråí âi cho âãún hãút tãûp, km theo thỉï tỉû cọ màût ca hảng âọ tãûp : viewfile( N) :read( Term), viewterm( Term, N) viewterm( end_of_file, _ ) :- ! viewterm( Term, N) :write( N), tab( 2), write( Term), nl, N1 is N + 1, viewfile( N1) ?- see('exp.txt'), viewfile(1), see( user), seen parent(pam, bob) parent(tom, bob) parent(tom, liz) parent(bob, ann) parent(bob, pat) … Yes Sau âáy laỡ mọỹt mọ hỗnh khaùc õóứ xổớ lyù tóỷp Giaớ sỉí file1 l tãûp dỉỵ liãûu ngưn chỉïa cạc hảng cọ dảng : object( NoObject, Description, Price, FurnisherName) Mäùi hảng mä t mäüt pháưn tỉí ca danh cạc âäúi tỉåüng Gi sỉí ràịng tãûp cáưn xáy dỉûng file2 chỉïa cạc âäúi tỉåüng cng mäüt nh cung cáúp cáúp hng Trong tãûp ny, tãn nh cung cáúp âỉåüc viãút mọỹt lỏửn ồớ õỏửu tóỷp, maỡ Kyợ thuỏỷt lỏỷp trỗnh Prolog 175 khäng xút hiãûn cạc âäúi tỉåüng, cọ dảng object( No, Desc, Price) Th tủc tảo tãûp sau : createfile(Furnisher) :write(Furnisher), write( ‘.‘), nl, creatremaining(Furnisher) creatremaining( Fournisseur) :read( Objet), treat( Objet, Furnisher) treat( end_of_file) :- ! treat(object( No, Desc, Price, Furn), Furn) :write( object( No, Desc, Price) ), write( ‘.‘), nl, creatremaining(Furn) treat( _ , Furnisher) :creatremaining(Furnisher) Gi sỉí file1 l tãûp see(' file1.txt'),tell(' file2.txt'), createfile(suzuki), seen, see(user), told, tell(user) Vê dủ III.10 : Sao chẹp näüi dung mäüt tãûp lãn mäüt tãûp khaïc : copie :repeat, read(X), mywrite(X), X == end_of_file, ! mywrite( end_of_file) mywrite( X) :write( X), write( '.'), nl Âêch sau cho pheïp cäpy tỉì tãûp ngưn f1.txt vo tãûp âêch f2.txt : ?- tell('f2.txt'), see('f1.txt'), copie, seen, told Yes Trong th tủc copie cọ sỉí dủng vë tỉì repeat Vë tỉì repeat ln ln thnh cäng, tảo mäüt vng làûp vä hản Vë tỉì repeat âỉåüc âënh nghéa sau : repeat repeat :- repeat III.3.3 Thao tạc trãn cạc k tỉû Mäüt säú vë tỉì xỉí l k tỉû ca Prolog nhổ sau : Lỏỷp trỗnh lọgich Prolog 176 Tón vë tỉì nghéa put(Char) Âỉa Char dng hiãûn hnh, Char hồûc l mäüt giạ trë ngun khong 255, hồûc mäüt k tỉû put(File, Char) Âỉa Char tãûp File get_char(Char) Âc tỉì tãûp File v håüp nháút Char våïi kyï tæû tiãúp theo get_char(File, Char) Håüp nháút Char våïi kyï tæû tiãúp theo tãûp File get0(Char) Âoüc kyï tæû tiãúp theo get0(File, Char) Âoüc kyï tæû tiãúp theo tãûp File get(-Char) Âoüc kyï tỉû khạc khong träúng tỉì dng vo v håüp nháút våïi Char get(File, Char) Âc k tỉû khạc khong träúng tiãúp theo tãûp File skip(Char) Âc vo v b qua cạc k tỉû âc âỉåüc cho âãún gàûp âụng k tỉû khåïp âỉåüc våïi Char skip(File, Char) Âc vo tỉì tãûp File v b qua cạc k tỉû âc âỉåüc cho âãún gàûp âụng k tỉû khåïp âỉåüc våïi Char Vê dủ III.11 : % Âỉa liãn tiãúp cạc k tỉû A, B v C cọ m ASCII láưn lỉåüt l 65, 66, 67 ?- put( 65), put( 66), put( 67) ABC yes % Âoüc vaì ghi cạc k tỉû ?- get0(X) |: a % G vo mäüt k tỉû räưi Enter (↵), khäng g dáúu cháúm X = 97 Yes ?- get0(X) ^D X = -1 Yes Vê duû III.12 : Sau âáy ta xáy dỉûng th tủc del_space âc vo mäüt cáu gäưm nhiãưu tỉì cạch båíi cạc khong träúng v tr vãư âụng cáu âọ sau â loải b cạc khong träúng thỉìa, chè giỉỵ lải mäüt khong träúng giỉỵa cạc tỉì m thäi Th tủc hoảt âäüng tỉång tỉû cạc th tủc xỉí l tãûp, bàịng cạch âc láưn lỉåüt tổỡng kyù tổỷ rọửi õổa maỡn hỗnh Thuớ tuỷc sỉí dủng k thût nhạt càõt âãø xỉí l K thuỏỷt lỏỷp trỗnh Prolog 177 tỗnh huọỳng kyù tổỷ õoỹc vo hồûc l mäüt khong träúng, hồûc l mäüt chỉỵ cại, hồûc l mäüt dáúu cháúm kãút thục Sau âáy l th tủc del_space : del_space :get0( C), put( C), follow( C) follow( 46) :- ! % 46 l m ASCII cuía dáúu cháúm follow( 32) :- !, % 32 l m ASCII ca dáúu khong träúng get( C), % B qua cạc dáúu khong träúng tiãúp theo put( C), follow( C) follow( Letter) :del_space Chảy thỉí sau : ?- del_space |: The robot try to cast the balls to the basket The robot try to cast the balls to the basket Yes III.3.4 Thao taïc trãn caïc nguyãn tỉí Prolog cọ vë tỉì name/2 cho phẹp âàût tỉång ỉïng cạc ngun tỉí våïi cạc m ASCII : name( A, L) Vë tỉì tho mn L l danh cạc ca cạc k tỉû ca A Vê dủ : ?- name(mic29, [109, 105, 99, 50, 57 ]) Yes ?- name( aikieutuido, L) L = [ 97, 105, 107, 105, 101, 117, 116, 117, 105 | ] Yes ?- name(X, [ 97, 105, 107, 105, 101, 117, 116, 117, 105, 100, 111 ]) X = aikieutuido Yes Hai chỉïc nàng chênh ca vë tỉì name sau : Chuøn mäüt ngun tỉí thnh mäüt danh cạc k tỉû (m ASCII) Tảo mäüt ngun tỉí tỉì mọỹt danh saùch caùc kyù tổỷ Lỏỷp trỗnh lọgich Prolog 178 Vê dủ III.13 : Xáy dỉûng th tủc qun l cạc cüc gi dëch vủ xe taxi chåí hnh khạch nhåì cạc ngun tỉí sau : Tãn caïc cuäüc goüi call1, call2, Tãn caïc laïi xe chauffeur1, chauffeur2, Tãn caïc xe taxi taxi1, taxi2, Vë tỉì taxi( X ) kiãøm tra mäüt ngun tỉí cọ biãøu diãùn âụng mäüt taxi theo cạch biãøu diãùn nhæ trãn khäng : taxi( T ) :name( T, Tlist), name( taxi, L), append( L, _ , Tlist) Mäüt caïch tỉång tỉû, ta cọ thãø xáy dỉûng cạc vë tỉì chauffer v taxi Vê dủ III.14 : Sau âáy ta xáy dỉûng th tủc cho phẹp tảo mäüt ngun tỉí bàịng cạch täø håüp cạc k tỉû Th tủc readsentence( Wordlist) s âc mäüt cáu thüc ngän ngỉỵ tỉû nhiãn räưi gạn cho Wordlist danh cạc giạ trë m biãøu diãùn ca cạc k tỉû cáu Tiãúp theo, mäùi cáu âỉåüc xem l mäüt danh cạc tỉì, mäùi tỉì âỉåüc chuøn thnh mäüt ngun tỉí readsentence( WordList) :get0( Char), readchain( Char, WordList) readchain( 46,[ ] ) :- ! % dáúu cháúm kãút thuïc cáu readchain( 32, WordList) :readsentence(WordList) % B qua cạc dáúu khong träúng readchain( L, [ W | WordList ] ) :readletter( L, Letters, Nextchar ), % Âc cạc k tỉû ca tỉì tiãúp theo name( W, Letters), readchain( Nextchar, WordList) readletter( 46, [ ], 46) :- ! % kãút thục tỉì l mäüt dáúu cháúm readletter( 32, [ ], 32) :- ! % kãút thục tỉì l mäüt dáúu khong träúng readletter( C, [ C | Letters] , Nextchar) :get0( Char), readletter( Char, Letters, Nextchar) Kyợ thuỏỷt lỏỷp trỗnh Prolog 179 Chaỷy chổồng trỗnh, ta coù caùc kóỳt quaớ nhổ sau : ?- readsentence( WordList) |: The robot ASIMO try to cast the balls to the basket WordList = ['The', robot, 'ASIMO', try, to, cast, the, balls, to| ] Yes ?- readsentence( WordList) |: " Ai âi tràm súi ngn rỉìng " % dáúu Enter ↵ sau dáúu nhạy kẹp |: % dáúu cháúm kãút thuïc cáu WordList = [ '" Ai', âi, tràm, súi, ngn, 'rỉìng "\n' ] Yes Trong th tủc, ta â gi thiãút ràịng kãút thục cáu vo l mäüt dáúu cháúm v nãúu cọ dáúu chỏỳm cỏu cỏu, thỗ tuyỡ theo caùch xuỏỳt hióỷn m âỉåüc xem l mäüt tỉì hồûc dênh vo våïi tỉì Th tủc âc k tỉû âáưu tiãn l Char, räưi chuøn cho th tủc readchain Th tủc readchain xỉí l trỉåìng håüp sau : (1) Nóỳu Char laỡ mọỹt dỏỳu chỏỳm, thỗ quaù trỗnh õoỹc cáu vo kãút thục (2) Nãúu Char l mäüt khong träúng, ạp dủng th tủc readsentence cho pháưn cn lải ca cáu (3) Nãúu Char l mäüt k tỉû : trỉåïc tiãn âc tỉì W âỉåüc bàõt âáưu båíi k tỉû Char, sau âọ sỉí dủng readsentence âãø âc pháưn cn lải ca cáu v tảo danh WordList Kãút qu âỉåüc têch lu [ W | WordList ] Th tủc readletter( L, Letters, Nextchar ) âc cạc k tỉû ca mäüt tỉì, âọ : (1) L l chỉỵ cại hiãûn hnh (â âỉåüc âc) ca tỉì âang âc (2) Letters l danh cạc chỉỵ cại, bàõt âáưu båíi L cho âãún hãút tỉì (3) Nextchar l k tỉû theo sau tỉì âang âc, cọ thãø khäng phi l mäüt chỉỵ cại Nhåì cạch biãøu diãùn cạc tỉì ca cáu mäüt danh sạch, ngỉåìi ta cọ thãø sỉí dủng Prolog âãø xỉí l ngän ngỉỵ tổỷ nhión, nhổ tỗm hióứu nghộa cuớa cỏu theo mọỹt quy ỉåïc no âọ, v.v thüc lénh vỉûc trê tû nhỏn taỷo Lỏỷp trỗnh lọgich Prolog 180 III.3.5 Mäüt säú vë tỉì xỉí l cå såí dỉỵ liãûu Sau âáy l mäüt säú vë tỉì chøn cho phẹp xỉí l trãn cạc lût v sỉû kiãûn ca mäüt cå såí dỉỵ liãûu Prolog assert(P) Thãm P vo cå såí dỉỵ liãûu Vê dủ cho cå såí dỉỵ liãûu lục ban âáưu : personal(tom) personal(ann) Sau thỉûc hiãûn âêch : ?- assert(personal(bob)) cå såí dỉỵ liãûu lục ny tråí thnh : personal(tom) personal(ann) personal(bob) Do NSD khäng biãút assert â thãm P vo âáưu hay cúi ca cå såí dỉỵ liãûu, Prolog cho phẹp sỉí dủng hai dảng khạc l : asserta(P) Thãm P vo âáưu cå såí dỉỵ liãûu assertz(P) Thãm P vo cúi cå såí dỉỵ liãûu Sỉí dủng vë tỉì : assert((P :- B, C, D)) cọ thãø lm thay âäøi näüi dung mäüt mãûnh õóử chổồng trỗnh Tuy nhión, ngổồỡi ta khuyón khọng nãn sỉí dủng lãûnh ny retract(P) Loải b P cå såí dỉỵ liãûu Vê dủ cho cå såí dỉỵ liãûu lục ban âáưu : personal(tom) personal(ann) personal(bob) Sau thỉûc hiãûn âêch : ?- retract(personal(ann)) cå såí dỉỵ liãûu lục ny chè cn : personal(tom) personal(bob) Cọ thãø sỉí dủng biãún retract sau : K thût láûp trỗnh Prolog 181 ?- retract(personal(X)) X = tom ; X = bob ; No Lục ny cå såí dỉỵ liãûu â räùng abolish(Term, Arity) Loải b táút c cạc hảng Term cọ cáúp Arity cå såí dỉỵ liãûu Vê dủ : ?- abolish(personal, 2) Loải b táút c cạc hảng Term cọ cáúp Arity=2 Vê dủ III.15 Xáy dỉûng bäü siãu diãùn dëch Prolog Prolog, viãûc xoaï mäüt âêch âỉåüc viãút lải sau : prove(Goal) :- call(Goal) hồûc : prove(Goal) :- Goal hồûc viãút cạc mãûnh âãư : prove(true) prove((Goal1, Goal2)) :prove(Goal1), prove(Goal2) prove(Goal) :clause(Goal, Body), prove(Body) Lỏỷp trỗnh lọgich Prolog 182 Toùm từt chổồng : Kyợ thuỏỷt nhaùt cừt vaỡ phuớ õởnh ã Nhạt càõt ngàn cn sỉû quay lui, khäng nhỉỵng lm tỷng hióỷu quaớ chaỷy chổồng trỗnh maỡ coỡn laỡm tọỳi ổu tờnh bióứu hióỷn cuớa ngổợ ã óứ tỷng hióỷu quaớ chaỷy chổồng trỗnh, ngổồỡi lỏỷp trỗnh sổớ duỷng nhạt càõt âãø chè cho Prolog biãút nhỉỵng âỉåìng dáùn âãún tháút bải • Nhạt càõt cho phẹp tảo cạc kãút lûn loải trỉì dảng : If Condition Thỗ Conclusion_1 nóỳu Conclusion_2 ã Nhaùt cừt cho phẹp âënh nghéa phẹp ph âënh : not Goal tho maợn nóỳu Goal thỏỳt baỷi ã Prolog coù hai õờch âàûc biãût : true ln ln âụng v fail ln luọn sai ã Cỏửn thỏỷn troỹng sổớ duỷng kyợ thût nhạt càõt, nhạt càõt cọ thãø lm sai lãûch sỉû tỉång ỉïng giỉỵa nghéa khai bạo v nghéa th tuỷc cuớa mọỹt chổồng trỗnh ã Pheùp phuớ õởnh not Prolog khäng hon ton mang nghéa lägich, cáưn chụ sỉí dủng not Sỉí dủng cạc cáúu truùc Caùc vờ duỷ õaợ trỗnh baỡy chổồng naỡy minh hoả nhỉỵng âàûc trỉng ráút tiãu biãøu ca k thuỏỷt lỏỷp trỗnh Prolog : ã Trong Prolog, tỏỷp hồỹp cạc sỉû kiãûn â âãø biãøu diãùn mäüt cå såí dổợ lióỷu ã Kyợ thuỏỷt õỷt cỏu hoới vaỡ so khåïp ca Prolog l nhỉỵng phỉång tiãûn mãưm cho phẹp truy cáûp t cå såí dỉỵ liãûu nhỉỵng thäng tin cọ cáúu trục • Cáưn sỉí dủng phỉång phạp trỉìu tỉåüng hoạ dỉỵ liãûu l mäüt k thût lỏỷp trỗnh cho pheùp sổớ duỷng caùc cỏỳu truùc dổợ lióỷu phổùc taỷp mọỹt caùch õồn giaớn, laỡm chổồng trỗnh tråí nãn dãù hiãøu Trong Prolog, phỉång phạp trỉìu tỉåüng hoaù dổợ lióỷu rỏỳt dóự trióứn khai ã Nhổợng cỏỳu trục toạn hc trỉìu tỉåüng ätämat cng ráút dãù ci âàût Prolog • Ngỉåìi ta cọ thãø tiãúp cáûn âãún nhiãưu låìi gii khạc cho mäüt bi toạn nhåì sỉí dủng nhiãưu cạch biãøu diãùn dỉỵ liãûu khaùc nhau, nhổ trổồỡng hồỹp Kyợ thuỏỷt lỏỷp trỗnh Prolog 183 bi toạn tạm qn háûu Cạch biãøu diãùn dỉỵ liãûu sỉí dủng nhiãưu thäng tin tiãút kiãûm âỉåüc toaùn, mỷc duỡ laỡm cho chổồng trỗnh trồớ nón rổồỡm raỡ, khoù cọ õoỹng ã Kyợ thuỏỷt tọứng quaùt hoaù mäüt bi toạn, trỉìu tỉåüng, nhỉng lải lm tàng kh nàng hỉåïng âãún låìi gii, lm âån gin hoạ phạt biãøu bi toạn Lm viãûc våïi tãûp Cng våïi chóỳ õọỹ tổồng taùc cỏu hoới-traớ lồỡi, quaù trỗnh vaỡo v chãú âäü lm viãûc våïi tãûp â lm phong phụ mäi trỉåìng lm viãûc ca Prolog • Cạc tãûp Prolog âãưu hoảt âäüng theo kiãøu tưn tỉû Prolog phán biãût doìng vaìo hiãûn haình vaì doìng hiãûn hnh • Thiãút bë cúi (terminal) ca NSD gäưm maỡn hỗnh vaỡ baỡn phờm õổồỹc xem nhổ mọỹt tóỷp gi cọ tãn l user • Prolog cọ nhiãưu vë tỉì cọ sàơn âãø xỉí l cạc dng vo-ra • Khi laìm viãûc våïi tãûp, chãú âäü âoüc ghi laì xỉí l tỉìng k tỉû hồûc tỉìng hảng Láûp trỗnh lọgich Prolog 184 Baỡi tỏỷp chổồng Cho chổồng trỗnh : p( ) p( ) :- ! p( ) Cho biãút cạc cáu tr låìi ca Prolog t cạc cáu hi sau : (a) ?- p( X ) (b) ?- p( X ), p( Y ) (c) ?- p( X ), !, p( Y ) Quan hãû sau âáy cho biãút mäüt säú cọ thãø l dỉång, bàịng khäng, hồûc ám : sign( Number, positive) :Number > sign( 0, null) sign( Number, negative) :Number < Hy sỉí dủng k thût nhạt cừt õóứ vióỳt laỷi chổồng trỗnh trón hióỷu quaớ hồn Th tủc separate(Number, Positive, Negative) xãúp cạc pháưn tỉí danh Number láưn lỉåüt thnh hai danh sạch, danh Positive chè chỉïa cạc säú dỉång, hồûc bàịng khäng, danh Negative chè chỉïa cạc säú ám Vê duû : separate( [ 3, -1, 0, 5, -2 ], [ 3, 0, ], [ -1, -2 ] ) Hy âënh nghéa th tủc trãn theo hai cạch, mäüt cạch khäng sỉí dủng k thût nhạt càõt, mäüt cạch cọ sỉí dủng k thût nhạt càõt Cho hai danh sạch, Accept v Reject, hy viãút danh cạc âêch sỉí dủng k thût quay lui v cạc quan hóỷ member vaỡ not õóứ tỗm caùc phỏửn tổớ coù màût Accept nhỉng khäng cọ màût Reject ởnh nghộa thuớ tuỷc difference( Set1, Set2, SetDiff) tỗm hióỷu hai táûp håüp Set1 v Set2 våïi quy ỉåïc cạc táûp håüp âỉåüc biãøu diãùn båíi cạc danh Kyợ thuỏỷt lỏỷp trỗnh Prolog 185 Chúng haỷn : difference( [ a, b, c, d ], [ b, d, e, f ], [ a, c ] ) Hy âënh nghéa vë tỉì unifiable( List1, Term, List2) âãø kiãøm tra so khåïp, âọ List2 l danh táút c cạc pháưn tỉí ca List1 cọ thãø so khåïp våïi Term nhỉng khäng thỉûc hiãûn phẹp thãú trãn cạc biãún â âỉåüc so khåïp Vê dủ : ?- unifiable( [ X, bibo, t( Y ) ], t(a), List ) List = [X, t( Y )] Chụ ràịng X v Y váùn l cạc biãún tỉû khäng thỉûc hiãûn pheïp thãú t(a) cho X, hay pheïp thãú a cho Y Muäún váûy, thæûc hiãûn hæåïng dáùn sau : Sỉí dủng phẹp ph âënh not( Term1 = Term2) Nãúu quan hãû Term1 = Term2 âỉåüc tho mn, âọ, not( Term1 = Term2) s tháút bải, v phẹp thãú biãún khäng xy Bi toạn m âi tưn Gi sỉí cạc ä ca bn cåì vua 8×8 âỉåüc biãøu diãùn båíi cạc càûp toả âäü cọ dảng X/Y, våïi X v Y nàịm khong v (a) Âënh nghéa quan hãû jump( case1, case2 ), bàòng cạch sỉí dủng lût âi ca qn m, v gi sỉí ràịng case1 ln ln bë rng büc Vê dủ : ?- jump( 1/1, C ) C = 3/2; C = 2/3; No (b) Âënh nghéa quan hãû mvt_ knight( path ), våïi path l mäüt danh gäưm cạc ọ bióứu dióựn lọỹ trỗnh caùc bổồùc nhaớy hồỹp lyù ca qn m trãn bn cåì räùng (c) Sỉí dủng quan hóỷ mvt_ knight, vióỳt mọỹt cỏu hoới õóứ tỗm tỏỳt caớ caùc lọỹ trỗnh bọỳn bổồùc nhaớy hồỹp lyù ca qn m, xút phạt tỉì ä cọ toả âäü 2/1, âãø âãún biãn bãn phi ca bn cåì (Y = 8) v âãø âãún ä 5/4 sau hai bỉåïc nhy Cho f mäüt tãûp chỉïa cạc hảng, hy õởnh nghộa thuớ tuỷc findterm(Term) õóứ õổa maỡn hỗnh hảng âáưu tiãn ca f khåïp âỉåüc våïi Term ? 10 Cho f mäüt tãûp chỉïa cạc hảng, hy âënh nghộa thuớ tuỷc findallterm(Term) õóứ õổa maỡn hỗnh tỏỳt c cạc hảng ca f khåïp âỉåüc våïi Term ? Kiãøm tra cháút biãún Term khäng thãø âỉåüc gạn giaù trở thổỷc hióỷn tỗm kióỳm Lỏỷp trỗnh lägich Prolog 186 11 Hy måí räüng th tủc del_space õaợ õổồỹc trỗnh baỡy phỏửn lyù thuyóỳt õóứ cọ thãø xỉí l loải b cạc dáúu cạch thỉìa nàịm trỉåïc dáúu pháøy (comma) v chè giỉỵ lải mäüt dáúu cạch nàịm sau dáúu pháøy 12 Tỉång tỉû bi cho cạc dáúu cháúm cáu khạc dáúu cháúm (period), dáúu cháúm pháøy (semicolon), dáúu cháúm hoíi (question mark), v.v 13 Âënh nghéa quan hãû firstchar( Atom, Char) cho phẹp kiãøm tra Char cọ phi l k tỉû âáưu tiãn ca Atom khäng (Atom bàõt âáưu båíi Char) ? 14 Âënh nghéa th tủc cho phẹp âäøi mäüt danh tỉì tiãúng Anh tỉì säú êt (singular) sang säú nhiãưu (plural) âỉåüc thỉûc hiãûn sau : ?- plural ( table, X ) X = tables Yes 15 Aẽp duỷng thuớ tuỷc readsentence õaợ õổồỹc trỗnh baỡy pháưn l thuút âãø xáy dỉûng th tủc : ?- find( Keyword, Sentence ) cho pheùp tỗm tóỷp õang âc mäüt cáu cọ chỉïa tỉì khoạ Keyword Cáu Sentence phi åí dảng måïi âỉåüc âc vo chỉa xỉí l, nghéa l âỉåüc biãøu diãùn båíi mäüt chùi k tỉû, hồûc båíi mäüt ngun tỉí

Ngày đăng: 10/05/2021, 14:02