在計算機科學的可計算理論中,人們已經證明遞歸函數和圖靈機具有相同的(也就是理論上最高的)計算能力,通常指的是自然數集上的遞歸函數。這個結論對符號集上的遞歸函數也成立。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結構為基礎,加進邏輯程序成分的)。