版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-PROLOG程序設(shè)計(jì)語(yǔ)言

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

關(guān)于Prolog

Prolog(Programing in Logic)的第一個(gè)系統(tǒng)是1972年開(kāi)發(fā)的。它是一種典型的邏輯型語(yǔ)言,其理論基礎(chǔ)是一階謂詞邏輯,重點(diǎn)在于對(duì)象問(wèn)的邏輯描述,因而又稱描述性語(yǔ)言。編寫(xiě)的程序是由說(shuō)明程序應(yīng)達(dá)到目標(biāo)的邏輯說(shuō)明組成的,程序員只需說(shuō)明達(dá)到程序目標(biāo)的邏輯方法,而不必說(shuō)明程序執(zhí)行的步驟,所以又有人把Prolog稱為面向目標(biāo)的語(yǔ)言。Prolog程序設(shè)計(jì)不是描述計(jì)算機(jī)“如何做”,而是描述計(jì)算機(jī)要“做什么”,至于如何做,則由Prolog語(yǔ)言自己完成。這說(shuō)明Prolog語(yǔ)言在向自動(dòng)求解方面邁進(jìn)了一大步。Prolog的基本機(jī)制是匹配、遞歸定義、自動(dòng)回溯和控制回溯。程序接近于自然語(yǔ)言、文法簡(jiǎn)捷、邏輯性強(qiáng)、易寫(xiě)易讀、便于學(xué)習(xí)使用、易于正確性證明。

日本在開(kāi)展第五代計(jì)算機(jī)計(jì)劃時(shí),曾經(jīng)把Prolog語(yǔ)言作為核心語(yǔ)言使用。目前Prolog語(yǔ)言已廣泛應(yīng)用于關(guān)系數(shù)據(jù)庫(kù)、抽象問(wèn)題求解、數(shù)理邏輯、符號(hào)處理、定理證明、自然語(yǔ)言理解、專家系統(tǒng)以及人工智能的許多領(lǐng)域。在國(guó)內(nèi)流行的Prolog語(yǔ)言主要版本有:純Prolog、Prolog II、Arity Prolog、Wisdom Pmlog、Micro Prolog、PDC(Turbo,Visual) Prolog、SWI Prolog、B-Prolog、Dec一10 Prolog、MP Pmlog、PDP一11 UNIX Prolog和Quintus Prolog等。

Turbo PrologTurbo Prolog由美國(guó)Prolog開(kāi)發(fā)中心(Pmlog Development Center,PDC)1986年開(kāi)發(fā)成功,Borland公司對(duì)外發(fā)行,其1.0、2.0和2.1版本取名為T(mén)urbo Pmlog,主要為IBM PC系列及其兼容微機(jī)研制的一種編譯型Prolog系統(tǒng),也可在MS—DOS環(huán)境下運(yùn)行。

PDC Prolog1990年后,PDC推出新的版本,更名為PDC Prolog 3.0和3.2。它把運(yùn)行環(huán)境擴(kuò)展到OS/2操作系統(tǒng),并且向全世界發(fā)行。它的主要特點(diǎn)是:

(1)速度快,內(nèi)存要求小。編譯及運(yùn)行速度都很快,編譯時(shí)采用累積的方式,把整個(gè)源代碼編譯成機(jī)器代碼,可產(chǎn)生與Pascal、C語(yǔ)言非常的緊湊代碼,編譯中發(fā)現(xiàn)錯(cuò)誤能自動(dòng)回到編輯狀態(tài),指出出錯(cuò)位置,修改后原來(lái)已編譯好的部分基本不動(dòng),效率大為提高。

(2)用戶界面友好。集編輯、編譯、鏈接、調(diào)試等功能為一體,按多窗口菜單和系統(tǒng)提示,邊上機(jī)邊學(xué)習(xí),可方便快速地進(jìn)行應(yīng)用開(kāi)發(fā),能自動(dòng)連接生成目標(biāo)文件,同時(shí)能對(duì)源代碼進(jìn)行跟蹤調(diào)試。

