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