人工智能程序設(shè)計(jì)語(yǔ)言_第1頁(yè)
人工智能程序設(shè)計(jì)語(yǔ)言_第2頁(yè)
人工智能程序設(shè)計(jì)語(yǔ)言_第3頁(yè)
人工智能程序設(shè)計(jì)語(yǔ)言_第4頁(yè)
人工智能程序設(shè)計(jì)語(yǔ)言_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、人工智能程序設(shè)計(jì)語(yǔ)言-Prolog1概述1970年由法國(guó)馬賽大學(xué)Alain Colmerauer等開(kāi)發(fā),作為邏輯程序設(shè)計(jì)的工具。很多著名的專(zhuān)家系統(tǒng)外殼都用Prolog編寫(xiě),如ESP/Advisor, APE, X1等。程序特點(diǎn):陳述式語(yǔ)言。只要給出必要的事實(shí)和規(guī)則,Prolog就可以用演繹推理自動(dòng)求解問(wèn)題。而過(guò)程式語(yǔ)言必須告之求解過(guò)程才行。實(shí)例與基本概念:一個(gè)Prolog的實(shí)例程序如下:domains /*領(lǐng)域聲明段*/person,activity=symbol /*域person和activity的聲明,symbol為標(biāo)準(zhǔn)域*/predicates /*謂詞格式說(shuō)明段*/likes(per

2、son,activity) /*likes為謂詞名,表示某人person喜歡activity活動(dòng)*/clauses /*子句段*/likes(ellen,tennis). /*事實(shí):ellen喜歡tennis*/likes(john,football).likes(tom,baseball).likes(eric,swimming).likes(mark,tennis).likes(bill,X):-likes(tom,X). /*規(guī)則:tom喜歡的,bill也喜歡*/goal /*目標(biāo)段*/likes(bill,football). /*考察bill是否喜歡football*/變量:以大寫(xiě)字

3、母開(kāi)頭,后跟若干數(shù)字、下劃線、字母組成的符號(hào)名稱(chēng)。是在滿足目標(biāo)時(shí),其值未知的量。例如:likes(X_Persons,tennis).中的X。對(duì)象與關(guān)系:謂詞表示一個(gè)或多個(gè)對(duì)象之間的某種關(guān)系。例如:likes(mark,tennis).中的likes謂詞表示某人喜歡某類(lèi)活動(dòng)。其中,mark和和tennis分別是關(guān)系likes中的對(duì)象。又如:owns(susan,horse).eats(jill,meat).valuable(gold). /*黃金是值錢(qián)的*/注:對(duì)象名和關(guān)系名都必須以小寫(xiě)字母開(kāi)頭。領(lǐng)域與謂詞:謂詞是用語(yǔ)描述事實(shí)和關(guān)系的。但與此相關(guān)的謂詞之涉及對(duì)象的領(lǐng)域范圍必須明確。因此,在Pr

4、olog中,需要對(duì)關(guān)系中的對(duì)象的域進(jìn)行聲明。例如:likes(person,activity).表明,謂詞likes中第一個(gè)參數(shù)為person域,第二個(gè)為activuty域。如果目標(biāo)中輸入likes(12,x),系統(tǒng)將給出一個(gè)領(lǐng)域類(lèi)型錯(cuò)的信息。因?yàn)?,第一個(gè)參數(shù)不屬于person域,此處即symbol域。復(fù)合目標(biāo):由多個(gè)子目標(biāo)構(gòu)成的問(wèn)題目標(biāo)描述。例如:likes(tom,X) and likes(erric,X)。無(wú)名變量:即謂詞參數(shù)中以下劃線表示時(shí),該變量稱(chēng)為無(wú)名變量。表示此時(shí)該變量的值無(wú)關(guān)緊要。例如:likes(_,baseball) and likes(ellen,tennis).表示只要

5、有人喜歡baseball,ellen就喜歡tennis。car(_,_,Age,_,Cost) and Cost27000.表示查找價(jià)格在27000$以下的車(chē),并給出其使用年限和價(jià)格。無(wú)名變量用于事實(shí)時(shí),表示任意或全部都成立。例如:owns(_,shirt).表示人人都有一件襯衣。washface(_).表示人人都洗臉?;厮荩寒?dāng)子目標(biāo)匹配或搜索失敗時(shí),回到最近的成功點(diǎn)繼續(xù)進(jìn)行余下的事實(shí)或規(guī)則的匹配的過(guò)程。以如下程序?yàn)槔篸omainschild=symbolage=integerpredicatespupil(child,age)clausespupil(peter,9).pupil(chri

6、s,9).pupil(paul,10).pupil(susan,9).問(wèn)題:安排一次班級(jí)上9歲同學(xué)的乒乓球比賽,每對(duì)運(yùn)動(dòng)員賽兩場(chǎng)。則目標(biāo)子句可描述pupil(P1,9) and pupil(P2,9) and P1P2.的執(zhí)行過(guò)程如下:子目標(biāo)1子目標(biāo)2子目標(biāo)3結(jié)果說(shuō)明peterpeterpeterpeter失敗回溯到第二子目標(biāo)chrispeterchris成功回溯到第二子目標(biāo)繼續(xù)尋找下一組解susanpetersusan成功子目標(biāo)2已搜索完畢,回溯到子目標(biāo)1chrispeterchrispeter成功回溯到第二子目標(biāo)繼續(xù)尋找下一組解chrischirschris失敗回溯到第二子目標(biāo)susanc