(3)內(nèi)部謂詞豐富獨(dú)特,提供了強(qiáng)有力的外部數(shù)據(jù)庫(kù)系統(tǒng),用屏幕、窗口、顏色、聲音、圖形、絕對(duì)地址存取、數(shù)據(jù)端口等控制,編寫(xiě)出圖文并茂的程序。

(4)具有強(qiáng)大的圖形功能。支持與Turbo C和Turbo Pascal同樣的圖形功能。

(5)集成式、模塊化的程序開(kāi)發(fā)環(huán)境,可將多個(gè)程序模塊聯(lián)結(jié)成一個(gè)可執(zhí)行的程序,能與C、Pascal、Fortran、匯編、dBASE III等語(yǔ)言實(shí)現(xiàn)自然和諧的聯(lián)結(jié),可與DOS交互??僧a(chǎn)生能從其他語(yǔ)言調(diào)用Prolog的子程序,也可從Prolog中調(diào)用其他語(yǔ)言產(chǎn)生的子程序。

(6)提供了一個(gè)用PDC Prolog編寫(xiě)的Prolog解釋起源代碼。用戶可以用它研究Prolog的內(nèi)部機(jī)制,并創(chuàng)建自己的專用編程語(yǔ)言、推理機(jī)、專家系統(tǒng)外殼或程序接口。

Visual PrologVisual Prolog是基于Prolog語(yǔ)言的可視化集成開(kāi)發(fā)環(huán)境,是PDC推出的基于Windows環(huán)境的智能化編程工具,也是一個(gè)可以制作界面的Prolog,已經(jīng)推出版本4.x、5.X、6.X和7.x。它的基本Prolog語(yǔ)句同DOS下的Turbo Prolog相似,曾使用過(guò)Turbo Prolog的人很容易就能上手,原DOS下的Prolog源程序也很容易移植。這個(gè)Prolog版本需要對(duì)謂詞以及數(shù)據(jù)進(jìn)行聲明,就像c語(yǔ)言一樣。因此在使用的時(shí)候比較復(fù)雜,不過(guò)更加適合編制較大的程序。

Visual Prolog為編譯型執(zhí)行,運(yùn)行速度比解釋型Prolog快,源程序可編譯為獨(dú)立執(zhí)行的可執(zhí)行程序,也可發(fā)布為動(dòng)態(tài)鏈接庫(kù)供VB、VC、Delphi等調(diào)用,為開(kāi)發(fā)者提供更靈活的組合開(kāi)發(fā)方式。

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ǔ)言的接口。1

基本語(yǔ)句Prolog語(yǔ)言只有3種基本語(yǔ)句:事實(shí)、規(guī)則和問(wèn)題。與命令式編程語(yǔ)言相比,Prolog程序中的問(wèn)題相當(dāng)于主程序,規(guī)則相當(dāng)于子程序,而其事實(shí)相當(dāng)于數(shù)據(jù)。

事實(shí)事實(shí)用來(lái)說(shuō)明問(wèn)題中已知對(duì)象之間的性質(zhì)和關(guān)系。

例如:likes(1ibai,book). /*喜歡(李白,書(shū))*/

以上語(yǔ)句是一個(gè)名為like的關(guān)系,表示對(duì)象libai(李白)和book(書(shū))之間有喜歡的關(guān)系。末尾“.”表示句子結(jié)束。以上語(yǔ)句對(duì)計(jì)算機(jī)來(lái)說(shuō)沒(méi)有真正的含義,完全可以用“ai(lb,shu).”來(lái)表達(dá)這個(gè)關(guān)系,只要自己清楚ai表示愛(ài),lb表示李白,shu表示書(shū)就可以了。

規(guī)則規(guī)則用來(lái)描述事實(shí)之間的依賴關(guān)系,用來(lái)表示對(duì)象之間的因果關(guān)系、蘊(yùn)含關(guān)系或?qū)?yīng)關(guān)系。規(guī)則左邊表示結(jié)論,右邊表示條件。

例如:bird(X):一animal(X),has(X,feather)./*鳥(niǎo)(X):一動(dòng)物(X),有(X,羽毛).*/

