關於Prolog編程語言

寫在前面:
    很久之前我曾經用java和c#實現邏輯語句的自動推理。當時,對整個計算機編程語言的發展歷史並不清楚,也不知道曾經出現過哪些牛掰的語言以及對某些特定領域的影響。還曾經妄想,自己搞個編譯器,發明一門屬於自己的邏輯編程語言,甚至連語言的規則框架都自己做了設想。萬萬沒想到,我的天真震驚了我自己。在深入編程語言的發展過程之後,發現早在幾十年前,在計算機技術發展的早期就已經有大神搞了一個適用於自然語言和人工智能專家系統編程的邏輯編程語言---Prolog。而那個年代,互聯網還沒有出現。當我看到Prolog的語法,我了個擦,簡直就是看自己發明的語言似的。
    此文用來簡單介紹Prolog的一些簡單信息,以及當時對這門編程語言的具體應用。以後有機會的話,希望自己可以抽出時間,把各種編程語言的出現和發展歷程,整理一下,給大家科普科普。以便大家從發展的觀點來看編程語言的進化過程。也希望自己可以通過編程語言的發展過程,窺見計算智能最核心的本質。

關於Prolog的歷史:
    Prolog這個名字是源自用邏輯編程的英文詞縮寫:Pro-gramming in Log-ic。 在20世紀60年代末的時候Aix-Marseille大學的Alain Colmerauer和 Philippe Roussel在Robert Kowalski的工作基礎上(霍恩子句的過程化描述),開始了一門新的編程語言的創立。最終在1972年,正式宣佈創立Prolog編程語言。該編程語言建立在一階謂詞邏輯的基礎之上,有強烈的數學風格,和我們目前比較熟悉的面向對象的思路相比,有非常明顯的差異。在20世紀6,70年代的時候,整個世界的計算機和數學專家大量的集中在類似的工作上。
    當時的歐洲,Prolog毫無疑問是最流行的語言,而在北美大陸,則有另一種函數式語言幾乎壟斷了整個人工智能領域的編程---Lisp,而這個語言的創立人則是鼎鼎大名人工智能之父約翰·麥卡錫。自1972年Prolog發佈以後,分支出多種Prolog的方言。最主要的兩種方言爲Edinburgh和Aix-Marseille。最早的Prolog解釋器由Roussel建造,而第一個Prolog編譯器則是 David Warren編寫的。而在此之後,Prolog被全世界大範圍的使用,日本政府曾經爲了建造智能計算機而用Prolog來開發ICOT第五代計算機系統。在早期的機器智能研究領域,Prolog曾經是主要的開發工具。80年代Borland開發的Turbo Prolog,進一步普及了Prolog的使用。1995年確定了ISOProlog標準。
    雖然Prolog的後續發展並沒有達到當時創立它時候的目標,但是卻影響了後世很多不同的語言。而在其中目前最爲著名的估計就是在大數據和併發領域牛掰掰的Erlang了吧。連名字的命名規則都是和Prolog一個媽生的。

關於Prolog的特點:
    這一部分呢,我只能簡單說說,等我把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中,遞歸的功能得到了充分的體現,你甚至都會感到驚奇,遞歸居然有如此巨大的能力。
    

關於Prolog的一些問題:
    在看Prolog相關資料的時候,有一個很重要的特徵始終貫穿其中。在用Prolog進行編程的時候,編程者並不需要對程序的內部流程和細節進行關注,具體的操作由計算機自行處理。而在其內部,Prolog本身使用的深度優先的遍歷算法,還有着運行效率問題。而我們在用c進行編程的時候,最爲熟悉的概念就是大O的概念。算法的複雜度,本身也成爲一門專門的學科,很多時候,算法本身對很多程序的運行具有實質性的影響。
    其實具體的我也不知道,反正近期會把Prolog深入一下,看看能不能搞個demo出來耍耍。

寫在最後:

    最後我要放一個經典的哲學問題,使用Prolog進行的求解程序,感覺刁刁的。
    
    Russell's paradox
    /* tstpx.pl */
    /* 羅素佯謬(羅素悖論)(皇帝新腦 羅傑.彭羅斯 p.120)會導致不停機(使得gprolog產生 stack overflow) */
    /* 在gprolog下之編譯,例:gplc --min-size tstpx.pl */
    q:- px(_)./* 找尋任何可使 px() rule 成立的方式 */
    px(1):-\+ px(1)./* 規定此rule不成立。 i.e. 此rule爲假時此rule才爲真 (佯謬)*/
    :-initialization(q)./* 啓動q處goal */

-------------------------------------------------------------------------------------------------------------------------------------------------------------
碼字不易,與君共勉!







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章