Prolog概況及基本結(jié)構(gòu)分析
Prolog是當(dāng)代最有影響的人工智能語(yǔ)言之一,由于該語(yǔ)言很適合表達(dá)人的思維和推理規(guī)則,在自然語(yǔ)言理解、機(jī)器定理證明、專家系統(tǒng)等方面得到了廣泛的應(yīng)用,已經(jīng)成為人工智能應(yīng)用領(lǐng)域的強(qiáng)有力的開(kāi)發(fā)語(yǔ)言。
盡管Prolog語(yǔ)言有許多版本,但它們的核心部分都是一樣的。Prolog的基本語(yǔ)句僅有三種,即事實(shí)、規(guī)則和目標(biāo)三種類型的語(yǔ)句,且都用謂詞表示,因而程序邏輯性強(qiáng),文法簡(jiǎn)捷,清晰易懂。另一方面,Prolog是陳述性語(yǔ)言,一旦給它提交必要的事實(shí)和規(guī)則之后,Prolog就使用內(nèi)部的演繹推理機(jī)制自動(dòng)求解程序給定的目標(biāo),而不需要在程序中列出詳細(xì)的求解步驟。
1、事實(shí)
事實(shí)用來(lái)說(shuō)明一個(gè)問(wèn)題中已知的對(duì)象和它們之間的關(guān)系。在Prolog程序中,事實(shí)由謂詞名及用括號(hào)括起來(lái)的一個(gè)或幾個(gè)對(duì)象組成。謂詞和對(duì)象可由用戶自己定義。
例如,謂詞likes(bill,book)。
是一個(gè)名為like的關(guān)系,表示對(duì)象bill和book之間有喜歡的關(guān)系。
2、規(guī)則
規(guī)則由幾個(gè)互相有依賴性的簡(jiǎn)單句(謂詞)組成,用來(lái)描述事實(shí)之間的依賴關(guān)系。從形式上看,規(guī)則由左邊表示結(jié)論的后件謂詞和右邊表示條件的前提謂詞組成。
例如,規(guī)則 bird(X):-animal(X),has(X,feather)。
表示凡是動(dòng)物并且有羽毛,那么它就是鳥(niǎo)。
3、目標(biāo)(問(wèn)題)
把事實(shí)和規(guī)則寫進(jìn)Prolog程序中后,就可以向Prolog詢問(wèn)有關(guān)問(wèn)題的答案,詢問(wèn)的問(wèn)題就是程序運(yùn)行的目標(biāo)。目標(biāo)的結(jié)構(gòu)與事實(shí)或規(guī)則相同,可以是一個(gè)簡(jiǎn)單的謂詞,也可以是多個(gè)謂詞的組合。目標(biāo)分內(nèi)、外兩種,內(nèi)部目標(biāo)寫在程序中,外部目標(biāo)在程序運(yùn)行時(shí)由用戶手工鍵入。
例如問(wèn)題 ?-student(john)。
表示“john是學(xué)生嗎?”
Prolog程序的簡(jiǎn)單例子
以下兩個(gè)例子在Turbo Prolog 2.0環(huán)境下運(yùn)行通過(guò)。
[ 注:一個(gè)Turbo Prolog程序至少包括謂詞段、子句段和目標(biāo)段三項(xiàng)。目標(biāo)可以包含在程序中,也可以在程序運(yùn)行時(shí)給出。]
例1 誰(shuí)是john的朋友?
predicates /*謂詞段,對(duì)要用的謂詞名和參數(shù)進(jìn)行說(shuō)明*/
likes(symbol, symbol)
friend(symbol, symbol)
clauses /*子句段,存放所有的事實(shí)和規(guī)則*/
likes(bell,sports)。 /*前4行是事實(shí)*/
likes(mary,music)。
likes(mary,sports)。
likes(jane,smith)。
friend(john,X):-likes(X,sports),likes(X,music)。 /*本行是規(guī)則*/
當(dāng)上述事實(shí)與規(guī)則輸入計(jì)算機(jī)后,運(yùn)行該程序,用戶就可以進(jìn)行詢問(wèn),如輸入目標(biāo):
friend(john,X)
即詢問(wèn)john的朋友是誰(shuí),,這時(shí)計(jì)算機(jī)的運(yùn)行結(jié)果為:
X=mary (mary是john的朋友)
1 Solution (得到了一個(gè)結(jié)果)
程序運(yùn)行界面如下圖所示:
例2 漢諾塔問(wèn)題:
有N個(gè)有孔的盤子,最初這些盤子都疊放在柱a上(如圖1),要求將這N個(gè)盤子借助柱b從柱a移到柱c(如圖2),移動(dòng)時(shí)有以下限制:每次只能移動(dòng)一個(gè)盤子;大盤不能放在小盤上。問(wèn)如何移動(dòng)?
該問(wèn)題可以采用遞歸法思想來(lái)求解,其源程序?yàn)椋?/p>
predicates /*謂詞段*/
hanoi(integer)
move(integer,symbol,symbol,symbol)
inform(symbol,symbol)。
clauses /*子句段*/
hanoi(N):-move(N,a,b,c)。
move(1,A,_,C):-inform(A,C),!。
move(N,A,B,C):-N1=N-1,move(N1,A,C,B),
inform(A,C),move(N1,B,A,C)。
inform(Loc1,Loc2):-nl,write(“移動(dòng)1個(gè)盤子從柱” ,Loc1,“到柱”,Loc2)。
goal /*目標(biāo)段,問(wèn)移動(dòng)3個(gè)盤子的方法*/
hanoi(3)
這個(gè)例子的目標(biāo)包含在程序里面,因此運(yùn)行時(shí)程序?qū)⒅苯虞敵鏊薪Y(jié)果。
如何使用Prolog?
一般而言,prolog作為數(shù)據(jù)或者邏輯處理程序而運(yùn)行,配合其它程序如VC++、JAVA等的界面,由此實(shí)現(xiàn)帶UI交互的“智能”軟件,當(dāng)然你所編輯出來(lái)的“智能”是軟件,而不能說(shuō)是真正意義的人工智能。上文說(shuō)Prolog就是一個(gè)智能數(shù)據(jù)庫(kù),其實(shí)不然,Prolog主要是對(duì)數(shù)據(jù)進(jìn)行一種關(guān)系描述,比如張三和李四是A關(guān)系,李四和王二是B關(guān)系,A關(guān)系==B關(guān)系,那么Prolog則擅長(zhǎng)處理這種邏輯上的數(shù)據(jù)關(guān)系,不能和SQL混為一談,所以說(shuō),Prolog的用途是來(lái)處理數(shù)據(jù)之間關(guān)系的,而不是存儲(chǔ)數(shù)據(jù)本質(zhì)的存在。
Prolog語(yǔ)言的常用版本
Prolog語(yǔ)言最早是由法國(guó)馬賽大學(xué)的Colmerauer和他的研究小組于1972年研制成功。早期的Prolog版本都是解釋型的,自1986年美國(guó)Borland公司推出編譯型Prolog,即Turbo Prolog以后,Prolog便很快在PC機(jī)上流行起來(lái)。后來(lái)又經(jīng)歷了PDC PROLOG、Visual Prolog不同版本的發(fā)展。并行的邏輯語(yǔ)言也于80年代初開(kāi)始研制,其中比較著名的有PARLOG、Concurrent PROLOG等。
1、Turbo Prolog
由美國(guó)Prolog開(kāi)發(fā)中心(Prolog Development Center, PDC)1986年開(kāi)發(fā)成功、Borland公司對(duì)外發(fā)行,其1.0,2.0,2.1版本取名為Turbo Prolog,主要在IBM PC系列計(jì)算機(jī),MS-DOS環(huán)境下運(yùn)行。
2、PDC Prolog
1990年后,PDC推出新的版本,更名為PDC Prolog 3.0,3.2,它把運(yùn)行環(huán)境擴(kuò)展到OS/2操作系統(tǒng),并且向全世界發(fā)行。它的主要特點(diǎn)是:
?速度快。編譯及運(yùn)行速度都很快,產(chǎn)生的代碼非常緊湊。
?用戶界面友好。提供了圖形化的集成開(kāi)發(fā)環(huán)境。
?提供了強(qiáng)有力的外部數(shù)據(jù)庫(kù)系統(tǒng)。
?提供了一個(gè)用PDC Prolog編寫的Prolog解釋起源代碼。用戶可以用它研究Prolog的內(nèi)部機(jī)制,并創(chuàng)建自己的專用編程語(yǔ)言、推理機(jī)、專家系統(tǒng)外殼或程序接口。
?提供了與其他語(yǔ)言(如C、Pascal、Fortran等)的接口。Prolog和其他語(yǔ)言可以相互調(diào)用對(duì)方的子程序。
?具有強(qiáng)大的圖形功能。支持Turbo C、Turbo Pascal同樣的功能。
3、Visual Prolog
Visual Prolog是基于Prolog語(yǔ)言的可視化集成開(kāi)發(fā)環(huán)境,是PDC推出的基于Windows環(huán)境的智能化編程工具。目前,Visual Prolog在美國(guó)、西歐、日本、加拿大、澳大利亞等國(guó)家和地區(qū)十分流行,是國(guó)際上研究和開(kāi)發(fā)智能化應(yīng)用的主流工具之一。
Visual Prolog具有模式匹配、遞歸、回溯、對(duì)象機(jī)制、事實(shí)數(shù)據(jù)庫(kù)和謂詞庫(kù)等強(qiáng)大功能。它包含構(gòu)建大型應(yīng)用程序所需要的一切特性:圖形開(kāi)發(fā)環(huán)境、編譯器、連接器和調(diào)試器,支持模塊化和面向?qū)ο蟪绦蛟O(shè)計(jì),支持系統(tǒng)級(jí)編程、文件操作、字符串處理、位級(jí)運(yùn)算、算術(shù)與邏輯運(yùn)算,以及與其它編程語(yǔ)言的接口。
Visual Prolog包含一個(gè)全部使用Visual Prolog語(yǔ)言寫成的有效的開(kāi)發(fā)環(huán)境,包含對(duì)話框、菜單、工具欄等編輯功能。
Visual Prolog與SQL數(shù)據(jù)庫(kù)系統(tǒng)、C++開(kāi)發(fā)系統(tǒng)、以及Visual Basic、Delphi或Visual Age等編程語(yǔ)言一樣,也可以用來(lái)輕松地開(kāi)發(fā)各種應(yīng)用。
Visual Prolog軟件的下載地址為:http://www.visual-prolog.com
Prolog語(yǔ)言特點(diǎn)
1. prolog程序沒(méi)有特定的運(yùn)行順序,其運(yùn)行順序是由電腦決定的,而不是編程序的人。從這個(gè)意義上來(lái)說(shuō),prolog程序不是真正意義上的程序。所謂程序就是按照一定的步驟運(yùn)行的計(jì)算機(jī)指令,而prolog程序的運(yùn)行步驟不由人來(lái)決定。它更像一種描述型的語(yǔ)言,用特定的方法描述一個(gè)問(wèn)題,然后由電腦自動(dòng)找到這個(gè)問(wèn)題的答案。舉個(gè)極端的例子,你只需要把某個(gè)數(shù)學(xué)題目告訴它,它就會(huì)自動(dòng)的找到答案,而不像使用其他的語(yǔ)言一樣,必須人工的編制出某種算法。
2. prolog程序中沒(méi)有if、when、case、for這樣的控制流程語(yǔ)句前面已經(jīng)說(shuō)了,程序的運(yùn)行方式有電腦自己決定,當(dāng)然就用不到這些控制流程的語(yǔ)句了。通常情況下,程序員不需要了解程序的運(yùn)行過(guò)程,只需要注重程序的描述是否全面,不過(guò)prolog也提供了一些控制流程的方法,這些方法和其他語(yǔ)言中的方法有很大的區(qū)別,希望你在以后的學(xué)習(xí)當(dāng)中能夠融會(huì)貫通。
3. prolog程序和數(shù)據(jù)高度統(tǒng)一在prolog程序中,是很難分清楚哪些是程序,哪些是數(shù)據(jù)的。事實(shí)上,prolog中的所有東西都有相同的形式,也就是說(shuō)數(shù)據(jù)就是程序,程序就是數(shù)據(jù)。舉一個(gè)其他語(yǔ)言的例子:如果想用c語(yǔ)言編寫一個(gè)計(jì)算某個(gè)數(shù)學(xué)表達(dá)式的程序很簡(jiǎn)單(比如:a=2+5*4),因?yàn)檫@是一段程序。但是如果想編寫一個(gè)計(jì)算用戶輸入的表達(dá)式的值的程序就很困難了。因?yàn)橛脩糨斎氲氖且欢螖?shù)據(jù)(字符串),如果想讓c語(yǔ)言處理這個(gè)字符串,就需要很多方面的技術(shù)。則正是因?yàn)樵赾語(yǔ)言中,程序和數(shù)據(jù)是分開(kāi)的。而在prolog就不存在這個(gè)問(wèn)題,你甚至可以很輕松的編寫處理其它prolog程序的程序。
4. prolog程序?qū)嶋H上是一個(gè)智能數(shù)據(jù)庫(kù)prolog的原理就是關(guān)系數(shù)據(jù)庫(kù),它是建立在關(guān)系數(shù)據(jù)庫(kù)的基礎(chǔ)上的。在以后的學(xué)習(xí)中你會(huì)發(fā)現(xiàn)它和SQL數(shù)據(jù)庫(kù)查詢語(yǔ)言有很多相似之處。使用prolog可以很方便的處理數(shù)據(jù)。5. 強(qiáng)大的遞歸功能在其它的語(yǔ)言中,你也許已經(jīng)接觸過(guò)遞歸程序了。遞歸是一種非常簡(jiǎn)潔的方式,它能夠有效的解決許多難題。而在prolog中,遞歸的功能得到了充分的體現(xiàn),你甚至都會(huì)感到驚奇,遞歸居然有如此巨大的能力。
評(píng)論