以上語(yǔ)句表示,凡是動(dòng)物并且有羽毛,那么它就是鳥(niǎo)。“:一”表示“如果”(if)的意思,可用它來(lái)定義規(guī)則,它的左邊是規(guī)則的結(jié)論,右邊是規(guī)則的前提?!?,”表示而且(and)的意思,用來(lái)分隔兩個(gè)句子。

問(wèn)題問(wèn)題表示用戶的詢問(wèn),它是程序運(yùn)行的目標(biāo),問(wèn)題是程序執(zhí)行的起點(diǎn)。問(wèn)題可以寫(xiě)在程序內(nèi)部,但是不能與事實(shí)及規(guī)則排在一起,它需要在程序中單獨(dú)列出。問(wèn)題也可以在程序運(yùn)行時(shí)臨時(shí)給出,運(yùn)行Prolog程序后,就可以詢問(wèn)有關(guān)問(wèn)題的答案了。

例如:?-student(libai). /* 李白是學(xué)生嗎?*/2

特點(diǎn)Prolog語(yǔ)言的語(yǔ)法結(jié)構(gòu)相當(dāng)簡(jiǎn)單,但描述能力很強(qiáng)。例如,當(dāng)事實(shí)和規(guī)則描述的是某一學(xué)科公理.那么問(wèn)題就是待證的命題;當(dāng)事實(shí)和規(guī)則描述的是某些數(shù)據(jù)和關(guān)系,那么問(wèn)題就是數(shù)據(jù)查詢語(yǔ)句;當(dāng)事實(shí)和規(guī)則描述的是某些狀態(tài)變化規(guī)律,那么問(wèn)題就是目標(biāo)狀態(tài)。因此,Prolog語(yǔ)言是一種智能型程序設(shè)計(jì)語(yǔ)言。

Prolog程序沒(méi)有特定的運(yùn)行順序,程序運(yùn)行順序完全按照數(shù)理邏輯推導(dǎo)(消解法)的方式進(jìn)行,而不是由編程序的人決定。Prolog是一種描述型語(yǔ)言,用特定的方法描述一個(gè)問(wèn)題,然后由計(jì)算機(jī)自動(dòng)找到這個(gè)問(wèn)題的答案。舉個(gè)極端的例子.當(dāng)建立好事實(shí)和規(guī)則后,只需要把某個(gè)問(wèn)題告訴它.它就會(huì)自動(dòng)查找答案。

Prolog程序中沒(méi)有if、case、for這樣的控制流程語(yǔ)句。通常情況下,程序員不需要了解程序的運(yùn)行過(guò)程,只需要注重程序的描述是否全面。不過(guò)Prolog也提供了一些控制程序流程的方法,這些方法和其他語(yǔ)言中的方法有很大區(qū)別。

在Prolog程序巾,程序和數(shù)據(jù)高度統(tǒng)一,很難分清楚哪些是程序,哪些是數(shù)據(jù)。事實(shí)上,Prolog中所有東西都有相同的形式,也就是說(shuō)數(shù)據(jù)就是程序,程序就是數(shù)據(jù)。例如,用c語(yǔ)言編寫(xiě)一個(gè)計(jì)算某個(gè)數(shù)學(xué)表達(dá)式的程序很簡(jiǎn)單(如:a=2+54);但是如果編寫(xiě)一個(gè)C程序.由用戶輸入表達(dá)式,由程序計(jì)算出表達(dá)式的值,這樣的程序編制很困難。因?yàn)橛脩糨斎氲氖且欢螖?shù)據(jù)(字符串),如果想讓C語(yǔ)言處理這個(gè)字符串,就需要多方面的技術(shù),因?yàn)樵贑語(yǔ)言中,程序和數(shù)據(jù)是分開(kāi)的。

Prolog具有智能數(shù)據(jù)庫(kù)功能,它的工作原理與關(guān)系數(shù)據(jù)庫(kù)基本相同,它是建立在關(guān)系數(shù)據(jù)庫(kù)的基礎(chǔ)上的.它與SQL數(shù)據(jù)庫(kù)查詢語(yǔ)言有很多相似之處。

遞歸是一種非常簡(jiǎn)潔的方式,它能夠有效地解決許多難題。在Prolog程序語(yǔ)言中,遞歸功能得到了充分體現(xiàn)。2