首先我們先了解什么是人工智能語言
人工智能(AI)語言是一類適應(yīng)于人工智能和知識工程領(lǐng)域的、具有符號處理和邏輯推理能力的計(jì)算機(jī)程序設(shè)計(jì)語言。能夠用它來編寫程序求解非數(shù)值計(jì)算、知識處理、推理、規(guī)劃、決策等具有智能的各種復(fù)雜問題。典型的人工智能語言主要有LISP、Prolog、Smaltalk、C++等。
一般來說,人工智能語言應(yīng)具備如下特點(diǎn):
?具有符號處理能力(即非數(shù)值處理能力);
?適合于結(jié)構(gòu)化程序設(shè)計(jì),編程容易;
?具有遞歸功能和回溯功能;
?具有人機(jī)交互能力;
?適合于推理;
?既有把過程與說明式數(shù)據(jù)結(jié)構(gòu)混合起來的能力,又有辨別數(shù)據(jù)、確定控制的模式匹配機(jī)制。
人們可能會問,用人工智能語言解決問題與傳統(tǒng)的方法有什么區(qū)別呢?
傳統(tǒng)方法通常把問題的全部知識以各種的模型表達(dá)在固定程序中,問題的求解完全在程序制導(dǎo)下按著預(yù)先安排好的步驟一步一步(逐條)執(zhí)行。解決問題的思路與馮。諾依曼式計(jì)算機(jī)結(jié)構(gòu)相吻合。當(dāng)前大型數(shù)據(jù)庫法、數(shù)學(xué)模型法、統(tǒng)計(jì)方法等都是嚴(yán)格結(jié)構(gòu)化的方法。
對于人工智能技術(shù)要解決的問題,往往無法把全部知識都體現(xiàn)在固定的程序中。通常需要建立一個(gè)知識庫(包含事實(shí)和推理規(guī)則),程序根據(jù)環(huán)境和所給的輸入信息以及所要解決的問題來決定自己的行動,所以它是在環(huán)境模式的制導(dǎo)下的推理過程。這種方法有極大的靈活性、對話能力、有自我解釋能力和學(xué)習(xí)能力。這種方法對解決一些條件和目標(biāo)不大明確或不完備,(即不能很好地形式化,不好描述)的非結(jié)構(gòu)化問題比傳統(tǒng)方法好,它通常采用啟發(fā)式、試探法策略來解決問題。
那么Lisp和Prolog哪個(gè)更值得學(xué)習(xí),哪個(gè)功能更強(qiáng)大
自從五十年代麻省理工學(xué)院研制出LlSP以來,LISP一直是美國的主要人工智能語言。Prolog是七十年代初在歐洲研制出來的,為歐洲人工智能研究者所選用的語言。此外,日本第五代機(jī)計(jì)劃也選用Prolog作為它的軟件開發(fā)語言。在加利福尼亞州Calabasas的Hughes研究所Corporate人工智能中心幫助開發(fā)內(nèi)部專家系統(tǒng)的老科學(xué)家Douglas Partridge 預(yù)言,“這是一個(gè)復(fù)雜的問題,它所牽涉的許多事情,即使不影響八十年代后幾年,也會影響下五年的工業(yè)?!彼J(rèn)為,以Prolog 及其方言為代表的邏輯程序設(shè)計(jì)正潛入美國人工智能領(lǐng)域。但是,他懷疑,這種語言能否“與人們在研制專家系統(tǒng)時(shí)要用的問題求解方法一致。
LISP的許多鼓吹者很不相信Prolog。他們難以捉摸日本人為什么選用Prolog開發(fā)第五代機(jī)的軟件。有人說,“日本人犯了一個(gè)嚴(yán)重的錯(cuò)誤。Prolog 是研究問題的好工具,它太受其先天結(jié)構(gòu)的限但對一些重要應(yīng)用,
制。”越來越多的美國人轉(zhuǎn)向Prol0B這一事實(shí)表明,持這種態(tài)度是由于一般錯(cuò)誤地理解了Prolog與邏輯程序設(shè)計(jì)。有些研究人員花了數(shù)年時(shí)間學(xué)習(xí)LSP,因此對它很有感情。
兩種語言并非都人人中意,避開lisp與prolog之爭不談,對這兩個(gè)語言的常處于短處的看法是一致的。開發(fā)prolog軟件的Quintus計(jì)算機(jī)公司軟件技術(shù)董事長William Kornfeld 說,“prolog用起來很簡單,用他編程要比用lisp容易得多。Lisp是一個(gè)非常復(fù)雜的語言,要求程序員極其熟練”然而他指出,在最初設(shè)計(jì)prolog的時(shí)候,某些決策限制了他所擅長處理的問題類....”。關(guān)于Lisp和Prolog區(qū)別以及爭議我將在下文進(jìn)行分析。
關(guān)于LISP語言
(1)LISP具有和圖靈機(jī)相同的(也就是理論上最高的)計(jì)算能力;在計(jì)算機(jī)科學(xué)的可計(jì)算理論中,人們已經(jīng)證明遞歸函數(shù)和圖靈機(jī)具有相同的(也就是理論上最高的)計(jì)算能力,通常指的是自然數(shù)集上的遞歸函數(shù)。這個(gè)結(jié)論對符號集上的遞歸函數(shù)也成立。J.McCarthy在LISP中設(shè)計(jì)了一套符號處理函數(shù),它們具有符號集上的遞歸函數(shù)的計(jì)算能力,因此原則上可以解決人工智能中的任何符號處理問題。
(2)數(shù)據(jù)類型的唯一性,程序與數(shù)據(jù)的一致性;LISP的數(shù)據(jù)類型和句法結(jié)構(gòu)簡單,甚至簡單到具有唯一性和一致性:其數(shù)據(jù)和程序的表現(xiàn)形式是一樣的, 都是用S-表達(dá)式一種形式?;镜臄?shù)據(jù)結(jié)構(gòu)是表(表是S-表達(dá)式的特例)。
(3)數(shù)據(jù)和程序的 等價(jià)性;LISP的數(shù)據(jù)和程序不僅類型一致,而且作用也等價(jià);即:程序可作為數(shù)據(jù)被處理,數(shù)據(jù)也可作為程序來執(zhí)行。
(4)LISP一切功能由函數(shù)來實(shí)現(xiàn),程序的運(yùn)行就是求值;LISP程序的通常形式是一串函數(shù)定義,其后跟著一串帶有參數(shù)的函數(shù)調(diào)用,函數(shù)之間的關(guān)系只是在調(diào)用執(zhí)行時(shí)才體現(xiàn)出來。
(5)LISP語言的控制結(jié)構(gòu)以遞歸為主;大多數(shù)語言使用的控制結(jié)構(gòu)是以循環(huán)為主的,有的程序語言允許遞歸,而LISP以遞歸形式為主。遞歸是LISP能力的源泉。當(dāng)然現(xiàn)在LISP也有循環(huán)結(jié)構(gòu)和迭代。(6)原子可以有任意多個(gè)值(特性值);LISP非常重要的一個(gè)特點(diǎn)是每個(gè)文字原子許多特性,每個(gè)特性有一個(gè)特性表及對應(yīng)的特性值。由于原子的多值性給使用者帶來很多方便,給問題表示帶來好處,使LISP很好用。
(7)LISP具有表的結(jié)構(gòu)形式和規(guī)模的靈活性,不必預(yù)先設(shè)定;
(8)具有收集無用單元的功能。
關(guān)于 prolog語言
(1)WHAT型語言;Prolog 由程序設(shè)計(jì)的“How to do the Job”向 “What you want to do”前進(jìn)一步。用戶只要說明已知事實(shí)是什么,定義規(guī)則(說明對象間的關(guān)系),再告訴要解決的問題是什么(詢問)就行了,不必告訴計(jì)算機(jī)如何一步一步做,問題的求解是通過Prolog的內(nèi)部機(jī)制自動生成。
(2) 基于一階謂詞邏輯,既有堅(jiān)實(shí)的理論基礎(chǔ),又有較強(qiáng)的表現(xiàn)能力;Prolog的文法簡單,描述能力強(qiáng),更接近于自然語言,程序易寫易讀,程序量小。
(3) Prolog自動實(shí)現(xiàn)模式匹配(合一功能),自動回溯,這兩種是人工智能系統(tǒng)中常用的基本操作;
(4)內(nèi)部的回溯能力及不確定性使Prolog對同一個(gè)問題可給出多個(gè)解;Prolog具有不確定的原因有二個(gè):①過程性的不確定性:Prolog謂詞調(diào)用是用模式匹式、自頂向下的深度優(yōu)先搜索自動回溯策略,當(dāng)變元值不滿足謂詞時(shí)產(chǎn)生回溯,求得變元之另一值,如此下去直到謂詞為真;②變元特性的不確定性:系指謂詞中變元既可用來作輸入變元又可作輸出變元的這種性質(zhì)。變元特性的非確定性引起提問方式的多樣性,增強(qiáng)了交互能力(會話能力)。過程的不確定性和變元特性的不確定性,這是傳統(tǒng)程序設(shè)計(jì)語言以及另一種AI語言LISP所不具備的智能特性。
(5)Prolog的數(shù)據(jù)和程序的統(tǒng)一,Prolog提供了一種統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)--項(xiàng)(term),用來構(gòu)造數(shù)據(jù)和程序。數(shù)據(jù)和程序并沒有明顯區(qū)別,同樣存在數(shù)據(jù)庫中。并且提供了修改數(shù)據(jù)庫的指令ADDCL和DELCL,在程序執(zhí)行中,可以自行修改數(shù)據(jù)、改變控制,因而可以編制能自行修改程序和數(shù)據(jù)的程序,為實(shí)現(xiàn)某些智能提供了方便;
(6)遞歸是Prolog語言的重要特點(diǎn)之一。
缺點(diǎn):(1)在編譯系統(tǒng)實(shí)現(xiàn)問題上,在執(zhí)行效率低問題上,在系統(tǒng)開銷大的問題上,Prolog遇到了比LISP更大的困難;由于深度優(yōu)先算法,由于控制機(jī)制具有普遍性,由于遞歸和自動回溯,Prolog程序中間變量過多嚴(yán)重浪費(fèi)內(nèi)存,對具體的問題不免有多余的回溯,因而浪費(fèi)了較多的機(jī)器時(shí)間和空間,降低了效率。
(2) 大型的Prolog程序調(diào)試不容易;Prolog算法都是深度優(yōu)先搜索和自動回溯,在程序執(zhí)行過程中細(xì)節(jié)由系統(tǒng)內(nèi)部掌握,減少了人設(shè)計(jì)控制的工作。但反過來,用戶很難或根本無法控制算法的細(xì)節(jié),對程序控制的唯一途徑是通過“cut”操作(但cut影響了prolog的完備性)。因此大型prolog程序比LISP程序調(diào)試?yán)щy得多。
(3) Prolog的“not”是“失敗的not”,不是邏輯否定,只有在封閉世界假設(shè)基礎(chǔ)上才能認(rèn)為是邏輯否定。Prolog對量詞的處理也不夠。它視所有規(guī)則前面有對規(guī)則中所有變元的全稱量詞,而視詢問公式前有對詢問中變元的存在量詞。但實(shí)際應(yīng)用中封閉世界假設(shè)不一定合適。
(4) Prolog是描述笥語言,處理的是關(guān)系,因而在過程性控制方面局限性較大。但目前不少國家已經(jīng)實(shí)現(xiàn)了Prolog和LISP語言之間或它們與傳統(tǒng)語言之間的轉(zhuǎn)換接口。所以在過程控制方面也有推廣使用Prolog的,例如PC-Prolog。又如,POPLOG是LISP、PROLOG和POP-11的混合物,其中允許這三種語言寫的程序互相調(diào)用。也有以一種程序設(shè)計(jì)風(fēng)范為主、引進(jìn)并兼顧另一種風(fēng)范的,例如LOGLISP(以LISP結(jié)構(gòu)為基礎(chǔ),加進(jìn)邏輯程序成分的)。
Prolog詳細(xì)介紹
Prolog(Programming in Logic的縮寫)是一種邏輯編程語言。它建立在邏輯學(xué)的理論基礎(chǔ)之上, 最初被運(yùn)用于自然語言等研究領(lǐng)域。現(xiàn)已廣泛的應(yīng)用在人工智能的研究中,可以用來建造專家系統(tǒng)、自然語言理解、智能知識庫等。同時(shí)對一些通常的應(yīng)用程序的編寫也很有幫助,能夠比其他的語言更快速地開發(fā)程序,因?yàn)樗木幊谭椒ǜ笫鞘褂眠壿嫷恼Z言來描述程序。
#e#
Prolog概況及基本結(jié)構(gòu)分析
Prolog是當(dāng)代最有影響的人工智能語言之一,由于該語言很適合表達(dá)人的思維和推理規(guī)則,在自然語言理解、機(jī)器定理證明、專家系統(tǒng)等方面得到了廣泛的應(yīng)用,已經(jīng)成為人工智能應(yīng)用領(lǐng)域的強(qiáng)有力的開發(fā)語言。
盡管Prolog語言有許多版本,但它們的核心部分都是一樣的。Prolog的基本語句僅有三種,即事實(shí)、規(guī)則和目標(biāo)三種類型的語句,且都用謂詞表示,因而程序邏輯性強(qiáng),文法簡捷,清晰易懂。另一方面,Prolog是陳述性語言,一旦給它提交必要的事實(shí)和規(guī)則之后,Prolog就使用內(nèi)部的演繹推理機(jī)制自動求解程序給定的目標(biāo),而不需要在程序中列出詳細(xì)的求解步驟。
1、事實(shí)
事實(shí)用來說明一個(gè)問題中已知的對象和它們之間的關(guān)系。在Prolog程序中,事實(shí)由謂詞名及用括號括起來的一個(gè)或幾個(gè)對象組成。謂詞和對象可由用戶自己定義。
例如,謂詞likes(bill,book)。
是一個(gè)名為like的關(guān)系,表示對象bill和book之間有喜歡的關(guān)系。
2、規(guī)則
規(guī)則由幾個(gè)互相有依賴性的簡單句(謂詞)組成,用來描述事實(shí)之間的依賴關(guān)系。從形式上看,規(guī)則由左邊表示結(jié)論的后件謂詞和右邊表示條件的前提謂詞組成。
例如,規(guī)則 bird(X):-animal(X),has(X,feather)。
表示凡是動物并且有羽毛,那么它就是鳥。
3、目標(biāo)(問題)
把事實(shí)和規(guī)則寫進(jìn)Prolog程序中后,就可以向Prolog詢問有關(guān)問題的答案,詢問的問題就是程序運(yùn)行的目標(biāo)。目標(biāo)的結(jié)構(gòu)與事實(shí)或規(guī)則相同,可以是一個(gè)簡單的謂詞,也可以是多個(gè)謂詞的組合。目標(biāo)分內(nèi)、外兩種,內(nèi)部目標(biāo)寫在程序中,外部目標(biāo)在程序運(yùn)行時(shí)由用戶手工鍵入。
例如問題 ?-student(john)。
表示“john是學(xué)生嗎?”
Prolog程序的簡單例子
以下兩個(gè)例子在Turbo Prolog 2.0環(huán)境下運(yùn)行通過。
[ 注:一個(gè)Turbo Prolog程序至少包括謂詞段、子句段和目標(biāo)段三項(xiàng)。目標(biāo)可以包含在程序中,也可以在程序運(yùn)行時(shí)給出。]
例1 誰是john的朋友?
predicates /*謂詞段,對要用的謂詞名和參數(shù)進(jìn)行說明*/
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)行詢問,如輸入目標(biāo):
friend(john,X)
即詢問john的朋友是誰,,這時(shí)計(jì)算機(jī)的運(yùn)行結(jié)果為:
X=mary (mary是john的朋友)
1 Solution (得到了一個(gè)結(jié)果)
程序運(yùn)行界面如下圖所示:
例2 漢諾塔問題:
有N個(gè)有孔的盤子,最初這些盤子都疊放在柱a上(如圖1),要求將這N個(gè)盤子借助柱b從柱a移到柱c(如圖2),移動時(shí)有以下限制:每次只能移動一個(gè)盤子;大盤不能放在小盤上。問如何移動?
該問題可以采用遞歸法思想來求解,其源程序?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(“移動1個(gè)盤子從柱” ,Loc1,“到柱”,Loc2)。
goal /*目標(biāo)段,問移動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)然你所編輯出來的“智能”是軟件,而不能說是真正意義的人工智能。上文說Prolog就是一個(gè)智能數(shù)據(jù)庫,其實(shí)不然,Prolog主要是對數(shù)據(jù)進(jìn)行一種關(guān)系描述,比如張三和李四是A關(guān)系,李四和王二是B關(guān)系,A關(guān)系==B關(guān)系,那么Prolog則擅長處理這種邏輯上的數(shù)據(jù)關(guān)系,不能和SQL混為一談,所以說,Prolog的用途是來處理數(shù)據(jù)之間關(guān)系的,而不是存儲數(shù)據(jù)本質(zhì)的存在。
Prolog語言的常用版本
Prolog語言最早是由法國馬賽大學(xué)的Colmerauer和他的研究小組于1972年研制成功。早期的Prolog版本都是解釋型的,自1986年美國Borland公司推出編譯型Prolog,即Turbo Prolog以后,Prolog便很快在PC機(jī)上流行起來。后來又經(jīng)歷了PDC PROLOG、Visual Prolog不同版本的發(fā)展。并行的邏輯語言也于80年代初開始研制,其中比較著名的有PARLOG、Concurrent PROLOG等。
1、Turbo Prolog
由美國Prolog開發(fā)中心(Prolog Development Center, PDC)1986年開發(fā)成功、Borland公司對外發(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)生的代碼非常緊湊。
?用戶界面友好。提供了圖形化的集成開發(fā)環(huán)境。
?提供了強(qiáng)有力的外部數(shù)據(jù)庫系統(tǒng)。
?提供了一個(gè)用PDC Prolog編寫的Prolog解釋起源代碼。用戶可以用它研究Prolog的內(nèi)部機(jī)制,并創(chuàng)建自己的專用編程語言、推理機(jī)、專家系統(tǒng)外殼或程序接口。
?提供了與其他語言(如C、Pascal、Fortran等)的接口。Prolog和其他語言可以相互調(diào)用對方的子程序。
?具有強(qiáng)大的圖形功能。支持Turbo C、Turbo Pascal同樣的功能。
3、Visual Prolog
Visual Prolog是基于Prolog語言的可視化集成開發(fā)環(huán)境,是PDC推出的基于Windows環(huán)境的智能化編程工具。目前,Visual Prolog在美國、西歐、日本、加拿大、澳大利亞等國家和地區(qū)十分流行,是國際上研究和開發(fā)智能化應(yīng)用的主流工具之一。
Visual Prolog具有模式匹配、遞歸、回溯、對象機(jī)制、事實(shí)數(shù)據(jù)庫和謂詞庫等強(qiáng)大功能。它包含構(gòu)建大型應(yīng)用程序所需要的一切特性:圖形開發(fā)環(huán)境、編譯器、連接器和調(diào)試器,支持模塊化和面向?qū)ο蟪绦蛟O(shè)計(jì),支持系統(tǒng)級編程、文件操作、字符串處理、位級運(yùn)算、算術(shù)與邏輯運(yùn)算,以及與其它編程語言的接口。
Visual Prolog包含一個(gè)全部使用Visual Prolog語言寫成的有效的開發(fā)環(huán)境,包含對話框、菜單、工具欄等編輯功能。
Visual Prolog與SQL數(shù)據(jù)庫系統(tǒng)、C++開發(fā)系統(tǒng)、以及Visual Basic、Delphi或Visual Age等編程語言一樣,也可以用來輕松地開發(fā)各種應(yīng)用。
Visual Prolog軟件的下載地址為:http://www.visual-prolog.com
Prolog語言特點(diǎn)
1. prolog程序沒有特定的運(yùn)行順序,其運(yùn)行順序是由電腦決定的,而不是編程序的人。從這個(gè)意義上來說,prolog程序不是真正意義上的程序。所謂程序就是按照一定的步驟運(yùn)行的計(jì)算機(jī)指令,而prolog程序的運(yùn)行步驟不由人來決定。它更像一種描述型的語言,用特定的方法描述一個(gè)問題,然后由電腦自動找到這個(gè)問題的答案。舉個(gè)極端的例子,你只需要把某個(gè)數(shù)學(xué)題目告訴它,它就會自動的找到答案,而不像使用其他的語言一樣,必須人工的編制出某種算法。
2. prolog程序中沒有if、when、case、for這樣的控制流程語句前面已經(jīng)說了,程序的運(yùn)行方式有電腦自己決定,當(dāng)然就用不到這些控制流程的語句了。通常情況下,程序員不需要了解程序的運(yùn)行過程,只需要注重程序的描述是否全面,不過prolog也提供了一些控制流程的方法,這些方法和其他語言中的方法有很大的區(qū)別,希望你在以后的學(xué)習(xí)當(dāng)中能夠融會貫通。
3. prolog程序和數(shù)據(jù)高度統(tǒng)一在prolog程序中,是很難分清楚哪些是程序,哪些是數(shù)據(jù)的。事實(shí)上,prolog中的所有東西都有相同的形式,也就是說數(shù)據(jù)就是程序,程序就是數(shù)據(jù)。舉一個(gè)其他語言的例子:如果想用c語言編寫一個(gè)計(jì)算某個(gè)數(shù)學(xué)表達(dá)式的程序很簡單(比如:a=2+5*4),因?yàn)檫@是一段程序。但是如果想編寫一個(gè)計(jì)算用戶輸入的表達(dá)式的值的程序就很困難了。因?yàn)橛脩糨斎氲氖且欢螖?shù)據(jù)(字符串),如果想讓c語言處理這個(gè)字符串,就需要很多方面的技術(shù)。則正是因?yàn)樵赾語言中,程序和數(shù)據(jù)是分開的。而在prolog就不存在這個(gè)問題,你甚至可以很輕松的編寫處理其它prolog程序的程序。
4. prolog程序?qū)嶋H上是一個(gè)智能數(shù)據(jù)庫prolog的原理就是關(guān)系數(shù)據(jù)庫,它是建立在關(guān)系數(shù)據(jù)庫的基礎(chǔ)上的。在以后的學(xué)習(xí)中你會發(fā)現(xiàn)它和SQL數(shù)據(jù)庫查詢語言有很多相似之處。使用prolog可以很方便的處理數(shù)據(jù)。5. 強(qiáng)大的遞歸功能在其它的語言中,你也許已經(jīng)接觸過遞歸程序了。遞歸是一種非常簡潔的方式,它能夠有效的解決許多難題。而在prolog中,遞歸的功能得到了充分的體現(xiàn),你甚至都會感到驚奇,遞歸居然有如此巨大的能力。
評論