7、hrissusan成功子目標(biāo)2已搜索完畢,回溯到子目標(biāo)1susanpetersusanpeter成功回溯到第二子目標(biāo)繼續(xù)尋找下一組解chrissusanchris成功回溯到第二子目標(biāo)繼續(xù)尋找下一組解susansusansusan失敗全部搜索完畢not的用法:表示謂詞或規(guī)則的否定。例如:likes(X,baseball) and not(likes(X,tennis).表示喜歡baseball但不喜歡tennis的人。注釋問(wèn)題:Prolog中的注釋用/*/方法。其它符號(hào)約定: “if” “:-”; “,” “and”; “;” “or”2 Visual Prolog簡(jiǎn)介2-1 程序的整體結(jié)構(gòu)2-

8、1-1 編譯器導(dǎo)向(置于程序文本的開(kāi)頭)bgidriver-(BGI-Borland Graphics Interface)。如果程序需要BGI圖形模式,則可加此導(dǎo)向語(yǔ)句。(只對(duì)DOS版用!)用法:bgidriver _CGA_driver_farbgifont-與bgidriver類(lèi)似。用法:bgifont _gothic_font_farnowarnings-不再顯示警告信息。nobreak-程序執(zhí)行時(shí)不能中斷,只有啟動(dòng)機(jī)器才能終止執(zhí)行。(其它見(jiàn)help)2-1-2 常量聲明段用于聲明和使用一些在程序中將使用到的符號(hào)常量。其關(guān)鍵詞是CONSTANTS,后跟對(duì)符號(hào)常量的聲明。其符號(hào)常量的聲明

9、語(yǔ)法格式如下:=例如:CONSTANTSzero= 0one= 1two= 2hundred= (10*(10-1)+10)pi= 3.141592653ega= 3slash_fill= 4red= 4注:在編譯程序之前,Visual Prolog將用符號(hào)常量全部替換程序中對(duì)應(yīng)的符號(hào)串(與C語(yǔ)言中的宏替換相似?。?duì)符號(hào)常量使用過(guò)程中的約束如下:1) 符號(hào)常量聲明時(shí),系統(tǒng)并不區(qū)分符號(hào)常量的大小寫(xiě)。因此,在CLAUSES部分,為了和變量名區(qū)分開(kāi)來(lái),符號(hào)常量名的首字符必須小寫(xiě)。例如:CONSTANTStwo = 2GOALA=two, write(A).2) 符號(hào)常量定義中不能自己定義自己例如:m

10、y_number = 2*my_number3) 程序中可以有多個(gè)CONSTANTS區(qū),但必須遵循先聲明,后使用原則4) 常量的有效范圍從聲明處開(kāi)始,直到源文件的末尾,包含程序文件的包含情形在內(nèi)。5) 常量標(biāo)識(shí)符只能聲明一次2-1-3 變量、約束變量與自由變量變量:其值在程序執(zhí)行過(guò)程中可以發(fā)生改變的量。變量的表示:大寫(xiě)字母開(kāi)頭的符號(hào)串。變量的兩種狀態(tài):值不定時(shí)為自由變量,值已知時(shí)為約束變量。例如:DOMAINSperson,hobby=symbolPREDICATESlikes(person,hobby)CLAUSESlikes(ellen,reading).likes(john,comput

11、ers).likes(john,badminton).likes(leonard,badminton).likes(eric,swimming).likes(eric,reading).GOALlikes(X,reading) and likes(X,swimming).分析:目標(biāo)有兩個(gè)子目標(biāo)。Prolog試圖從左到右逐一滿足。在搜索過(guò)程中,likes(X,reading)沒(méi)有被滿足之前,其X的值沒(méi)有確定,此時(shí)稱(chēng)X為自由變量。當(dāng)用likes(ellen,reading)匹配第一子目標(biāo)后,X被約束為ellen值,此時(shí)稱(chēng)X為約束變量。此后,對(duì)第二子目標(biāo)likes(X,swimming)進(jìn)行匹配時(shí),

12、X是約束變量。2-1-4 事實(shí)數(shù)據(jù)庫(kù)段Visual prolog程序是事實(shí)和規(guī)則的集合。在程序運(yùn)行期間,對(duì)程序操縱的事實(shí)的更新、改變、移動(dòng)及增加、減少等,因此,屬于動(dòng)態(tài)庫(kù)(dynamic database)或內(nèi)部庫(kù)(internal database)。Visual prolog包含了一個(gè)專(zhuān)門(mén)用來(lái)說(shuō)明屬于動(dòng)態(tài)庫(kù)的事實(shí)的部分,即FACTS部分。FACTS的一般聲明格式如下:GLOBAL FACTS | DATABASE - databasenamenocopynondeterm|determ|single fact_1(ArgsList_1).nocopysingle|determ|nondet

13、erm fact_N(ArgsList_N).其中,“”表示多選一,且必選一,“”表示可有可無(wú),“*”表示任意多次重復(fù)(包含0次)。GLOBAL-表明事實(shí)部分是否是全局的。nocopy-事實(shí)匹配時(shí)不進(jìn)行復(fù)制。nondeterm-默認(rèn)情形是事實(shí)fact_N的任意多個(gè)實(shí)例可以存在(即不確定的)。determ-任何時(shí)候,一個(gè)fact_N的實(shí)例不超過(guò)1個(gè)。single-任何時(shí)候,事實(shí)fact_N的實(shí)例有且只能有一個(gè)。fact_N-事實(shí)或謂詞。argsList_N-事實(shí)或謂詞中的參數(shù)表。其形式為: Domain_1 Name_1 , Domain_2 Name_2 * 例如:FACTSperson(ST

14、RING Name, STRING Address, INTEGER Age)determ counter(integer CounterValue)single singleFact(STRING)single my_font(font_list)2-1-5 域段用于聲明任何Visual Prolog標(biāo)準(zhǔn)域以外的域。類(lèi)似于C語(yǔ)言中的數(shù)據(jù)類(lèi)型定義typedef的功能。2-1-5-1符號(hào)約定及說(shuō)明dom-領(lǐng)域名。reference表示允許有非約束變量作為輸入?yún)?shù)。其聲明的方法是在域聲明右邊加一關(guān)鍵字reference。例如:DOMAINSreflist = reference refint*re

15、fint = reference integerterm = reference int(refint); symb(refsymb)refsymb = reference symbol當(dāng)一個(gè)復(fù)合域被聲明為一個(gè)reference域時(shí),其所有的子域自動(dòng)成為reference的。然而,應(yīng)該在域段中明確指出要成為reference域的域。如果子域是標(biāo)準(zhǔn)域,如integer,string,則整個(gè)程序中的標(biāo)準(zhǔn)域都將成為reference域。注:不應(yīng)該將標(biāo)準(zhǔn)域作為reference域。在純粹的Prolog中,這將顯著地增加系統(tǒng)的負(fù)擔(dān)。在含C調(diào)用的工程中,還將導(dǎo)致不正確的參數(shù)傳遞甚至保護(hù)性錯(cuò)誤。例如:用re

16、ference域進(jìn)行排序的實(shí)例。DOMAINStree = reference t(val, tree, tree) /*tree是一個(gè)reference域*/val = integerlist = integer*PREDICATESinsert(integer,tree)instree(list,tree)nondeterm treemembers(integer,tree)sort(list,list)CLAUSESinsert(Val,t(Val,_,_):-!.insert(Val,t(Val1,Tree,_):-ValVal1,!,insert(Val,Tree).insert(V

17、al,t(_,_,Tree):-insert(Val,Tree).instree(,_).instree(H|T,Tree):-insert(H,Tree),instree(T,Tree).treemembers(_,T):-free(T),!,fail.treemembers(X,t(_,L,_):-treemembers(X,L).treemembers(X,t(Refstr,_,_):-X = Refstr.treemembers(X,t(_,_,R):-treemembers(X,R).sort(L,L1):-instree(L,Tree),findall(X,treemembers(

18、X,Tree),L1).GOALsort(3,6,1,4,5,L),write(L=,L),nl.align byte|word|dword內(nèi)存分配與使用方法指定。對(duì)標(biāo)準(zhǔn)Prolog內(nèi)存的處理是自動(dòng)進(jìn)行的。(詳細(xì)情形及例子見(jiàn)Help)declaration_1 ;declaration_2* 可選擇的復(fù)合對(duì)象聲明部分。其格式為:functor(sub_1 , sub_2* )。2-1-5-2用標(biāo)準(zhǔn)領(lǐng)域進(jìn)行聲明標(biāo)準(zhǔn)領(lǐng)域類(lèi)型:integer, char, real, string, symbol, word, byte, short, unsigned, long, ulong, ushort,

19、binary等。其定義如下:integer:-3276832767之間的整數(shù)。char:?jiǎn)我?hào)引起來(lái)的單個(gè)字符,如a。其中,n, t, b等為轉(zhuǎn)義字符。real:+/-1.0e-307之間的實(shí)數(shù)。string:雙引號(hào)引起來(lái)的任意多個(gè)字符構(gòu)成??梢允强沾?。symbol:有兩種格式,一是以小寫(xiě)字母開(kāi)頭,后跟若干字母、數(shù)字和下劃線組成的符號(hào)串,一是由雙引號(hào)引起來(lái)的一串字符。后者主要用于含空格字符或起始字符不是小寫(xiě)的時(shí)候。byte, word, short, ushort, signed, unsigned, long, ulong, binary:表示不同的數(shù)據(jù)類(lèi)型。注1:符號(hào)和串可以交替使用,但在

20、機(jī)器內(nèi)部的處理過(guò)程是不同的。對(duì)符號(hào)串,內(nèi)部是用表存放的,能加速匹配過(guò)程。其缺點(diǎn)是占用專(zhuān)門(mén)的存儲(chǔ)空間,且搜索需要花費(fèi)一定時(shí)間。注2:如果程序中謂詞說(shuō)明都用標(biāo)準(zhǔn)領(lǐng)域,則領(lǐng)域段可以省略?;居虻恼f(shuō)明格式:dom , dom1 = reference 例如:DOMAINS brand, color = symbolage, price = integermileage = realPREDICATEScar(brand, mileage, age, color, price)CLAUSEScar(chrysler,130000,3,red,12000).car(ford,90000,4,gray,25

21、000).car(datsun,8000,1,red,30000).GOALScar(Make,Odometer,Years_on_road,Body,25000); /查找價(jià)格為25000車(chē)car(Make,Odometer,Years_on_road,Body,Cost) and Cost25000. /或查找25000以下的車(chē)特殊域的說(shuō)明格式:dom ,dom1 = reference signed | unsigned byte | word | dword2-1-5-3復(fù)合對(duì)象及其領(lǐng)域的聲明復(fù)合對(duì)象:對(duì)象中含對(duì)象時(shí),該對(duì)象稱(chēng)為復(fù)合對(duì)象。例如:復(fù)合對(duì)象實(shí)例。owns(john,book

22、(“From Here to Eternity”, “James Jones”).和owns(john,horse(blacky).分別表示John擁有James Jones寫(xiě)的從現(xiàn)在到未來(lái)的書(shū),以及John擁有一匹黑馬的事實(shí)。而用owns(john,“From Here to Eternity”).和owns(john,blacky).是不能表達(dá)以上兩個(gè)事實(shí)的。復(fù)合對(duì)象的構(gòu)成:由函數(shù)子及屬于此函數(shù)子的子對(duì)象構(gòu)成,即functor(obj1,obj2,objN)。沒(méi)有子對(duì)象的函數(shù)子表示為functor()或functor,用于區(qū)分不同的對(duì)象,如前面的book和horse。復(fù)合對(duì)象的領(lǐng)域說(shuō)明:其

23、完整格式如下:GLOBAL DOMAINSdom ,dom_1 = reference align byte|word|dword declaration_1 ;declaration_2*例如:復(fù)合對(duì)象域的聲明實(shí)例。DOMAINStitle,author,name = symbolarticles = book(title,author);horse(name) /*各選擇域之間用分號(hào)分隔*/符合對(duì)象的層次結(jié)構(gòu)表示特征:書(shū)作者書(shū)名姓名復(fù)合對(duì)象域的樹(shù)結(jié)構(gòu)示意圖DOMAINS articles = book(title,author);author = author(firstname,surn

24、ame)title, firstname, surname = symbol注:一個(gè)領(lǐng)域語(yǔ)句一次僅能描述一層樹(shù)結(jié)構(gòu),而不能描述整棵樹(shù)。例如:articles=book(title,author(name,surname)作為領(lǐng)域說(shuō)明是不行的。必須分別如上例所示進(jìn)行描述。沒(méi)有函數(shù)子的復(fù)合對(duì)象(單選擇的復(fù)合對(duì)象):一般格式:dom , dom_1 = struct align byte | word | dword obj_declaration例如:BOOKS = struct book(SYMBOL Author_Name, SYMBOL Title)注:域的右邊不能再有其它可選擇域!2-1-

25、5-4列表及其領(lǐng)域的聲明表是Prolog程序中的基本數(shù)據(jù)結(jié)構(gòu),與Pascal和C等面向過(guò)程程序設(shè)計(jì)語(yǔ)言的數(shù)組結(jié)構(gòu)相當(dāng)。列表域聲明的一般格式:mylist , mylist1= reference elementDom*注1:其中的星號(hào)表示可有0個(gè)或多個(gè)元素。注2:表中元素必須具有相同領(lǐng)域,如果不為標(biāo)準(zhǔn)領(lǐng)域范圍,則必須有一個(gè)關(guān)于對(duì)象的聲明。注3:表中元素可以是任何對(duì)象類(lèi)型,也包含表類(lèi)型本身。其一般定義格式如下:DOMAINSobjectlist=objects*objects=例如:DOMAINSintegerlist=integer*namelist=name*name=symbol表的表示方

26、法:以擴(kuò)住的,其間由多個(gè)元素構(gòu)成,元素和元素之間由逗號(hào)分隔。例如:1,2,3 dog, cat, canary “valerie”, “jonathan”, “Michael”等。表的基本結(jié)構(gòu)與操作:Prolog將表分成表頭(head)和表尾(tail)兩部分。表頭是表中的第一個(gè)元素,表尾是除去表頭元素后剩下的部分。表頭和表尾可用豎線(“|”)分隔。(其表示與基本操作可以參見(jiàn)數(shù)據(jù)結(jié)構(gòu)中廣義表結(jié)構(gòu)的討論)注:空表的表頭和表尾均無(wú)定義。 例如:表及其表頭、表尾實(shí)例。a,b,c的表頭為a,表尾為b,c。可以表示為a|b,c。1的表頭為1,表尾為??梢员硎緸閍|。的表頭無(wú)定義,表尾也無(wú)定義。1,2,3

27、,2,3,4,的表頭為1,2,3,表尾為2,3,4,??梢员硎緸?,2,3|2,3,4,。例如:表頭表尾的匹配實(shí)例。X,Y,Z與egbert, eats, icecream匹配結(jié)果為:X= egbert,Y= eats,Z= icecream。7與X|Y匹配的結(jié)果為:X=7,Y=。1,2,3,4與X,Y|Z的匹配結(jié)果為:X=1,Y=2,Z=3,4。1,2與3|X匹配失敗。例如:有關(guān)表頭、表尾操作的程序?qū)嵗?。DOMAINSnamelist=name*name=symbolPREDICATESmember(name,namelist).CLAUSESmember(Name,Name|_). /*下

28、劃線表示子句匹配時(shí)不感興趣*/member(Name,_|Tail) if member(Name,Tail). /*判定Name是否表中成員*/write_a_list(). /*表空時(shí)停止(此時(shí)匹配成功)*/write_a_list(Head|Tail):-write(Head),nl,write_a_list(Tail).(3) 特殊的預(yù)定義對(duì)象(略)(4) 謂詞域的聲明(略)(5) 對(duì)象謂詞域的聲明(略)(6) 引用域的聲明(略)(7) 目標(biāo)域的聲明(略)2-1-6 謂詞段用于聲明謂詞、函數(shù)或謂詞之值的地方。謂詞、函數(shù)的聲明形式:GLOBAL PREDICATESPredicateMo

29、de ReturnDomain predicateName(arglist)- flowpatterns language namespecGLOBAL-表示該謂詞定義為全局的。PredicateMode-謂詞模式,定義為procedure | determ | nondeterm | failure | erroneous | multi。用于定義謂詞的執(zhí)行方式,因?yàn)?,Visual Prolog是強(qiáng)制類(lèi)型執(zhí)行系統(tǒng),它強(qiáng)迫程序員指定謂詞的兩種行為的確定:一是謂詞的調(diào)用是否要失敗,一個(gè)謂詞可以產(chǎn)生的解答個(gè)數(shù)。其中:multi-定義非確定性謂詞,可以回溯產(chǎn)生多解。這種謂詞總是成功的,因此,至少有

30、一個(gè)解。(never fail!)procedure-定義被稱(chēng)之為過(guò)程的謂詞。過(guò)程總是成功的,但不回溯。過(guò)程有且僅有一個(gè)解。運(yùn)行時(shí)可能有錯(cuò)誤產(chǎn)生!編譯器將總是檢查并給出過(guò)程中的非確定性子句的警告。如果不能保證一個(gè)過(guò)程不絕失敗的話,編譯器將給出595或596錯(cuò)誤。erroneous-不應(yīng)產(chǎn)生一個(gè)解,且永遠(yuǎn)不失敗。(相當(dāng)于一個(gè)運(yùn)行時(shí)錯(cuò)誤,可以用于設(shè)置陷阱的處理)failure-不產(chǎn)生一個(gè)解,但可以失敗。用于強(qiáng)迫程序回溯到最近的回溯點(diǎn),或者與運(yùn)行時(shí)錯(cuò)誤一樣,起中斷程序執(zhí)行的作用。例如內(nèi)建謂詞fail。編譯器總是檢查并對(duì)含不確定子句的謂詞進(jìn)行警告。determ-定義確定性謂詞。該類(lèi)謂詞可以成功,也可以

31、失敗,但絕不回溯。即該類(lèi)謂詞不會(huì)多于一個(gè)解。編譯器總是檢查并對(duì)謂詞中含不確定性子句的進(jìn)行警告。注:determ也用于事實(shí)的聲明中。nondeterm-定義能夠進(jìn)行回溯并產(chǎn)生多解的非確定性謂詞。可以失敗,此時(shí),不產(chǎn)生任何解。注:determ也用于事實(shí)的聲明中。ReturnDomain-聲明一個(gè)函數(shù)時(shí)的返回域。返回值從函數(shù)子句的最后一個(gè)參數(shù)獲得,但該參數(shù)在謂詞聲明時(shí)不必出現(xiàn)。例如:PREDICATESINTEGER /*Return*/ cube(INTEGER In) /*代入一整型參數(shù),返回一整型結(jié)果*/CLAUSEScube(In,Return):- Return = In*In*In. /

32、*函數(shù)cub()的子句表示!*/predicateName-謂詞名(或函數(shù)名)由字母開(kāi)頭(最好小寫(xiě)),后跟字母、數(shù)字、下畫(huà)線的符號(hào)串組成,最長(zhǎng)不超過(guò)250個(gè)。名字中間不能出現(xiàn)減號(hào)、空格、星號(hào)等字符。- flowpatterns -形如( flow , flow * )。其中,flow即 i | o | functor flowpattern | listflow ,flowpattern指明每一個(gè)參數(shù)如何使用:i表示輸入流,o表示輸出流,functor and flowpattern是指一個(gè)復(fù)合項(xiàng)的輸入流和輸出流情形。例如:輸入流、輸出流的控制流分析實(shí)例。diagnostics %should

33、 be placed before the start of the program text PREDICATESnondeterm plus(integer, integer, integer)nondeterm num(integer)CLAUSESplus(X,Y,Z):- /*X+Y=?-X加Y的結(jié)果是什么*/bound(X),bound(Y),!,Z=X+Y. /* (i,i,o) */plus(X,Y,Z):- /*?+Y=Z-什么加Y等于Z*/bound(Y),bound(Z),!,X=Z-Y. /* (o,i,i) */plus(X,Y,Z):- /*X+?=Z-X加什么等于

34、Z*/bound(X),bound(Z),!,Y=Z-X. /* (i,o,i) */plus(X,Y,Z):- /*?+?=Z-加起來(lái)的結(jié)果為Z的有哪些*/free(X),free(Y),bound(Z),num(X),Y=Z-X. /* (o,o,i) */plus(X,Y,Z):- /*?+Y=?-加數(shù)為Y的有哪些*/free(X),free(Z),bound(Y),num(X),Z=X+Y. /* (o,i,o) */plus(X,Y,Z):- /*X+?=?-被加數(shù)為X的有哪些*/free(Y),free(Z),bound(X),num(Y),Z=X+Y. /* (i,o,o) */

35、plus(X,Y,Z):- /*?+?=?-加法有哪些*/free(X),free(Y),free(Z),num(X),num(Y),Z=X+Y. /* (o,o,o) */% Generator of numbers starting from 0num(0).num(X):-num(A),X = A+1.為方便,一般可以在謂詞聲明時(shí),為其指定輸入輸出流的可能使用情形。尤其是謂詞流模式不是所有模式都有效時(shí),可以幫助Prolog的流分析器分析子句所屬流。例如:指定謂詞流模式的實(shí)例。PREDICATESprocedure plus(integer, integer, integer) - (i,

36、i,o),(i,o,i),(o,i,i)此例中,流模式的指定告訴系統(tǒng),謂詞必須有兩個(gè)輸入值,一個(gè)輸出值。由此可以避免其它模式的分析與匹配。language-用于指定轉(zhuǎn)換用的編譯器,當(dāng)聲明的域要被傳送到其它語(yǔ)言子程序時(shí)用,默認(rèn)的是Prolog。language asm | c | pascal | prolog | stdcall | syscall 。namespec-用于指定目標(biāo)代碼的擴(kuò)展名字。(主要用于與其它語(yǔ)言接口時(shí))注1:對(duì)全局謂詞,必須說(shuō)明其輸入、輸出流模式。否則,Prolog將把所有參數(shù)都作為默認(rèn)的流處理,即輸入流。例如:GLOBAL PREDICATES my_converter

37、(STRING, INTEGER)等價(jià)于my_converter(STRING, INTEGER)- (i,i)注2:每個(gè)謂詞的流模式可以有多個(gè)。注3:對(duì)每一種流模式,都可以分別指定一個(gè)謂詞模式。例如:PREDICATESprocedure append(ILIST,ILIST,ILIST) - (i,i,o)determ(i,i,i)nondeterm(o,o,i)注4:謂詞允許有多重說(shuō)明。要求對(duì)同一謂詞的重復(fù)說(shuō)明必須一個(gè)接一個(gè)連續(xù)給出,且要求謂詞的參數(shù)個(gè)數(shù)必須一致,但領(lǐng)域可以不同。例如:要定義一個(gè)實(shí)數(shù)加法和整數(shù)加法時(shí),謂詞聲明如下:add(integer,integer,integer)a

38、dd(real,real,real)謂詞值的聲明形式:GLOBAL PREDICATESpredicateName : predicateDomain namespec例如:(略)函數(shù)與返回值:例如:PREDICATESUNSIGNED /*Return*/ triple(UNSIGNED In)CLAUSEStriple(In, Return):- Return = In * 3.GOALReturnTripleVal = triple(6),write(ReturnTripleVal).無(wú)參函數(shù)的聲明與調(diào)用:如果函數(shù)無(wú)任何參數(shù),其聲明的謂詞名后的括號(hào)對(duì)不能省略,否則,程序出錯(cuò),或不能當(dāng)函數(shù)

39、使用。例如:PREDICATESunsigned hour()CLAUSEShour(H):- time(H,_,_,_).其調(diào)用形式為:Hour = hour(),不能為Hour = hour。函數(shù)與尾遞歸(tail recursion):當(dāng)一個(gè)謂詞被聲明為一個(gè)有返回值的函數(shù)時(shí),不能按常規(guī)謂詞的調(diào)用方法調(diào)用之(即在參數(shù)表的最后給出輸出參數(shù)的方法),而是要用函數(shù)的方法進(jìn)行調(diào)用。原因在于函數(shù)將返回值存到了寄存器中去了,即編譯之前和函數(shù)調(diào)用之后的代碼與常規(guī)的謂詞謂詞調(diào)用是不同的。因此,調(diào)用其自身的函數(shù)不是尾遞歸的。例如:DOMAINSilist = integer*PREDICATESilist

40、neg(ilist)CLAUSESneg(,).neg(Head|Tail,NHead|NTail):-NHead = -Head,NTail = neg(Tail). /*不是尾遞歸的!*/GOALX=neg(1,2,3,4). /*neg(1,2,3,4,X)調(diào)用時(shí),系統(tǒng)將告之參數(shù)個(gè)數(shù)不對(duì)*/以下代碼是尾遞歸的:DOMAINSilist = integer*PREDICATESneg(ilist,ilist)CLAUSESneg(,).neg(Head|Tail,NHead|NTail):-NHead = -Head,neg(Tail,NTail). /*此子句形式是尾遞歸的!*/GOAL

41、neg(1,2,3,4,X). /* Y=neg(1,2,3,4,X).要出錯(cuò),即目標(biāo)類(lèi)型錯(cuò)*/2-1-7 問(wèn)題目標(biāo)段是程序的內(nèi)建目標(biāo)段,一個(gè)Prolog程序必須有一個(gè)目標(biāo)段,且只有一個(gè)目標(biāo)段。跟規(guī)則體一樣,由一個(gè)或多個(gè)子目標(biāo)構(gòu)成。但與規(guī)則體之區(qū)別在于:目標(biāo)后面不跟“:-”。程序啟動(dòng)后,將自動(dòng)執(zhí)行目標(biāo)。復(fù)合目標(biāo):由兩個(gè)以上的子目標(biāo)構(gòu)成的目標(biāo)。子目標(biāo):復(fù)合目標(biāo)中的任一目標(biāo)。兩個(gè)子目標(biāo)之間是聯(lián)合關(guān)系時(shí),用逗號(hào)分隔。Prolog盡量滿足目標(biāo)中體,一旦所有子目標(biāo)都成功,程序成功結(jié)束。否則,失敗。兩個(gè)子目標(biāo)之間是“或”關(guān)系時(shí),用分號(hào)分隔。執(zhí)行時(shí)依次滿足子目標(biāo),一旦子目標(biāo)被滿足,則成功結(jié)束,否則,將滿足下

42、一子目標(biāo)。直到所有子目標(biāo)都不滿足時(shí),失敗退出。例如:car(Make,Odometer,Years_on_road,Body,Cost),Cost25000./小于25000的車(chē)car(ford,Odometer,Years_on_road,Body,Cost) ;Cost25000./ford車(chē)或小于25000的車(chē)外部目標(biāo)與內(nèi)部目標(biāo):在文本模式下的Prolog對(duì)話窗口中給定測(cè)試目標(biāo)時(shí),稱(chēng)為外部目標(biāo)(Visual Prolog中已經(jīng)沒(méi)有了)。在程序中給定目標(biāo)稱(chēng)為內(nèi)部目標(biāo)。注:在Visual Prolog中實(shí)施以前外部目標(biāo)的調(diào)試功能,可以借助于系統(tǒng)提供的測(cè)試目標(biāo)功能(Test Goal)。2-1

43、-8 子句部分Prolog是基于謂詞邏輯形式系統(tǒng)的一個(gè)子集,即Horn子句。一個(gè)Prolog程序由兩種子句構(gòu)成:事實(shí)和規(guī)則。一個(gè)程序可以有多個(gè)子句段,每個(gè)子句段都由CLAUSES開(kāi)頭。事實(shí):已知為真的關(guān)系或性質(zhì)。如:likes(bill, cindy).規(guī)則:相互依賴(lài)的關(guān)系。允許Prolog從一類(lèi)信息推出另外的信息。如果給定的條件為真,則規(guī)則為真。規(guī)則由兩部分構(gòu)成:一是規(guī)則頭,一是規(guī)則體。規(guī)則頭和規(guī)則體之間用“:-”分隔。規(guī)則頭又稱(chēng)結(jié)論(conclusion)或依賴(lài)關(guān)系(dependent relation)。規(guī)則體是一些必須為真的條件或事實(shí),它們將由Prolog去證明。注1:“:-”可用“i

44、f”代替。注2:一個(gè)謂詞的子句應(yīng)該放在一起。注3:定義一個(gè)謂詞的子句序列被成為過(guò)程(procedure)。注4:規(guī)則體中的事實(shí)或條件之間有連接詞“and”/“or”或“,”/“;”分隔。注5:每一子句以點(diǎn)“.”結(jié)束。注6:Prolog試圖滿足一個(gè)目標(biāo)時(shí),按子句出現(xiàn)的先后順序進(jìn)行。例如:如前述各例及后面所有相關(guān)例子所示。2-2 Prolog內(nèi)建函數(shù)(Built-in functions)簡(jiǎn)介2-2-1 算術(shù)函數(shù)與謂詞X mode Y X div Y abs(X) exp(X) ln(X) log(X) sqrt(X)round(X) trunc(X) val(domain,X) cos(X) s

45、in(X) tan(X) arctan(X) random(X)-之間的隨機(jī)實(shí)數(shù)。random(X,Y)-之間的隨機(jī)整數(shù)。randominit(X)-初始化隨機(jī)數(shù)產(chǎn)生器。2-2-2 控制謂詞bound(Variable)-測(cè)試變量是否被約束。free(Variable)-測(cè)試變量是否自由變量。fail()-強(qiáng)迫失敗,以引起回溯。not(Atom)-對(duì)子目標(biāo)結(jié)果的否定。true()-總是成功。可以作為陷阱函數(shù)的參數(shù)使用。findall(X, predicateName(_,_,X,_,_), VarList)-匯集非確定性謂詞調(diào)用的所有求解結(jié)果到值域表中去。其中,要求謂詞具有nondeterm特

46、性,DOMAINS中有值域表領(lǐng)域需要的域表聲明。getbacktrack(UNSIGNED Btop)-將當(dāng)前指針?lè)祷氐交厮輻5臈m斘恢谩I院笥胏utbacktrack()去掉所有該點(diǎn)之上的回溯點(diǎn)。與cutbacktrack (UNSIGNED Btop)一起實(shí)現(xiàn)一個(gè)動(dòng)態(tài)cut(截?cái)?。例如:GOAL /*顯示所有至少有一個(gè)朋友的人*/person(P,_), getbacktrack(Btop), /* surround friends by a local cut */friends(P,_),cutbacktrack(Btop),write(n, P, has a friend),fai

47、l.cutbacktrack (UNSIGNED Btop)-去掉getbacktrack(UNSIGNED Btop)調(diào)用后產(chǎn)生的所有回溯點(diǎn)。2-2-3 數(shù)據(jù)類(lèi)型變換類(lèi)謂詞(略)2-2-3 數(shù)據(jù)壓縮類(lèi)謂詞(略)2-2-4 錯(cuò)誤與中斷控制謂詞(略)2-2-5 外部數(shù)據(jù)庫(kù)系統(tǒng)訪問(wèn)的謂詞(略)2-2-6 文件系統(tǒng)標(biāo)準(zhǔn)謂詞(略)2-2-7 處理2#問(wèn)題的標(biāo)準(zhǔn)謂詞(略)2-2-8 輸入/輸出標(biāo)準(zhǔn)謂詞(略)2-2-8-1 輸入標(biāo)準(zhǔn)謂詞inkey (CHAR Char)-從鍵盤(pán)讀入一個(gè)字符Char。keypressed-測(cè)試是否有鍵被按下。readchar (CHAR CharVariable)-從當(dāng)前設(shè)

48、備讀入一個(gè)字符。readint(INTEGER IntegerVariable)-從當(dāng)前設(shè)備讀入一個(gè)整數(shù)。readreal(REAL RealVariable)-從當(dāng)前設(shè)備讀入一實(shí)數(shù)。readln(STRING StringVariable)-從當(dāng)前設(shè)備讀入一串(回車(chē)時(shí)結(jié)束)。readint(INTEGER IntegerVariable)-讀入一個(gè)整數(shù)。readterm(, Term)-從給定的域讀入一項(xiàng)。一般用于獲取磁盤(pán)文件中的事實(shí)。注:必須給出domain名,且給出term的格式,輸入時(shí)按term的格式輸入。例1: domainsdom = d(string, integer)GoalX = d(hello,2),write(Type , X, and press ),nl,readterm(dom,d(Y,2), /注:按d(“”,3) 格式輸入term值。write(Y),nl,readchar(_),!; write(You have made a mistake!),nl,readchar(_).例2: DOMAINSFILE = dbaseFACTS - mydbase.PREDICATESmy_consult(string)repeat(file)CLAUSESmy_consult(FileName) :-open

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論