第2章人工智能程序設(shè)計(jì)語(yǔ)言課件
,第二級(jí),第三級(jí),第四級(jí),第五級(jí),,*,頁(yè),*,第2章 人工智能程序設(shè)計(jì)語(yǔ)言,第2章 人工智能程序設(shè)計(jì)語(yǔ)言,,2.1 綜述,2.2 函數(shù)型程序設(shè)計(jì)語(yǔ)言LISP,2.3 邏輯型程序設(shè)計(jì)語(yǔ)言PROLOG,2.4 Turbo PROLOG程序設(shè)計(jì),,,1,頁(yè),第2章 人工智能程序設(shè)計(jì)語(yǔ)言 2.1 綜述1頁(yè),1,2.1 綜述,2.1.1 函數(shù)型語(yǔ)言,LISP是一種函數(shù)型程序設(shè)計(jì)語(yǔ)言。LISP程序由一組函數(shù)組成,程序的執(zhí)行過(guò)程就是一系列的函數(shù)調(diào)用和求值過(guò)程。但LISP還不是純函數(shù)型語(yǔ)言,準(zhǔn)確地講,它是基于λ--函數(shù)的語(yǔ)言。除LISP外,20世紀(jì)70年代J.Backus還提出了一種稱為FP的所謂純函數(shù)型程序設(shè)計(jì)語(yǔ)言。但該語(yǔ)言現(xiàn)在還限于理論研究,實(shí)現(xiàn)上還存在一定困難。,,,2,頁(yè),2.1 綜述 2.1.1 函數(shù)型語(yǔ)言2頁(yè),2,2.1.2 邏輯型語(yǔ)言,邏輯型程序設(shè)計(jì)語(yǔ)言起源于PROLOG(PROgramminginLOGic的縮寫(xiě))。PROLOG語(yǔ)言首先由法國(guó)馬塞大學(xué)的Colmerauer和它的研究小組于1972年研制成功,后來(lái)在歐洲得到進(jìn)一步發(fā)展。特別是1981年日本宣布要以PROLOG作為他們正在研制的新一代計(jì)算機(jī)——智能計(jì)算機(jī)的核心語(yǔ)言,更使PROLOG舉世矚目,迅速風(fēng)靡世界。,,3,頁(yè),2.1.2 邏輯型語(yǔ)言3頁(yè),3,PROLOG語(yǔ)言是以Horn子句邏輯為基礎(chǔ)的程序設(shè)計(jì)語(yǔ)言,它是目前最具代表性的一種邏輯程序設(shè)計(jì)語(yǔ)言。早期PROLOG版本都是解釋型的,1986年美國(guó)的Borland公司推出了編譯型PROLOG-TurboPROLOG,并很快成為PC機(jī)上流行的PROLOG?,F(xiàn)在運(yùn)行在Windows環(huán)境下的可視化編程語(yǔ)言VisualPROLOG也已面世。但這些PROLOG語(yǔ)言版本屬順序邏輯程序設(shè)計(jì)語(yǔ)言。,,4,頁(yè),PROLOG語(yǔ)言是以Horn子句邏,4,2.1.3 面向?qū)ο笳Z(yǔ)言,20世紀(jì)80年代以來(lái),面向?qū)ο蟪绦蛟O(shè)計(jì)(ObjectOrientedProgramming,簡(jiǎn)稱OOP)異軍突起,發(fā)展迅速,如今已日漸成熟,并越來(lái)越流行起來(lái)。面向?qū)ο蟪绦蛞云湫畔㈦[蔽、封裝、繼承、多態(tài)、消息傳遞等一系列優(yōu)良機(jī)制,大大改善了軟件的復(fù)雜性、模塊性、重用性和可維護(hù)性,有望從根本上解決軟件的生產(chǎn)效率問(wèn)題。另一方面,由于面向?qū)ο蟪绦蛟O(shè)計(jì)的類、對(duì)象、繼承等概念,與人工智能特別是知識(shí)表示和知識(shí)庫(kù)產(chǎn)生了天然的聯(lián)系。,,5,頁(yè),2.1.3 面向?qū)ο笳Z(yǔ)言5頁(yè),5,因而,現(xiàn)在面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言也成為一種人工智能程序設(shè)計(jì)語(yǔ)言,面向?qū)ο蟪绦蛟O(shè)計(jì)也被廣泛引入人工智能程序設(shè)計(jì),特別是知識(shí)工程、專家系統(tǒng)程序設(shè)計(jì)。面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言也種類繁多,已發(fā)展成為一個(gè)大家族。其中最純正、最具面向?qū)ο箫L(fēng)格的語(yǔ)言當(dāng)推Smalltalk,而最流行的OOP語(yǔ)言是C++,Java則是適于網(wǎng)絡(luò)(Internet)環(huán)境的一種面向?qū)ο笳Z(yǔ)言。,,,6,頁(yè),因而,現(xiàn)在面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言也成為,6,2.1.4 混合型語(yǔ)言,以上三種語(yǔ)言都各有所長(zhǎng),但也都有其不足之處。為了揚(yáng)長(zhǎng)避短,于是便出現(xiàn)了基于這三種語(yǔ)言的混合型語(yǔ)言。,1. 函數(shù)型與邏輯型相結(jié)合的語(yǔ)言,函數(shù)型與邏輯型語(yǔ)言的結(jié)合方式有耦合型和統(tǒng)一型兩類。統(tǒng)一型又可分為具有歸結(jié)語(yǔ)義的函數(shù)型語(yǔ)言和集成式語(yǔ)言兩個(gè)子類。,,,7,頁(yè),2.1.4 混合型語(yǔ)言7頁(yè),7,2. 函數(shù)型與面向?qū)ο笙嘟Y(jié)合的語(yǔ)言,在LISP語(yǔ)言的基礎(chǔ)上再擴(kuò)充面向?qū)ο髾C(jī)制而產(chǎn)生的語(yǔ)言,稱為函數(shù)型的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言(亦稱為面向?qū)ο蟮腖ISP)。,3. 邏輯型與面向?qū)ο笙嘟Y(jié)合的語(yǔ)言,,,8,頁(yè),2. 函數(shù)型與面向?qū)ο笙嘟Y(jié)合的語(yǔ)言8,8,2.2 函數(shù)型程序設(shè)計(jì)語(yǔ)言LISP,LISP語(yǔ)言的主要特點(diǎn)是:,(1) LISP程序由一組函數(shù)組成,程序的執(zhí)行過(guò)程是函數(shù)的調(diào)用過(guò)程。,(2) 程序和數(shù)據(jù)在形式上是相同的,即都是符號(hào)表達(dá)式,簡(jiǎn)稱為S─表達(dá)式。,(3) 遞歸是LISP語(yǔ)言的主要控制結(jié)構(gòu)。,(4) 程序以交互方式運(yùn)行。,,,9,頁(yè),2.2 函數(shù)型程序設(shè)計(jì)語(yǔ)言LISP,9,2.2.1 LISP的程序結(jié)構(gòu)與運(yùn)行機(jī)制,LISP的程序一般由函數(shù)的定義和函數(shù)的調(diào)用兩部分組成。其一般格式為:,(DEFUN(()),((〖WB〗)),…,(())),(),(),…,(),,,10,頁(yè),2.2.1 LISP的程序結(jié)構(gòu)與運(yùn)行機(jī)制 10頁(yè),10,其中的“DEFUN”是定義函數(shù)的關(guān)鍵字,“函數(shù)名”可以是系統(tǒng)的內(nèi)部函數(shù)(名),也可以是用戶用DEFUN定義的函數(shù)(名)。例如下面就是一個(gè)LISP程序。,(DEFUNHANOI(a b c n),(COND((=n1)(MOVE-DISK a c)),(T(HANOI a c b(-n1)),(MOVE-DISK a c),(HANOI b a c(-n1)))),,,,11,頁(yè),其中的“DEFUN”是定義函數(shù)的關(guān)鍵,11,(DEFUNMOVE-DISK(from to),(TERPRI),(PRINC″Move Disk From″),(PRINC from),(PRINC"To"),(PRINC to)),,(HANOI′a′b′c3),,,12,頁(yè),(DEFUNMOVE-DISK(from to)12頁(yè),12,2.2.2 S─表達(dá)式,從語(yǔ)法上看,LISP程序的基本單位是S─表達(dá)式。S─表達(dá)式又可分為原子和表兩大類。,原子(atom)是由字母和數(shù)字組成的字符串,是S─表達(dá)式的最簡(jiǎn)單情況。原子又可分為文字原子、串原子和數(shù)字原子三種。,文字原子又稱符號(hào)(symbol),是以字母開(kāi)頭的字母數(shù)字串,用來(lái)表示常量、變量和函數(shù)的名字等。例如:ABC、X1等。,,,13,頁(yè),2.2.2 S─表達(dá)式13頁(yè),13,串原子是由雙引號(hào)括起來(lái)的一串字符。如"LISP Program"。,數(shù)字原子由數(shù)字串組成。在其前面可以有符號(hào)“-”或“+”,中間可出現(xiàn)“.”,用來(lái)表示整數(shù)和實(shí)數(shù)。例如:256、-66、3.14159等。,,14,頁(yè),串原子是由雙引號(hào)括起來(lái)的一串字符。如,14,S─表達(dá)式可以遞歸定義如下:,(1) 原子是S─表達(dá)式。,(2) 若S1和S2是S─表達(dá)式,則(S1·S2)也是S─表達(dá)式。由定義,下面的式子都是S─表達(dá)式:,X2,123,(A·B),(A·(B·C)),,,15,頁(yè),S─表達(dá)式可以遞歸定義如下:15頁(yè),15,表(list)是LISP語(yǔ)言中最常用的數(shù)據(jù)類型,也是主要的處理對(duì)象。表是由圓括號(hào)括起來(lái)的由空格分開(kāi)的若干個(gè)元素的集合。,表的一般形式為:,(…),,16,頁(yè),表(list)是LISP語(yǔ)言中最常用,16,例如:,(X Y Z),(+12),(A (B C)),左括號(hào)后面的第一個(gè)元素稱為表頭,其余的元素組成的表稱為表尾。例如,對(duì)于表,(+12)的頭為+,尾為(12)。,特別地,元素個(gè)數(shù)為零的表為空表,記為()或NIL。,表是一種特殊的S─表達(dá)式,每一個(gè)表都對(duì)應(yīng)著一個(gè)S─表達(dá)式。二者的關(guān)系由下面的例子說(shuō)明。,,,17,頁(yè),例如:17頁(yè),17,表←————————————→S -表達(dá)式,(A) (A·NIL),(AB) (A·(B·NIL)),(ABC) (A·(B·(C·NIL))),((AB)CD) ((A·(B·NIL))·(C·(D·NIL))),可以看出,表的S─表達(dá)式的結(jié)構(gòu)實(shí)際是一棵二叉樹(shù)。,,18,頁(yè),表←————————————→S -表達(dá),18,2.2.3 基本函數(shù),LISP的函數(shù)都以表的形式出現(xiàn),并一律使用前綴表示方式,即表頭為函數(shù)名,并且每個(gè)函數(shù)都有一個(gè)返回值。LISP的函數(shù)可分為語(yǔ)言自身提供的內(nèi)部函數(shù)(稱為基本函數(shù)或系統(tǒng)函數(shù))和用戶自定義函數(shù)兩類?;竞瘮?shù)的種類有十多個(gè),下面僅給出其中主要的幾類。,1. 表處理函數(shù),表處理是LISP的主要特色,表處理的函數(shù)也很多,下面僅給出最常用的幾個(gè)。,,,,19,頁(yè),2.2.3 基本函數(shù)19頁(yè),19,1) CAR函數(shù),格式(CAR),其中CAR為函數(shù)名,它是一個(gè)保留字(下同)。,功能取出表中的表頭。,例如:(CAR′(LISP Language Program)),返回值為:LISP,,,20,頁(yè),1) CAR函數(shù)20頁(yè),20,2) CDR函數(shù),格式(CDR),功能取出表中的表尾。,例如:(CDR′(LISP Language Program)),返回值為:(Language Program),3) CONS函數(shù),格式(CONS),功能將S─表達(dá)式作為一個(gè)元素加到表中去,并作為所構(gòu)成新表中的第一個(gè)元素。,例如:(CONS′My′(LISP Language Program)),返回值為:(My LISP Language Program),,21,頁(yè),2) CDR函數(shù)21頁(yè),21,4) APPEND函數(shù),格式 (APPEND<表,1,><表,2,>…<表,n,>),功能 將n個(gè)表中的元素合并成一個(gè)新表。,例如:(APPEND′(TIGER LION)′(DOG CAT)),返回值為:(TIGER LION DOG CAT),,,22,頁(yè),4) APPEND函數(shù)22頁(yè),22,5) LIST函數(shù),格式(LIST…),功能把n個(gè)S─表達(dá)式作為元素括在一起構(gòu)成一張新表。,例如:(LIST′YELLOW′RED′BLUE),返回值為:(YELLOW RED BLUE),,23,頁(yè),5) LIST函數(shù)23頁(yè),23,2.算術(shù)函數(shù),LISP的算術(shù)表達(dá)式也是用函數(shù)表示的,稱為算術(shù)函數(shù)。下面我們僅舉例說(shuō)明。,(+25),表示2+5,返回值為7。,(-(*48)(/105))表示4×8-10/5,返回值為30。,,,24,頁(yè),2.算術(shù)函數(shù)24頁(yè),24,3. 求值與賦值函數(shù),在上面的函數(shù)中多次出現(xiàn)撇號(hào)′,它的意思是禁止求值。為什么要禁止求值呢?原來(lái),LISP總是試圖對(duì)一切S─表達(dá)式求值。表的值是通過(guò)函數(shù)運(yùn)算而得到的,原子的值則是通過(guò)賦值函數(shù)實(shí)現(xiàn)的。撇號(hào)′也是一個(gè)函數(shù),它實(shí)際是禁止求值函數(shù)QUOTE的簡(jiǎn)寫(xiě)形式。,賦值函數(shù)有多個(gè),其中SET函數(shù)是一個(gè)最基本的賦值函數(shù)。,,,25,頁(yè),3. 求值與賦值函數(shù)25頁(yè),25,格式(SET),功能把S─表達(dá)式賦給變量。,例如:,(SET′X′8); X 得到值8,(SET′Y′(a b c)); Y 得到值(a b c),(SET′Z(CDRY); Z 得到值(b c),另外,賦值函數(shù)還有SETQ、SETF(COMMON LISP),其功能是類似的。,,26,頁(yè),格式(SET),26,4. 謂詞函數(shù),返回值為邏輯值真或假的函數(shù)稱為謂詞函數(shù),簡(jiǎn)稱謂詞。LISP中真和假分別用T和NIL表示,當(dāng)函數(shù)的返回值為非NIL時(shí),也表示為真。另外,NIL也表示空表。謂詞函數(shù)也有多個(gè),下面我們僅給出常用的幾個(gè)。,,,,27,頁(yè),4. 謂詞函數(shù)27頁(yè),27,(1) 原子謂詞ATOM,格式 (ATOM),功能檢測(cè)其參數(shù)是否為原子,是則返回T,否則返回NIL。,例如:,(ATOM′a);返回T,(ATOM′(a b));返回NIL,,,28,頁(yè),(1) 原子謂詞ATOM28頁(yè),28,(2) 相等謂詞EQUAL,格式(EQUAL),功能判斷兩個(gè)參數(shù)是否邏輯相等。,例如:,(EQUAL′a′a); 返回T,(EQUAL′(a b)′(ac)); 返回NIL,(EQUAL′(a b)(CONS′a′(b))); 返回T,還有一種相等謂詞,其格式為:(EQ),但它只是用來(lái)判斷兩個(gè)原子是否相等。例如:(EQ′a′a),則返回T,,29,頁(yè),(2) 相等謂詞EQUAL29頁(yè),29,(3)判空表函數(shù)NULL,格式(NULL),功能判斷參數(shù)是否為空表,是則返回T,否則返回NIL。,,30,頁(yè),(3)判空表函數(shù)NULL30頁(yè),30,5.條件函數(shù),條件函數(shù)也稱分支函數(shù),類似于其他語(yǔ)言中的分支語(yǔ)句,其作用是控制程序的流程。,格式 (COND(P,1,e,1,),(P,2,e,2,), …,(P,n,e,n,)),其中P,i,(i=1,...,n)為謂詞,e,i,(i=1,...,n)為一個(gè)或多個(gè)S─表達(dá)式。,,,31,頁(yè),5.條件函數(shù)31頁(yè),31,功能如果P,1,為真,則COND函數(shù)的值為e,1,(當(dāng)e,1,為多個(gè)S─表達(dá)式時(shí),取最后一個(gè)S─表達(dá)式的值,下同)。否則,判斷P,2,,……直到某個(gè)P,i,真為止,然后將對(duì)應(yīng)的e,i,作為函數(shù)值。若沒(méi)有一個(gè)P,i,的值為非NIL,則COND的返回值為NIL。特別地,P,i,也可以為邏輯常量T,這時(shí)則對(duì)其對(duì)應(yīng)的各表達(dá)式求值,并把最后一個(gè)表達(dá)式的值作為COND的返回值。,,,32,頁(yè),功能如果P1為真,則COND函數(shù)的,32,例如:,(COND((NULL x)0),((ATOM x)1),((LISTP x)(LENGTH x))),其語(yǔ)義是,若x的值為NIL,則COND的返回值為0;若x為原子,則COND的返回值為1;若x的值為表,則COND的返回值為表的長(zhǎng)度。,,33,頁(yè),例如:33頁(yè),33,2.2.4 自定義函數(shù),基本函數(shù)是LISP提供的基本處理功能,要用LISP編程解決實(shí)際問(wèn)題,僅有基本函數(shù)還是不夠的,用戶還必須根據(jù)問(wèn)題的需要,利用基本函數(shù)自定義所需的函數(shù)。,自定義函數(shù)的格式為:,(DEFUN(),),,,34,頁(yè),2.2.4 自定義函數(shù)34頁(yè),34,其中函數(shù)體,又可能是用戶自定義的函數(shù)或LISP基本函數(shù)的某種組合。所以,一般來(lái)講,LISP自定義函數(shù)就是由其基本函數(shù)組合而成的。常用的組合方法有復(fù)和、分支、遞歸、迭代等。其中最具特色的構(gòu)造方法是遞歸。,,,35,頁(yè),其中函數(shù)體,又可能是用戶自定義的函數(shù),35,例2.1 定義求N!的LISP函數(shù)。,階乘的公式是,n!=n×(n-1)!,1!=1,0!=1,由此我們給出其LISP函數(shù)如下:,(DEFUNN!(n),(COND((=n 0)1),((=n 1)1),(T(* n(N!(- n 1)))))),,,36,頁(yè),例2.1 定義求N!的LISP函數(shù)。36頁(yè),36,可以看出,該函數(shù)的最后一行中又調(diào)用了它自己。所以,這個(gè)函數(shù)N!是遞歸定義的。,需說(shuō)明的是,一個(gè)函數(shù)是否能遞歸定義,要取決于以下兩條:,(1)函數(shù)的求值存在最簡(jiǎn)的情形,在這種情形下函數(shù)值是顯然的或已知的;,(2)該函數(shù)對(duì)于其參數(shù)的求值,可以歸結(jié)為對(duì)另一些參數(shù)的求值,而且后者比前者更容易求值,即使問(wèn)題朝最簡(jiǎn)情形逼近了一步。,,37,頁(yè),可以看出,該函數(shù)的最后一行中又調(diào)用了,37,2.2.5 程序舉例,例2.2 符號(hào)微分程序。,這里是指數(shù)學(xué)上的一元函數(shù)求導(dǎo)。我們用D(ex)表示數(shù)學(xué)上的de/dx,這里e為需求導(dǎo)的函數(shù)表達(dá)式,x為自變量。程序如下:,(DEFUND(ex),(COND((ATOM e)(IF(Eq e x)1 0)),(T(APPLY(D-RULE(CAR e)),(APPEND(CDR e)),(LIST x))))),,,38,頁(yè),2.2.5 程序舉例38頁(yè),38,其中D-RULE是一個(gè)獲取給定操作符的微分規(guī)則的LISP函數(shù)。微分規(guī)則的存放,是通過(guò)為相應(yīng)操作符建立d特性的方法完成的。D-RULE的定義為,(DEFUN D-RULE(operator),(GET operator′d)),其中操作符d的特性值需事先用SETF函數(shù)建立好。例如對(duì)于操作符加+和乘·,在數(shù)學(xué)上有,d(u+v)/dx=du/dx+dv/dx,d(u·v)/dx=v·du/dx+u·dv/dx ,,39,頁(yè),其中D-RULE是一個(gè)獲取給定操作符,39,用LISP表示就是,(SETF(GET′+′D)′(LAMBDA(u v,x)′(+,(Dux),(D v x)))),(SETF(GET′*′D)′(LAMBDA(u v,x)′(+(*,(Dux),v)(*,(D v x),u))))),,,40,頁(yè),用LISP表示就是40頁(yè),40,有了這些函數(shù),我們就可以用機(jī)器求符號(hào)微分了。例如,給出如下的函數(shù)調(diào)用(D′(+(*2x)(*x x))′x);即求一元函數(shù)2x+x2關(guān)于x的導(dǎo)函數(shù)則得到返回值為,(+(+(* 0 x)(* 1 2))(+(* 1 x)(*1 x))),即2+2x,結(jié)果正確。,,,41,頁(yè),有了這些函數(shù),我們就可以用機(jī)器求符號(hào),41,由于篇幅所限,上面我們對(duì)LISP語(yǔ)言僅做了簡(jiǎn)要介紹。需進(jìn)一步學(xué)習(xí)的讀者,可參閱有關(guān)專門(mén)著作。實(shí)際上,以此為入門(mén)和基礎(chǔ),讀者就可以參照某一具體的LISP語(yǔ)言資料,進(jìn)行LISP程序設(shè)計(jì)了。經(jīng)過(guò)30多年的發(fā)展,LISP的方言和版本也很多。目前比較流行的有INTERLISP、MACLISP、COMMONLISP。其中COMMONLISP將成為一種標(biāo)準(zhǔn),以統(tǒng)一各種LISP方言。,,42,頁(yè),由于篇幅所限,上面我們對(duì)LISP語(yǔ)言,42,2.3 邏輯型程序設(shè)計(jì)語(yǔ)言PROLOG,,2.3.1 PROLOG的語(yǔ)句,PROLOG語(yǔ)言只有三種語(yǔ)句,分別稱為事實(shí)、規(guī)則和問(wèn)題。,1.事實(shí)(fact),格式().,其中謂詞名是以小寫(xiě)英文字母打頭的字母、數(shù)字、下劃線等組成的字符串,項(xiàng)表是以逗號(hào)隔開(kāi)的項(xiàng)序列。,,43,頁(yè),2.3 邏輯型程序設(shè)計(jì)語(yǔ)言PROLOG 2.3.,43,,PROLOG中的項(xiàng)包括由常量或變量表示的簡(jiǎn)單對(duì)象以及函數(shù)、結(jié)構(gòu)和表等,即事實(shí)的形式是一個(gè)原子謂詞公式。,,例如:,student(john).,like( mary ,music).,就是PROLOG中的兩個(gè)合法事實(shí)。,,,44,頁(yè),PROLOG中的項(xiàng)包括由常量或變量表示的簡(jiǎn)單對(duì)象以及,44,功能 一般表示對(duì)象的性質(zhì)或關(guān)系。,例如上面的兩個(gè)事實(shí)就分別表示“約翰是學(xué)生”和“瑪麗喜歡音樂(lè)”。,作為特殊情形,一個(gè)事實(shí)也可以只有謂詞名而無(wú)參量。,例如:,abc.,repeat.,等也是允許的。,,45,頁(yè),功能 一般表示對(duì)象的性質(zhì)或關(guān)系。,45,2. 規(guī)則(rule),格式():-(){,()}.,其中“:-”號(hào)表示“if”(也可以直接寫(xiě)為if),其左部的謂詞是規(guī)則的結(jié)論(亦稱為頭),右部的謂詞是規(guī)則的前提(亦稱為體),{}表示零次或多次重復(fù),逗號(hào)表示and(邏輯與),即規(guī)則的形式是一個(gè)邏輯蘊(yùn)含式。,,,46,頁(yè),2. 規(guī)則(rule)46頁(yè),46,例如:,bird(X):-animal(X),has(X,feather).,grandfather(X,Y):-father(X,Z),father(Z,Y).,就是PROLOG的合法規(guī)則。,,47,頁(yè),例如:47頁(yè),47,功能一般表示對(duì)象間的因果關(guān)系、蘊(yùn)含關(guān)系或?qū)?yīng)關(guān)系。,例如,上面的第一條規(guī)則就表示“如果X是動(dòng)物,并且X有羽毛,則X是鳥(niǎo)”;第二條規(guī)則就表示“X是Y的祖父,如果存在Z,X是Z的父親并且Z又是Y的父親”。作為特殊情形,規(guī)則中的謂詞也可以只有謂詞名而無(wú)參量。,例如:,run:-start,step1(X),step2(X),end.,也是一個(gè)合法規(guī)則。,,48,頁(yè),功能一般表示對(duì)象間的因果關(guān)系、蘊(yùn)含關(guān),48,3.問(wèn)題(question),格式?-(){,()}.,例如:,?-student(john).,?-like(mary,X).,就是兩個(gè)合法的問(wèn)題。,功能 問(wèn)題表示用戶的詢問(wèn),它就是程序運(yùn)行的目標(biāo)。,,,49,頁(yè),3.問(wèn)題(question)49頁(yè),49,,2.3.2 PROLOG程序,PROLOG程序一般由一組事實(shí)、規(guī)則和問(wèn)題組成。問(wèn)題是程序執(zhí)行的起點(diǎn),稱為程序的目標(biāo)。,例如下面就是一個(gè)PROLOG程序。,likes(bell,sports).,likes(mary,music).,likes(mary,sports).,likes(jane ,smith).,friend(john,X):-likes(X,reading),likes(X,music).,friend(john,X):-likes(X,sports),likes(X,music).,?-friend(john,Y).,,50,頁(yè),2.3.2 PROLOG程序50頁(yè),50,可以看出,這個(gè)程序中有四條事實(shí)、兩條規(guī)則和一個(gè)問(wèn)題。其中事實(shí)、規(guī)則和問(wèn)題都分行書(shū)寫(xiě)。規(guī)則和事實(shí)可連續(xù)排列在一起,其順序可隨意安排,但同一謂詞名的事實(shí)或規(guī)則必須集中排列在一起。問(wèn)題不能與規(guī)則及事實(shí)排在一起,它作為程序的目標(biāo)要么單獨(dú)列出,要么在程序運(yùn)行時(shí)臨時(shí)給出。,,51,頁(yè),可以看出,這個(gè)程序中有四條事實(shí)、兩條,51,這個(gè)程序的事實(shí)描述了一些對(duì)象(包括人和事物)間的關(guān)系;而規(guī)則則描述了john交朋友的條件,即如果一個(gè)人喜歡讀書(shū)并且喜歡音樂(lè)(或者喜歡運(yùn)動(dòng)和喜歡音樂(lè)),則這個(gè)人就是john的朋友(當(dāng)然,這個(gè)規(guī)則也可看作是john朋友的定義);程序中的問(wèn)題是“約翰的朋友是誰(shuí)?”,當(dāng)然,PROLOG程序中的目標(biāo)可以變化,也可以含有多個(gè)語(yǔ)句(上例中只有一個(gè))。如果有多個(gè)語(yǔ)句,則這些語(yǔ)句稱為子目標(biāo)。例如對(duì)上面的程序,其問(wèn)題也可以是,,,52,頁(yè),這個(gè)程序的事實(shí)描述了一些對(duì)象(包括人,52,?-likes(mary,X).,或,?-likes(mary,music).,或,?-friend(X,Y).,或,?-likes(bell,sports),,likes(mary,music),,friend(john,X).,等等。當(dāng)然,對(duì)于不同的問(wèn)題,程序運(yùn)行的結(jié)果一般是不一樣的。,,53,頁(yè),?-likes(mary,X).53,53,2.3.3 PROLOG程序的運(yùn)行機(jī)理,既然PROLOG程序是基于Horn子句的邏輯程序,那么其運(yùn)行機(jī)理自然就是基于歸結(jié)原理的演繹推理(歸結(jié)原理將在第3章介紹)。下面我們就來(lái)看PROLOG程序是怎樣運(yùn)行的。,PROLOG程序的運(yùn)行是從目標(biāo)出發(fā),并不斷進(jìn)行匹配、合一、歸結(jié),有時(shí)還要回溯,直到目標(biāo)被完全滿足或不能滿足時(shí)為止。那么,什么是匹配、合一和回溯呢?下面我們就先介紹這幾個(gè)概念。,,,54,頁(yè),2.3.3 PROLOG程序的運(yùn)行機(jī)理54頁(yè),54,1. 自由變量與約束變量,PROLOG中稱無(wú)值的變量為自由變量,有值的變量為約束變量。一個(gè)變量取了某值就說(shuō)該變量約束于某值,或者說(shuō)該變量被某值所約束,或者說(shuō)該變量被某值實(shí)例化了。,,,55,頁(yè),1. 自由變量與約束變量55頁(yè),55,2. 匹配合一,兩個(gè)謂詞可匹配合一,是指兩個(gè)謂詞的名相同,參量項(xiàng)的個(gè)數(shù)相同,參量類型對(duì)應(yīng)相同,并且對(duì)應(yīng)參量項(xiàng)還滿足下列條件之一:,(1)如果兩個(gè)都是常量,則必須完全相同。,(2)如果兩個(gè)都是約束變量,則兩個(gè)約束值必須相同。,(3)如果其中一個(gè)是常量,一個(gè)是約束變量,則約束值與常量必須相同。,(4)至少有一個(gè)是自由變量。,,,56,頁(yè),2. 匹配合一56頁(yè),56,例如:下面的兩個(gè)謂詞,pre1("ob1","ob2",Z),pre1("ob1",X,Y),只有當(dāng)變量X被約束為"ob2",且Y、Z的約束值相同或者至少有一個(gè)是自由變量時(shí),它們才是匹配合一的。,,57,頁(yè),例如:下面的兩個(gè)謂詞57頁(yè),57,3. 回溯,所謂回溯,就是在程序運(yùn)行期間,當(dāng)某一個(gè)子目標(biāo)不能滿足(即謂詞匹配失?。r(shí),控制就返回到前一個(gè)已經(jīng)滿足的子目標(biāo)(如果存在的話),并撤消其有關(guān)變量的約束值,然后再使其重新滿足。成功后,再繼續(xù)滿足原子目標(biāo)。如果失敗的子目標(biāo)前再無(wú)子目標(biāo),則控制就返回到該子目標(biāo)的上一級(jí)目標(biāo)(即該子目標(biāo)謂詞所在規(guī)則的頭部)使它重新匹配?;厮菀彩荘ROLOG的一個(gè)重要機(jī)制。,,,58,頁(yè),3. 回溯58頁(yè),58,下面,我們介紹PROLOG程序的運(yùn)行過(guò)程。我們?nèi)砸陨厦娴某绦驗(yàn)槔?。設(shè)所給的詢問(wèn)是,?-friend(john,Y).(john和誰(shuí)是朋友?),則求解目標(biāo)為,friend(john,Y).,這時(shí),系統(tǒng)對(duì)程序進(jìn)行掃描,尋找能與目標(biāo)謂詞匹配合一的事實(shí)或規(guī)則頭部。顯然,程序中前面的四條事實(shí)均不能與目標(biāo)匹配,而第五個(gè)語(yǔ)句的左端即規(guī)則,,,59,頁(yè),下面,我們介紹PROLOG程序的運(yùn)行,59,friend(john,X):-likes(X,reading),likes(X,music).,的頭部可與目標(biāo)謂詞匹配合一。但由于這個(gè)語(yǔ)句又是一個(gè)規(guī)則,所以其結(jié)論要成立則必須其前提全部成立。于是,對(duì)原目標(biāo)的求解就轉(zhuǎn)化為對(duì)新目標(biāo),likes(X,reading),likes(X,music).,的求解。這實(shí)際是經(jīng)歸結(jié),規(guī)則頭部被消去,而目標(biāo)子句變?yōu)??-likes(X,reading),likes(X,music).,現(xiàn)在依次對(duì)子目標(biāo),likes(X,reading)和likes(X,music),求解。,,60,頁(yè),friend(john,X):-like,60,子目標(biāo)的求解過(guò)程與主目標(biāo)完全一樣,也是從頭對(duì)程序進(jìn)行掃描,不斷進(jìn)行測(cè)試和匹配合一等,直到匹配成功或掃描完整個(gè)程序?yàn)橹埂?梢钥闯觯瑢?duì)第一個(gè)子目標(biāo)like(X,reading)的求解因無(wú)可匹配的事實(shí)和規(guī)則而立即失敗,進(jìn)而導(dǎo)致規(guī)則,friend(john,X):-likes(X,reading),likes(X,music).,的整體失敗。于是,剛才的子目標(biāo),likes(X,reading)和likes(X,music),,61,頁(yè),子目標(biāo)的求解過(guò)程與主目標(biāo)完全一樣,,61,被撤消,系統(tǒng)又回溯到原目標(biāo)friend(john,X)。這時(shí),系統(tǒng)從該目標(biāo)剛才的匹配語(yǔ)句處(即第五句)向下繼續(xù)掃描程序中的子句,試圖重新使原目標(biāo)匹配,結(jié)果發(fā)現(xiàn)第六條語(yǔ)句的左部,即規(guī)則,friend(john,X):-likes(X,sports),likes(X,music).,的頭部可與目標(biāo)為謂詞匹配。但由于這個(gè)語(yǔ)句又是一個(gè)規(guī)則,于是,這時(shí)對(duì)原目標(biāo)的求解,就又轉(zhuǎn)化為依次對(duì)子目標(biāo),likes(X,sports)和likes(X,music),,,62,頁(yè),被撤消,系統(tǒng)又回溯到原目標(biāo)frien,62,的求解。這次子目標(biāo)likes(X,sports)與程序中的事實(shí)立即匹配成功,且變量X被約束為bell。于是,系統(tǒng)便接著求解第二個(gè)子目標(biāo)。由于變量X已被約束,所以這時(shí)第二個(gè)子目標(biāo)實(shí)際上已變成了,likes(bell,music).,由于程序中不存在事實(shí)likes(bell,music),所以該目標(biāo)的求解失敗。于是,系統(tǒng)就放棄這個(gè)子目標(biāo),并使變量X恢復(fù)為自由變量,然后回溯到第一個(gè)子目標(biāo),重新對(duì)它進(jìn)行求解。由于系統(tǒng)已經(jīng)記住了剛才已同第一子目標(biāo)謂詞匹配過(guò)的事實(shí)的位置,所以重新求解時(shí),便從下一個(gè)事實(shí)開(kāi)始測(cè)試。,,63,頁(yè),的求解。這次子目標(biāo)likes(X,sports)與,63,易見(jiàn),當(dāng)測(cè)試到程序中第三個(gè)事實(shí)時(shí),第一個(gè)子目標(biāo)便求解成功,且變量X被約束為mary。這樣,第二個(gè)子目標(biāo)也就變成了,likes(mary,music).,再對(duì)它進(jìn)行求解。這次很快成功。,由于兩個(gè)子目標(biāo)都求解成功,所以,原目標(biāo)friend(john,Y)也成功,且變量Y被約束為mary(由Y與X的合一關(guān)系)。于是,系統(tǒng)回答: Y=mary,程序運(yùn)行結(jié)束。,上面只給出了問(wèn)題的一個(gè)解。如果需要和可能的話,系統(tǒng)還可把john的所有朋友都找出來(lái)。我們把上述程序的運(yùn)行過(guò)程再用示意圖(圖2─1)描述如下:,,,64,頁(yè),易見(jiàn),當(dāng)測(cè)試到程序中第三個(gè)事實(shí)時(shí),第,64,圖2─1 PROLOG程序運(yùn)行機(jī)理示例,,65,頁(yè),圖2─1 PROLOG程序運(yùn)行機(jī)理示例 65頁(yè),65,上述程序的運(yùn)行是一個(gè)通過(guò)推理實(shí)現(xiàn)的求值過(guò)程。我們也可以使它變?yōu)樽C明過(guò)程。,例如,把上述程序中的詢問(wèn)改為,friend(john,mary),則系統(tǒng)會(huì)回答:yes,若將詢問(wèn)改為:,friend(john,smith),則系統(tǒng)會(huì)回答:no,,,66,頁(yè),上述程序的運(yùn)行是一個(gè)通過(guò)推理實(shí)現(xiàn)的求值,66,從上述程序的運(yùn)行過(guò)程可以看出,PROLOG程序的執(zhí)行過(guò)程是一個(gè)(歸結(jié))演繹推理過(guò)程。其特點(diǎn)是:推理方式為反向推理,控制策略是深度優(yōu)先,且有回溯機(jī)制。其具體實(shí)現(xiàn)方法是:匹配子句的順序是自上而下;子目標(biāo)選擇順序是從左向右;(歸結(jié)后)產(chǎn)生的新子目標(biāo)總是插入被消去的目標(biāo)處(即目標(biāo)隊(duì)列的左部)。PROLOG的這種歸結(jié)演繹方法被稱為SLD(LinearresolutionwithSelectionfunctionforDefiniteclause)歸結(jié),或SLD反駁-消解法。SLD歸結(jié)就是PROLOG程序的運(yùn)行機(jī)理,它也就是所謂的PROLOG語(yǔ)言的過(guò)程性語(yǔ)義。,,,67,頁(yè),從上述程序的運(yùn)行過(guò)程可以看出,PRO,67,2.4 Turbo PROLOG程序設(shè)計(jì),2.4.1 Turbo PROLOG的程序結(jié)構(gòu),一個(gè)完整的Turbo PROLOG(2.0版)程序一般包括常量段、領(lǐng)域段、數(shù)據(jù)庫(kù)段、謂詞段、目標(biāo)段和子句段等六個(gè)部分。各段以其相應(yīng)的關(guān)鍵字constants、domains、database、predicates、goal和clauses開(kāi)頭加以標(biāo)識(shí)。:,,68,頁(yè),2.4 Turbo PROLOG程序設(shè)計(jì) 2.,68,另外,在程序的首部還可以設(shè)置指示編譯程序執(zhí)行特定任務(wù)的編譯指令;在程序的任何位置都可設(shè)置注解??傊?,一個(gè)完整的TurboPROLOG(2.0版)程序的結(jié)構(gòu)如下,/**/,,constants,,domains,,database,,,69,頁(yè),另外,在程序的首部還可以設(shè)置指示編譯,69,,predicates,,goal,,clauses,,,,70,頁(yè),70頁(yè),70,當(dāng)然,一個(gè)程序不一定要包括上述所有段,但一個(gè)程序至少要有一個(gè)predicates段、clauses段和goal段。在大多數(shù)情形中,還需要一個(gè)domains段,以說(shuō)明表、復(fù)合結(jié)構(gòu)及用戶自定義的域名。如若省略goal段,則可在程序運(yùn)行時(shí)臨時(shí)給出,但這僅當(dāng)在開(kāi)發(fā)環(huán)境中運(yùn)行程序時(shí)方可給出。若要生成一個(gè)獨(dú)立的可執(zhí)行文件,則在程序中必須包含goal段。另一方面,一個(gè)程序也只能有一個(gè)goal段。,,,71,頁(yè),當(dāng)然,一個(gè)程序不一定要包括上述所有段,71,,例2.3 如果把上節(jié)中的程序要作為T(mén)urboPROLOG程序,則應(yīng)改寫(xiě)為:,/*例子程序-1*/,DOMAINS,name=symbol,PREDICATES,likes(name,name).,friend(name,name),GOAL,friend(john,Y),write(″Y=″,Y).,,,72,頁(yè),例2.3 如果把上節(jié)中的程序要作,72,CLAUSES,likes(bell,sports).,likes(mary,music).,likes(mary,sports).,likes(jane,smith).,friend(john,X):-likes(X,sports),likes(X,music).,friend(john,X):-likes(X,reading),likes(X,music).,,73,頁(yè),CLAUSES73頁(yè),73,結(jié)合上例,我們?cè)賹?duì)上述程序結(jié)構(gòu)中的幾個(gè)主要段的內(nèi)容和作用加以說(shuō)明(其余段在后面用到時(shí)再作說(shuō)明):,領(lǐng)域段該段說(shuō)明程序謂詞中所有參量項(xiàng)所屬的領(lǐng)域。領(lǐng)域的說(shuō)明可能會(huì)出現(xiàn)多層說(shuō)明,直到最終說(shuō)明到Turbo PROLOG的標(biāo)準(zhǔn)領(lǐng)域?yàn)橹?如上例所示)。Turbo PROLOG的標(biāo)準(zhǔn)領(lǐng)域即標(biāo)準(zhǔn)數(shù)據(jù)類型,包括整數(shù)、實(shí)數(shù)、符號(hào)、串和符號(hào)等,其具體說(shuō)明如表2.1所示。,,,74,頁(yè),結(jié)合上例,我們?cè)賹?duì)上述程序結(jié)構(gòu)中的幾,74,表2.1 Turbo PROLOG的標(biāo)準(zhǔn)領(lǐng)域,,75,頁(yè),表2.1 Turbo PROLOG的標(biāo)準(zhǔn)領(lǐng)域 75頁(yè),75,謂詞段該段說(shuō)明程序中用到的謂詞的名和參量項(xiàng)的名(但Turbo PROLOG的內(nèi)部謂詞無(wú)須說(shuō)明)。,子句段該段是Turbo PROLOG程序的核心,程序中的所有事實(shí)和規(guī)則就放在這里,系統(tǒng)在試圖滿足程序的目標(biāo)時(shí)就對(duì)它們進(jìn)行操作。,,,76,頁(yè),謂詞段該段說(shuō)明程序中用到的謂詞的名和,76,,目標(biāo)段,該段是放置程序目標(biāo)的地方。目標(biāo)段可以只有一個(gè)目標(biāo)謂詞,例如上面的例子中就只有一個(gè)目標(biāo)謂詞;也可以含有多個(gè)目標(biāo)謂詞,如:,goal,readint(X),Y=X+3,write("Y=",Y).,就有三個(gè)目標(biāo)謂詞。這種目標(biāo)稱為復(fù)合目標(biāo)。,另外,一般稱程序目標(biāo)段中的目標(biāo)為內(nèi)部目標(biāo),而稱在程序運(yùn)行時(shí)臨時(shí)給出的目標(biāo)為外部目標(biāo)。,,77,頁(yè),目標(biāo)段 該段是放置程序目標(biāo)的地方。目,77,2.4.2 Turbo PROLOG的數(shù)據(jù)與表達(dá)式,1.領(lǐng)域,1)標(biāo)準(zhǔn)領(lǐng)域,Turbo PROLOG中不定義變量的類型,只說(shuō)明謂詞中各個(gè)項(xiàng)的取值域。,2)結(jié)構(gòu),結(jié)構(gòu)也稱復(fù)合對(duì)象,它是TurboPROLOG謂詞中的一種特殊的參量項(xiàng)(類似于謂詞邏輯中的函數(shù))。,,78,頁(yè),2.4.2 Turbo PROLOG的數(shù)據(jù)與表達(dá)式78,78,結(jié)構(gòu)的一般形式為,(),其中函子及參量的標(biāo)識(shí)符與謂詞相同。注意,這意味著結(jié)構(gòu)中還可包含結(jié)構(gòu)。所以,復(fù)合對(duì)象可表達(dá)樹(shù)形數(shù)據(jù)結(jié)構(gòu)。例如下面的謂詞,likes(Tom,sports(football,basketball,table-tennis)).,中的,sports(football,basketball,table-tennis),就是一個(gè)結(jié)構(gòu),即復(fù)合對(duì)象。,,79,頁(yè),結(jié)構(gòu)的一般形式為79頁(yè),79,又如:,person("張華",student("西安石油學(xué)院"),address("中國(guó)","陜西","西安")).,reading("王宏",book("人工智能技術(shù)基礎(chǔ)教程","西安電子科技大學(xué)出版社")).,friend(father("Li"),father("Zhao")).,這幾個(gè)謂詞中都有復(fù)合對(duì)象。,,80,頁(yè),又如:80頁(yè),80,復(fù)合對(duì)象在程序中的說(shuō)明,需分層進(jìn)行。例如,對(duì)于上面的謂詞,likes(Tom,sports(football,basketball,table-tennis)).,在程序中可說(shuō)明如下:,domains,name=symbol,sy=symbol,sp=sports(sy,sy,sy),predicates,likes(name,sp),,,81,頁(yè),復(fù)合對(duì)象在程序中的說(shuō)明,需分層進(jìn)行。,81,3) 表,表的一般形式是,[x,1,,x,2,,…,x,n,],其中x,i,(i=1,2,…,n)為PROLOG的項(xiàng),一般要求同一個(gè)表的元素必須屬于同一領(lǐng)域。,不含任何元素的表稱為空表,記為[]。例如下面就是一些合法的表。,,82,頁(yè),3) 表82頁(yè),82,[1,2,3],[apple,orange,banana,grape,cane],["PROLOG","MAENS","PROGRAMMING","in logic"],[[a,b],[c,d],[e]],[],表的最大特點(diǎn)是其元素個(gè)數(shù)可在程序運(yùn)行期間動(dòng)態(tài)變化。表的元素也可以是結(jié)構(gòu)或表,且這時(shí)其元素可以屬于不同領(lǐng)域。,,83,頁(yè),[1,2,3]83頁(yè),83,例如:,[name("Li Ming"),age(20),sex(male),address(xi an)],[[1,2],[3,4,5],[6,7]],都是合法的表。后一個(gè)例子說(shuō)明,表也可以嵌套。,實(shí)際上,表是一種特殊的結(jié)構(gòu)。它是遞歸結(jié)構(gòu)的另一種表達(dá)形式。這個(gè)結(jié)構(gòu)的函數(shù)名取決于具體的PROLOG版本。這里我們就用一個(gè)圓點(diǎn)來(lái)表示。,,84,頁(yè),例如:84頁(yè),84,下面就是一些這樣的結(jié)構(gòu),及它們的表表示形式:,結(jié)構(gòu)形式 表形式,·(a,[]) [a],·(a,·(b,[])) [a,b],·(a,·(b,·(c,[]))) [a,b,c],,,85,頁(yè),下面就是一些這樣的結(jié)構(gòu)85頁(yè),85,表的說(shuō)明方法是在其組成元素的說(shuō)明符后加一個(gè)星號(hào)*。如:,domains,lists=string*,predicates,pl(lists),就說(shuō)明謂詞pl中的項(xiàng)lists是一個(gè)由串string組成的表。,,86,頁(yè),表的說(shuō)明方法是在其組成元素的說(shuō)明符后,86,對(duì)于由結(jié)構(gòu)組成的表,至少得分三步說(shuō)明。例如對(duì)于下面謂詞p中的表,p([name("Liming"),age(20)]),則需這樣說(shuō)明:,domains,rec=seg*,seg=name(string);age(integer),predicates,p(rec),,,87,頁(yè),對(duì)于由結(jié)構(gòu)組成的表,至少得分三步說(shuō)明,87,2. 常量與變量,由上面的領(lǐng)域可知,Turbo PROLOG的常量有整數(shù)、實(shí)數(shù)、字符、串、符號(hào)、結(jié)構(gòu)、表和文件這八種數(shù)據(jù)類型。同理,Turbo PROLOG的變量也就有這八種取值。另外,變量名要求必須是以大寫(xiě)字母或下劃線開(kāi)頭的字母、數(shù)字和下劃線序列,或者只有一個(gè)下劃線。這后一種變量稱為無(wú)名變量。,,,88,頁(yè),2. 常量與變量88頁(yè),88,3. 算術(shù)表達(dá)式,Turbo PROLOG提供了五種最基本的算術(shù)運(yùn)算:加、減、乘、除和取模,相應(yīng)運(yùn)算符號(hào)為+、-、*、/、mod。這五種運(yùn)算的順序?yàn)椋?、/、mod優(yōu)先于+、-。同級(jí)從左到右按順序運(yùn)算,括號(hào)優(yōu)先。算術(shù)表達(dá)式的形式與數(shù)學(xué)中的形式基本一樣。例如:,數(shù)學(xué)中的算術(shù)表達(dá)式 PROLOG中的算術(shù)表達(dá)式,x+y z X+Y*Z,ab-c/d A*B-C/D,u mod v U mod V(表示求U除,以V所得的余數(shù)),,,89,頁(yè),3. 算術(shù)表達(dá)式89頁(yè),89,即是說(shuō),Turbo PROLOG中算術(shù)表達(dá)式采用通常數(shù)學(xué)中使用的中綴形式。這種算術(shù)表達(dá)式為PROLOG的一種異體結(jié)構(gòu),若以PROLOG的結(jié)構(gòu)形式來(lái)表示,則它們應(yīng)為,+(X,*(Y,Z)),-(*(A,B),/(C,D)),mod(U,V),所以,運(yùn)算符+、-、*、/和mod實(shí)際也就是PROLOG內(nèi)部定義好了的函數(shù)符。,,,90,頁(yè),即是說(shuō),Turbo PROLOG中,90,在Turbo PROLOG程序中,如果一個(gè)算術(shù)表達(dá)式中的變?cè)勘粚?shí)例化(即被約束)的話,則這個(gè)算術(shù)表達(dá)式的值就會(huì)被求出。求出的值可用來(lái)實(shí)例化某變量,也可用來(lái)同其他數(shù)量進(jìn)行比較,用一個(gè)算術(shù)表達(dá)式的值實(shí)例化一個(gè)變量的方法是用謂詞“is”或“=”來(lái)實(shí)現(xiàn)。例如:,Y is X+5,或,Y=X+5 (*),,91,頁(yè),在Turbo PROLOG程序中,,91,就使變量Y實(shí)例化為X+5的值(當(dāng)然X也必須經(jīng)已被某值實(shí)例化),可以看出,這里對(duì)變量Y的實(shí)例化方法類似于其他高級(jí)程序語(yǔ)言中的“賦值”,但又不同于賦值。例如,在PROLOG中下面的式子是錯(cuò)誤的:,X=X+1,,,92,頁(yè),就使變量Y實(shí)例化為X+5的值(當(dāng)然X,92,4. 關(guān)系表達(dá)式,Turbo PROLOG提供了六種常用的關(guān)系運(yùn)算,即小于、小于或等于、等于、大于、大于或等于和不等于,其運(yùn)算符依次為,,>=,,Turbo PROLOG的關(guān)系表達(dá)式的形式和數(shù)學(xué)中的也基本一樣,例如:,數(shù)學(xué)中的關(guān)系式 Turbo PROLOG中的關(guān)系式,X+1≥Y X+1>=Y,X≠Y XY,,,93,頁(yè),4. 關(guān)系表達(dá)式93頁(yè),93,即是說(shuō),Turbo PROLOG中的關(guān)系式也用中綴形式。當(dāng)然,這種關(guān)系式為T(mén)urbo PROLOG中的異體原子。若按Turbo PROLOG中的原子形式來(lái)表示,則上面的兩個(gè)例子為,>=(X+1,Y)和(X,Y),所以上述六種關(guān)系運(yùn)算符,實(shí)際上也就是Turbo PROLOG內(nèi)部定義好了的六個(gè)謂詞。這六個(gè)關(guān)系運(yùn)算符可用來(lái)比較兩個(gè)算術(shù)表達(dá)式的大小。,,94,頁(yè),即是說(shuō),Turbo PROLOG中的,94,所以上述六種關(guān)系運(yùn)算符,實(shí)際上也就是Turbo PROLOG內(nèi)部定義好了的六個(gè)謂詞。這六個(gè)關(guān)系運(yùn)算符可用來(lái)比較兩個(gè)算術(shù)表達(dá)式的大小。例如:,brother(Name1,Name2):-person(Name1,man,Age1),,person(Name2,man,Age2),,mother(Z,Name1),mother(Z,Name2),,Age1>Age2.,需要說(shuō)明的是,“=”的用法比較特殊,它既可以表示比較,也可以表示約束值,即使在同一個(gè)規(guī)則中的同一個(gè)“=”也是如此。,,95,頁(yè),所以上述六種關(guān)系運(yùn)算符,實(shí)際上也就是,95,例如:,p(X,Y,Z):-Z=X+Y.,當(dāng)變量X、Y、Z全部被實(shí)例化時(shí),“=”就是比較符。如:對(duì)于問(wèn)題,Goal:p(3,5,8).,機(jī)器回答:yes。而對(duì)于,Goal:p(3,5,7).,機(jī)器回答:no。,即這時(shí)機(jī)器把X+Y的值,與Z的值進(jìn)行比較。,,96,頁(yè),例如:96頁(yè),96,但當(dāng)X,Y被實(shí)例化,為Z未被實(shí)例化時(shí),“=”,號(hào)就是約束符。如:,Goal:p(3,5,Z).,機(jī)器回答:Z=8,這時(shí),機(jī)器使Z實(shí)例化為X+Y的結(jié)果。,,,97,頁(yè),但當(dāng)X,Y被實(shí)例化,為Z未被實(shí)例化時(shí),“=”97頁(yè),97,2.4.3 輸入與輸出,雖然PROLOG能自動(dòng)輸出目標(biāo)子句中的變量的值,但這種輸出功能必定有限,往往不能滿足實(shí)際需要;另一方面,對(duì)通常大多數(shù)的程序來(lái)說(shuō),運(yùn)行時(shí)從鍵盤(pán)上輸入有關(guān)數(shù)據(jù)或信息也是必不可少的。為此每種具體PROLOG一般都提供專門(mén)的輸入和輸出謂詞,供用戶直接調(diào)用。例如,下面就是TorboPROLOG的幾種輸入輸出謂詞:,,98,頁(yè),2.4.3 輸入與輸出98頁(yè),98,(1) readln (X)。,這個(gè)謂詞的功能是從鍵盤(pán)上讀取一個(gè)字符串,然后約束給變量X。,(2) readint (X)。,這個(gè)謂詞的功能是從鍵盤(pán)上讀取一個(gè)整數(shù),然后約束給變量X,如果鍵盤(pán)上打入的不是整數(shù)則該謂詞失敗。,(3) readreal (X)。,這個(gè)謂詞的功能是從鍵盤(pán)上讀取一個(gè)實(shí)數(shù),然后約束給變量X,如果鍵盤(pán)上打入的不是實(shí)數(shù)則該謂詞失敗。,,,,99,頁(yè),(1) readln (X)。99頁(yè),99,(4) readchar(X)。,這個(gè)謂詞的功能是從鍵盤(pán)上讀取一個(gè)字符,然后約束給變量X,如果鍵盤(pán)上打入的不是單個(gè)字符,則該謂詞失敗。,(5) write(X,1,,X,2,,… X,n,)。,這個(gè)謂詞的功能是把項(xiàng)X,i,(i=1,2,…n)的值顯示在屏幕上或者打印在紙上,當(dāng)有某個(gè)X,i,未實(shí)例化時(shí),該謂詞失敗,其中的X,i,可以是變量,也可以是字符串或數(shù)字。,,100,頁(yè),(4) readchar(X)。10,100,(6) nl換行謂詞。它使后面的輸出(如果有的話)另起一行。另外,利用write的輸出項(xiàng)"\n"也同樣可起換行作用。例如:,write("name"), n l ,write("age"),與,write("name","\n","age"),的效果完全一樣。,,,101,頁(yè),(6) nl換行謂詞。它使后面的輸出(,101,例2.4用上面的輸入輸出謂詞編寫(xiě)一個(gè)簡(jiǎn)單的學(xué)生成績(jī)數(shù)據(jù)庫(kù)查詢程序。,PREDICATES,student(integer,string,real),grade,GOAL,grade.,CLAUSES,,,102,頁(yè),例2.4用上面的輸入輸出謂詞編寫(xiě)一個(gè),102,student(1,"張三",90.2).,student(2,"李四",95.5).,student(3,"王五",96.4).,grade:-write("請(qǐng)輸入姓名:"),readln(Name),,student(-,Name,Score),,nl,write(Name,"的成績(jī)是",Score).,grade:-write(“對(duì)不起,找不到這個(gè)學(xué)生!”).,grade:-write("對(duì)不起,找不到這個(gè)學(xué)生!").,下面是程序運(yùn)行時(shí)的屏幕顯示:,請(qǐng)輸入姓名: 王五,王五的成績(jī)是96.4。,,103,頁(yè),student(1,"張三",90.2).103頁(yè),103,2.4.4 分支與循環(huán),PROLOG中并無(wú)專門(mén)的分支和循環(huán)語(yǔ)句,但PROLOG也可實(shí)現(xiàn)分支和循環(huán)程序結(jié)構(gòu)。,1.分支,對(duì)于通常的IF-THEN-ELSE分支結(jié)構(gòu),PROLOG可用兩條同頭的并列規(guī)則實(shí)現(xiàn)。例如,將,IF x>0THENx:=1,ELSE x:=0,,,104,頁(yè),2.4.4 分支與循環(huán)104頁(yè),104,用PROLOG實(shí)現(xiàn)則是,Br :-x>0,x=1.,Br :-x=0.,類似地,對(duì)于多分支,可以用多條規(guī)則實(shí)現(xiàn)。例如:,Br :-x>0,x=1.,Br :-x=0,x=0.,Br :-x<0,x=-1.,,,105,頁(yè),用PROLOG實(shí)現(xiàn)則是105頁(yè),105,2.循環(huán),PROLOG可以實(shí)現(xiàn)計(jì)循環(huán)次數(shù)的FOR循環(huán),也可以實(shí)現(xiàn)不計(jì)循環(huán)次數(shù)的DO循環(huán)。,例如下面的程序段就實(shí)現(xiàn)了循環(huán),它使得write語(yǔ)句重復(fù)執(zhí)行了三次,而打印輸出了三個(gè)學(xué)生的記錄。,student(1,"張三",90.2).,student(2,"李四",95.5).,student(3,"王五",96.4).,print:-student(Number,Name,Score),,write(Number,Name,Score),n l ,,Number=3.,,,106,頁(yè),2.循環(huán)106頁(yè),106,這個(gè)例子可以看作是計(jì)數(shù)循環(huán)。當(dāng)然,也可以通過(guò)設(shè)置計(jì)數(shù)器而實(shí)現(xiàn)真正的計(jì)數(shù)循環(huán)。下面的程序段實(shí)現(xiàn)的則是不計(jì)數(shù)的DO循環(huán)。,student(1,"張三",90.2).,student(2,"李四",95.5).,student(3,"王五",96.4).,print:-student(Number,Name,Score),,write(Number,Name,Score),nl,,fail.,print:-.,,107,頁(yè),這個(gè)例子可以看作是計(jì)數(shù)循環(huán)。當(dāng)然,也,107,這個(gè)程序段中的fail是一個(gè)內(nèi)部謂詞,它的語(yǔ)義是恒失敗。這個(gè)程序段與上面的程序段的差別僅在于把原來(lái)用計(jì)數(shù)器(或標(biāo)記數(shù))循環(huán)控制語(yǔ)句變成了恒失敗謂詞fail,另外再增加了一個(gè)print語(yǔ)句。增加這個(gè)語(yǔ)句的目的是為程序設(shè)置一個(gè)出口。因?yàn)閒ail是恒失敗,下面若無(wú)出口的話,將引起print本身的失敗。進(jìn)而又會(huì)導(dǎo)致程序中的連鎖失敗。,,108,頁(yè),這個(gè)程序段中的fail是一個(gè)內(nèi)部謂詞,108,2.4.5 動(dòng)態(tài)數(shù)據(jù)庫(kù),動(dòng)態(tài)數(shù)據(jù)庫(kù)就是在內(nèi)存中實(shí)現(xiàn)的動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。它由事實(shí)組成,程序可以對(duì)它操作,所以在程序運(yùn)行期間它可以動(dòng)態(tài)變化。Turbo PROLOG提供了三個(gè)動(dòng)態(tài)數(shù)據(jù)庫(kù)操作謂詞:,asserta ().,assertz ().,retract ().,,109,頁(yè),2.4.5 動(dòng)態(tài)數(shù)據(jù)庫(kù)109頁(yè),109,其中fact表示事實(shí)。這三個(gè)謂詞的功能是:,asserta ().把fact插入當(dāng)前動(dòng)態(tài)數(shù)據(jù)庫(kù)中的同名謂詞的事實(shí)之前;,assertz ().把fact插入當(dāng)前動(dòng)態(tài)數(shù)據(jù)庫(kù)中的同名謂詞的事實(shí)之后;,retract().把fact從當(dāng)前動(dòng)態(tài)數(shù)據(jù)庫(kù)中刪除。,,110,頁(yè),其中fact表示事實(shí)。這三個(gè)謂詞的功能,110,例如語(yǔ)句,asserta(student(20,"李明",90.5)).,將在內(nèi)存的謂詞名為student的事實(shí)前插入一個(gè)新事實(shí):,student(20,"李明