版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第三章第三章 智能控制語言智能控制語言prolog簡介簡介10:011第三章第三章 智能控制語言智能控制語言prolog簡介簡介10:012 PrologProlog初體驗初體驗 什么是什么是PrologProlog 為什么要用為什么要用PrologProlog編程編程 PrologProlog的特點的特點 PrologProlog入門入門 什么是什么是Prolog?Prolog (Programming in LOGic的縮寫)是一種邏輯編程的縮寫)是一種邏輯編程語言。它建立在語言。它建立在 邏輯學邏輯學 的理論基礎之上,的理論基礎之上, 最初被運用于最初被運用于 自自然語言然語言 等研究領
2、域?,F(xiàn)在它已被廣泛的應用在等研究領域?,F(xiàn)在它已被廣泛的應用在 人工智能人工智能 的研的研究中,它可以用來建造究中,它可以用來建造 專家系統(tǒng)專家系統(tǒng) 、自然語言理解、智能知識、自然語言理解、智能知識庫等。同時它對一些通常的應用程序的編寫也很有幫助。使庫等。同時它對一些通常的應用程序的編寫也很有幫助。使用它能夠比其他的語言更快速地開發(fā)程序,因為它的編程方用它能夠比其他的語言更快速地開發(fā)程序,因為它的編程方法更象是使用邏輯的語言來描述程序。法更象是使用邏輯的語言來描述程序。 10:013 什么是什么是PrologProlog Prolog語言最早由語言最早由Aix-Marseille大學的大學的Al
3、ain Colmerauer與與Phillipe Roussel等人于等人于60年代末研究開年代末研究開發(fā)。發(fā)。 第一個第一個Prolog編譯器是編譯器是David Warren編寫的。編寫的。 Prolog一直在北美和歐洲被廣泛使用。日本政府曾經為了一直在北美和歐洲被廣泛使用。日本政府曾經為了建造智能計算機而用建造智能計算機而用Prolog來開發(fā)第五代計算機系統(tǒng)。來開發(fā)第五代計算機系統(tǒng)。 80年代年代Borland開發(fā)的開發(fā)的Turbo Prolog,進一步普及了,進一步普及了Prolog的使用。的使用。 1995年確定了年確定了ISO Prolog標準。標準。 10:014 什么是什么是P
4、rologProlog比如一群年輕人正在戀愛,每個人都有自己心中所追求的對象: 張學友愛王菲張學友愛王菲張學友愛周慧敏張學友愛周慧敏王菲愛謝廷峰王菲愛謝廷峰周慧敏愛張學友周慧敏愛張學友謝廷峰愛王菲謝廷峰愛王菲謝廷峰愛周慧敏謝廷峰愛周慧敏劉德華愛周慧敏劉德華愛周慧敏我們說兩個年輕人要互相都喜愛,他們就算是一對情侶,那么上面的誰和誰是情侶呢?10:015 PrologProlog初體驗初體驗愛(張學友,王菲).那么我們如何用prolog語言實現(xiàn)呢?“張學友愛王菲”是一條已知的事實,用prolog語言來表達就是:10:016 PrologProlog初體驗初體驗l注意注意1 1:這里是為了閱讀方便才
5、使用漢字的,真正的prolog是不允許使用除了基本字符以外字符的,也就是說,上面的句子必須寫成love(zhangxueyou,wanfei).,電腦才能夠真正的理解 l注意注意2 2:最末尾的“.”一定不能掉,它表示一個句子結束。 l注意注意3 3:上面詞匯對于電腦來說并沒有真正的含義,所以我們完全可以用 ai(zxy,wf).來表達這個關系,更進一步,我們甚至可以用 xxx(a,b).來表達,只要你自己心里清楚xxx表示愛,a表示張學友,b表示王菲就可以了。 l注意注意4 4:張學友和王菲的順序也沒有特別的規(guī)定,你完全可以把他們換個位置:愛(王菲,張學友). 只要你心里清楚它表達的意思就行
6、了,而以后都遵循這種被愛的人在前面的順序,就不會出錯。 10:017 PrologProlog初體驗初體驗Prolog初體驗初體驗那么情侶的概念怎么定義呢?也很簡單!:-在prolog中表示“如果”的意思,我們使用它來定義規(guī)則。上面這句話的意思就是,某人甲和某人乙是情侶的規(guī)則就是:某人甲愛某人乙,并且某人乙愛某人甲。 當然為了能夠讓電腦運行,這個句子要改為英文的:情侶(某人甲,某人乙):-愛(某人甲,某人乙),愛(某人乙,某人甲).lovers(X,Y):-love(X,Y),love(Y,X).注意:在prolog中以小寫字符開頭的字符串代表確知的事物,比如love表示愛這種關系,而zhan
7、gxueyou表示張學友。而以大寫字母開頭的字符串表示未確定的事物,翻譯成漢語就是某某 10:018完整的可運行的prolog程序如下:love(zhangxueyou,wangfei).love(zhangxueyou,zhouhuimin).love(wangfei,xietingfeng).love(zhouhuimin,zhangxueyou).love(xietingfeng,wangfei).love(xietingfeng,zhouhuimin).love(liudehua,zhouhuimin).lovers(X,Y):-love(X,Y),love(Y,X).完整的prolo
8、g程序是有事實和規(guī)則組成的。事實用來儲存一些數(shù)據(jù),而規(guī)則用來儲存某種可以推理出來的關系。10:019 PrologProlog初體驗初體驗把上面的程序調入prolog解釋器然后就可以對以上的程序進行詢問。prolog解釋器的提示符號為“?-”,用戶只需要在在這個提示符后面輸入相應的句子就可以了。讓我們來看第一個詢問:?-love(zhangxueyou,wangfei).事實上我們的詢問完全和程序中的第一條事實一樣,這個詢問是“是非”詢問,也就是說電腦回答的答案是yes或者no。上面的詢問的含義是:就你所知,張學友愛王菲么?由于我們的程序中間有這樣的事實,所以解釋器將回答是yes.10:011
9、0 PrologProlog初體驗初體驗如果我們問:?-love(zhangxueyou,liudehua). 解釋器將回答 No.因為它沒有發(fā)現(xiàn)love(zhangxueyou,liudehua).這個事實10:0111 PrologProlog初體驗初體驗在詢問中還可以使用大寫字母代表未知的事物,讓解釋器找到答案。例如:?-love(zhangxueyou,X).這句話詢問的是:張學友都喜歡那些人。解釋器將給出答案:X=wangfei;X=zhouhuimin;no.注意注意1 1:上面的兩個“;”是人工輸入的,當解釋器找到一個答案之后,它將這個答案輸出,并且等待用戶的進一步輸入,如果用戶
10、輸入“;”,解釋器將繼續(xù)尋找其他的答案,如果輸入的是別的符號,解釋器將終止查詢。 注意注意2 2:最后那個no.是因為,系統(tǒng)在輸出了zhouhuimin這個答案以后,用戶輸入“;”, 表示還想知道其他的答案,而解釋器又找不到其他的答案了,于是輸出no.來終止查詢。 10:0112 PrologProlog初體驗初體驗我們再看一個例子:?-love(X,zhouhuimin).X=zhangxueyou;X=xietingfeng;X=liudehua;no. 10:0113 PrologProlog初體驗初體驗在上面的詢問中,我們只涉及到對事實的查詢,下面我們來看規(guī)則的用法?- lovers(
11、X,Y).X = zhangxueyou Y = zhouhuimin ;X = wangfeiY = xietingfeng ;X = zhouhuiminY = zhangxueyou ;X = xietingfengY = wangfei ;no我們看到lovers(X,Y).找出了系統(tǒng)中所有的戀人。不過每對戀人被顯示了兩次,這是因為prolog是考慮順序的,也就是說lovers(a,b).和lovers(b,a).并不等價。 10:0114 PrologProlog初體驗初體驗再看一個例子: ?- lovers(wangfei,Y). Y = xietingfeng;no 同樣是lov
12、ers,根據(jù)其參數(shù)不同,功能也不同,這也是prolog的一個大特點 10:0115 PrologProlog初體驗初體驗最后讓我們編寫一個尋找情敵的規(guī)則來結束這次初體驗。rival_in_love(X,Y):-love(X,Z),not(love(Z,X),love(Z,Y).這段程序可以理解為:Y是X的情敵的條件是:X喜歡Z(代表某個人),而Z不喜歡X,而Y是Z喜歡的人10:0116 PrologProlog初體驗初體驗尋找情敵?- rival_in_love(X,Y). X = zhangxueyouY = xietingfeng ;X = xietingfengY = zhangxuey
13、ou ;X = liudehuaY = zhangxueyou ; no10:0117 PrologProlog初體驗初體驗理論上來說使用理論上來說使用c c語言可以編制任何種類的程序,甚語言可以編制任何種類的程序,甚至連至連prologprolog語言都是使用語言都是使用c c語言編寫的。不過對于急語言編寫的。不過對于急于開發(fā)應用程序的用戶,最關心的是如何最經濟最有于開發(fā)應用程序的用戶,最關心的是如何最經濟最有效率的開發(fā)程序,效率的開發(fā)程序,prologprolog提供了一個選擇的余地。提供了一個選擇的余地。prologprolog很適合于開發(fā)有關人工智能方面的程序,例很適合于開發(fā)有關人工智
14、能方面的程序,例如:專家系統(tǒng)、自然語言理解、定理證明以及許多如:專家系統(tǒng)、自然語言理解、定理證明以及許多智力游戲。曾經有人預言智力游戲。曾經有人預言prologprolog將成為下一代計算將成為下一代計算機的主要語言,雖然這個夢想目前還很難實現(xiàn),不機的主要語言,雖然這個夢想目前還很難實現(xiàn),不過世界上已經有許多過世界上已經有許多prologprolog的應用實例了。之所以的應用實例了。之所以大多數(shù)人都不了解它,是因為它的應用范圍比較特大多數(shù)人都不了解它,是因為它的應用范圍比較特殊而已。殊而已。10:0118 為什么要用為什么要用PrologProlog編程編程2022-1-8Prolog語言(或
15、者系統(tǒng))是以一階謂詞邏輯的為語法,以Robinson的為工具,加上而形成的人工智能通用程序設計語言 PrologProlog的特點的特點2022-1-8Horn子句集消解原理深度優(yōu)先Prolog系統(tǒng) PrologProlog的特點的特點 prolog程序沒有特定的運行順序,其運行順序是由程序沒有特定的運行順序,其運行順序是由電腦決定的,而不是編程序的人。電腦決定的,而不是編程序的人。從這個意義上來說,從這個意義上來說,prologprolog程序不是真正意義上的程序不是真正意義上的程序。所謂程序就是按照一定的步驟運行的計算機程序。所謂程序就是按照一定的步驟運行的計算機指令,而指令,而prolo
16、gprolog程序的運行步驟不由人來決定。它程序的運行步驟不由人來決定。它更像一種描述型的語言,用特定的方法描述一個問更像一種描述型的語言,用特定的方法描述一個問題,然后由電腦自動找到這個問題的答案。舉個極題,然后由電腦自動找到這個問題的答案。舉個極端的例子,你只需要把某個數(shù)學題目告訴它,它就端的例子,你只需要把某個數(shù)學題目告訴它,它就會自動的找到答案,而不像使用其他的語言一樣,會自動的找到答案,而不像使用其他的語言一樣,必須人工的編制出某種算法。必須人工的編制出某種算法。10:0121 PrologProlog的特點的特點 prolog程序中沒有程序中沒有if、when、case、for這樣
17、的這樣的控制流程語句??刂屏鞒陶Z句。 既然程序的運行方式有電腦自己決定,當然就用既然程序的運行方式有電腦自己決定,當然就用不到這些控制流程的語句了。通常情況下,程序不到這些控制流程的語句了。通常情況下,程序員不需要了解程序的運行過程,只需要注重程序員不需要了解程序的運行過程,只需要注重程序的描述是否全面,不過的描述是否全面,不過prologprolog也提供了一些控制也提供了一些控制流程的方法,這些方法和其他語言中的方法有很流程的方法,這些方法和其他語言中的方法有很大的區(qū)別。大的區(qū)別。10:0122 PrologProlog的特點的特點 prologprolog程序和數(shù)據(jù)高度統(tǒng)一。程序和數(shù)據(jù)高
18、度統(tǒng)一。 在在prologprolog程序中,是很難分清楚哪些是程序,哪些程序中,是很難分清楚哪些是程序,哪些是數(shù)據(jù)的。事實上,是數(shù)據(jù)的。事實上,prologprolog中的所有東西都有相中的所有東西都有相同的形式,也就是說數(shù)據(jù)就是程序,程序就是數(shù)同的形式,也就是說數(shù)據(jù)就是程序,程序就是數(shù)據(jù)。據(jù)。 舉一個其他語言的例子:如果想用舉一個其他語言的例子:如果想用c c語言編寫一個語言編寫一個計算某個數(shù)學表達式的程序很簡單計算某個數(shù)學表達式的程序很簡單( (比如:比如:a=2+54)a=2+54),因為這是一段程序。但是如果想編寫一,因為這是一段程序。但是如果想編寫一個計算用戶輸入的表達式的值的程序
19、就很困難了。個計算用戶輸入的表達式的值的程序就很困難了。因為用戶輸入的是一段數(shù)據(jù)因為用戶輸入的是一段數(shù)據(jù)( (字符串字符串) ),如果想讓,如果想讓c c語言處理這個字符串,就需要很多方面的技術。語言處理這個字符串,就需要很多方面的技術。則正是因為在則正是因為在c c語言中,程序和數(shù)據(jù)是分開的。而語言中,程序和數(shù)據(jù)是分開的。而在在prologprolog就不存在這個問題,你甚至可以很輕松就不存在這個問題,你甚至可以很輕松的編寫處理其它的編寫處理其它prologprolog程序的程序。程序的程序。 10:0123 PrologProlog的特點的特點 prolog程序實際上是一個智能數(shù)據(jù)庫程序實
20、際上是一個智能數(shù)據(jù)庫 prologprolog的原理就是關系數(shù)據(jù)庫,它是建立在關系的原理就是關系數(shù)據(jù)庫,它是建立在關系數(shù)據(jù)庫的基礎上的。使用數(shù)據(jù)庫的基礎上的。使用prologprolog可以很方便的處可以很方便的處理數(shù)據(jù)。理數(shù)據(jù)。10:0124 PrologProlog的特點的特點 強大的遞歸功能強大的遞歸功能 遞歸是一種非常簡潔的方式,它能夠有效的解決遞歸是一種非常簡潔的方式,它能夠有效的解決許多難題。在許多難題。在prologprolog中,遞歸的功能得到了充分中,遞歸的功能得到了充分的體現(xiàn)。的體現(xiàn)。10:0125 PrologProlog的特點的特點進入進入prolog世界世界進入進入p
21、rolog世界世界n和其他的語言一樣,最好的學習方法是實踐。本課程將使用Prolog的解釋器來向大家介紹幾個具體的應用程序的編寫過程。 l首先你應該擁有一個Prolog的解釋器,你可以在互聯(lián)網(wǎng)上找到它。關于解釋器的使用,請參閱相關的使用說明文檔,建議使用amzi prolog 或者swi prolog來運行課程中出現(xiàn)的程序。進入進入prolog世界世界l 邏輯編程邏輯編程什么叫邏輯編程?也許你還沒有一個整體的印象,還是讓我們首先來研究一個簡單的例子吧。運用經典的邏輯理論,我們可以說“所有的人(person)都屬于人類(moral)”,如果用Prolog的語言來說就是“對于所有的X,只要X是一個
22、人,它就屬于人類?!眒ortal(X):-person(X). 同樣,我們還可以加入一些簡單的事實,比如:蘇格拉底(socrates)是一個人。person(socrates).有了這兩條邏輯聲明,Prolog就可以判斷蘇格拉底是不是屬于人類。在Prolog的Listener中鍵入如下的命令:?-mortal(socrates). (此句中的?-是Listener的提示符,本句表示詢問蘇格拉底是不是屬于人類。)Linstener將給出答案:yes進入進入prolog世界世界l 邏輯編程邏輯編程什么叫邏輯編程?也許你還沒有一個整體的印象,還是讓我們首先來研究一個簡單的例子吧。運用經典的邏輯理論,
23、我們可以說“所有的人(person)都屬于人類(moral)”,如果用Prolog的語言來說就是“對于所有的X,只要X是一個人,它就屬于人類?!眒ortal(X):-person(X). 我們還可以詢問,“誰屬于人類?”?-mortal(X).我們會得到如下的答案:X= socrates進入進入prolog世界世界l 當然,一個完整的程序不能只包括邏輯運算部分,還必須擁有輸入輸出,乃至用戶界面部分。很遺憾,Prolog在這些方面做得不好,或者說很差。不過它還是提供了一些基本的方法的。下面是上述的程序一個完整的例子。l 這個簡單的例子顯示了Prolog的一些強大的功能。它能讓程序代碼更簡潔、更容
24、易編寫。在多數(shù)情況下Prolog的程序員不需要關心程序的運行流程,這些都由Prolog自動地完成了。進入進入prolog世界世界% This is the syntax for comments. % MORTAL - The first illustrative Prolog program mortal(X) :- person(X).person(socrates).person(plato).person(aristotle).mortal_report:-write(Known mortals are:),nl, mortal(X), write(X),nl,fail.把這個程序調入
25、Listener中,運行mortal_report.。?- mortal_report. Known mortals are:socratesplatoaristotleno 進入進入prolog世界世界假設你所扮演的角色是一個三歲的小女孩,你想睡覺了,假設你所扮演的角色是一個三歲的小女孩,你想睡覺了,可是沒有毛毯(可是沒有毛毯(naninani)你就不能安心的睡覺。所以你必)你就不能安心的睡覺。所以你必須在那個大房子中找到你的毛毯,這就是你的任務須在那個大房子中找到你的毛毯,這就是你的任務角色扮演游戲角色扮演游戲10:0132Prolog入門之入門之-1.事實事實 事實(事實(facts)是
26、)是prolog中最簡單的謂詞(中最簡單的謂詞(predicate)。它)。它和關系數(shù)據(jù)庫中的記錄十分相似。和關系數(shù)據(jù)庫中的記錄十分相似。 謂詞:謂詞:Prolog語言的基本組成元素,可以是一段程序、一個語言的基本組成元素,可以是一段程序、一個數(shù)據(jù)類型或者是一種關系。它由謂詞名和參數(shù)組成。兩個名數(shù)據(jù)類型或者是一種關系。它由謂詞名和參數(shù)組成。兩個名稱相同而參數(shù)的數(shù)目不同的謂詞是不同的謂詞。稱相同而參數(shù)的數(shù)目不同的謂詞是不同的謂詞。 事實的語法結構如下:事實的語法結構如下:pred(arg1, arg2, . argN).其中其中pred為謂詞的名稱。為謂詞的名稱。arg1,.為參數(shù),共有為參數(shù),
27、共有N個。個。.是所有的是所有的Prolog子句的結束符。子句的結束符。 參數(shù)可以是參數(shù)可以是 整數(shù)(整數(shù)(integer):絕對值小于某一個數(shù)的正數(shù)或負數(shù)。:絕對值小于某一個數(shù)的正數(shù)或負數(shù)。 原子(原子(atom):由小寫字母開頭的字符串。):由小寫字母開頭的字符串。 變量(變量(variable):由大寫字母或下劃線():由大寫字母或下劃線(_)開頭。)開頭。 結構(結構(structure):在以后的章節(jié)介紹。):在以后的章節(jié)介紹。 10:0133原子通常是字母和數(shù)字組成,開頭的字符必須是小寫字母。例如:原子通常是字母和數(shù)字組成,開頭的字符必須是小寫字母。例如:hello twoWord
28、sTogether x14 為了方便閱讀,可以使用下劃線把單詞分開。例如:為了方便閱讀,可以使用下劃線把單詞分開。例如:a_long_atom_name z_23 下面的是不合法的原子:下面的是不合法的原子: 123nodigitsatbeginning Nocapsfirst 下劃線不能放在最前面下劃線不能放在最前面使用單引號擴起來的字符集都是合法的原子:使用單引號擴起來的字符集都是合法的原子:this-hyphen-is-okUpperCaseembedded blanks下面的由符號組成的也是合法的原子:下面的由符號組成的也是合法的原子:,+ Prolog入門之入門之-1.事實事實10:
29、0134變量和原子相似,變量和原子相似, 但是開頭字符是大寫字母或是下劃線。例如:但是開頭字符是大寫字母或是下劃線。例如:X Input_List下劃線開頭的都是變量下劃線開頭的都是變量 Prolog入門之入門之-1.事實事實10:0135 用一階謂詞來表達事實:用一階謂詞來表達事實: prince(charles).查爾斯是王子。查爾斯是王子。 married(jane,david).珍妮和戴維結婚了。珍妮和戴維結婚了。 drinks(joyce,coffee).喬伊斯喝咖啡。喬伊斯喝咖啡。 drive(john,pauline,bmw). 約翰和波琳駕駛寶馬車。約翰和波琳駕駛寶馬車。 bi
30、tes(dog,man).狗咬人。狗咬人。 bites(man,dog).人咬狗。人咬狗。Prolog入門之入門之-1.事實事實10:0136 我們可以用一階謂詞來建立所需要的知識庫。我們可以用一階謂詞來建立所需要的知識庫。例一例一人們在一個聚會上的穿戴:人們在一個聚會上的穿戴:wears(mary,dress).wears(tina,trousers).wears(fred,suit).wears(terry,suit).wears(tina,red_blouse).wears(fred,white_shirt).wears(terry,blue_shirt).Prolog入門之入門之-1.
31、事實事實10:0137從定義基本的事實開始,這些事實是本游戲的基本的數(shù)據(jù)庫。它們包括:從定義基本的事實開始,這些事實是本游戲的基本的數(shù)據(jù)庫。它們包括:房間和它們的聯(lián)系房間和它們的聯(lián)系物體和它們的位置物體和它們的位置物體的屬性物體的屬性玩家在游戲開始時的位置玩家在游戲開始時的位置 Prolog入門之入門之-1.事實事實尋找尋找Nani游戲游戲10:0138首先我們使用首先我們使用room謂詞定義房間,一共有五條子句,它們都是謂詞定義房間,一共有五條子句,它們都是事實。事實。room(kitchen). room(office). room(hall). room(dining room). ro
32、om(cellar). Prolog入門之入門之-1.事實事實尋找尋找Nani游戲游戲10:0139 我們使用具有兩個參數(shù)的謂詞來定義物體的位置。第一個參我們使用具有兩個參數(shù)的謂詞來定義物體的位置。第一個參數(shù)代表物體的名稱,第二個參數(shù)表示物體的位置。謂詞數(shù)代表物體的名稱,第二個參數(shù)表示物體的位置。謂詞location的意思是的意思是“第一個參數(shù)所代表的物體位于第二個參第一個參數(shù)所代表的物體位于第二個參數(shù)所代表的物體中數(shù)所代表的物體中”。開始時,我們加入如下的物體:。開始時,我們加入如下的物體:location(desk, office).location(apple, kitchen).loc
33、ation(flashlight, desk).location(washing machine, cellar). location(nani, washing machine).location(broccoli, kitchen). location(crackers, kitchen).location(computer, office). 注意:我們定義的那些符號,例如:注意:我們定義的那些符號,例如:kitchen、desk等對于我們是有意義的,等對于我們是有意義的,可是它們對于可是它們對于Prolog是沒有任何意義的,完全可以使用任何符號來表示房是沒有任何意義的,完全可以使用任何
34、符號來表示房間的名稱。間的名稱。 尋找尋找Nani游戲游戲Prolog入門之入門之-1.事實事實10:0140 下面我們來表達房間的聯(lián)系。使用下面我們來表達房間的聯(lián)系。使用door來表示兩個房間有門來表示兩個房間有門相連,相連,door(office, hall).但是,我們想要表達的意思是但是,我們想要表達的意思是office和和hall之間有一個門,可之間有一個門,可是由于是由于Prolog能夠區(qū)分能夠區(qū)分door(office, hall)和和door(hall, office),所以如果我們想要表達一種雙向的聯(lián)系,就必須把,所以如果我們想要表達一種雙向的聯(lián)系,就必須把每種聯(lián)系都定義一遍
35、。每種聯(lián)系都定義一遍。 door(office, hall). door(hall, office). 在這里,只定義單向的門:在這里,只定義單向的門:door(office, hall). door(kitchen, office).door(hall, dining room). door(kitchen, cellar).door(dining room, kitchen).尋找尋找Nani游戲游戲Prolog入門之入門之-1.事實事實10:0141 下面定義某些物體的屬性,下面定義某些物體的屬性,edible(apple). edible(crackers). tastes_yucky
36、(broccoli). 最后,定義手電筒(由于是晚上,玩家必須找到手電筒,并最后,定義手電筒(由于是晚上,玩家必須找到手電筒,并打開它才能到那些關了燈的房間)的狀態(tài)和玩家的初始位置。打開它才能到那些關了燈的房間)的狀態(tài)和玩家的初始位置。turned_off(flashlight).here(kitchen).Prolog入門之入門之-1.事實事實尋找尋找Nani游戲游戲10:0142 現(xiàn)在我們的數(shù)據(jù)庫中已經有了一些事實,使用現(xiàn)在我們的數(shù)據(jù)庫中已經有了一些事實,使用Prolog的解釋的解釋器調入此程序后,我們就可以對這些事實進行查詢了。器調入此程序后,我們就可以對這些事實進行查詢了。 Prolo
37、g的查詢工作是靠模式匹配完成的。查詢的模板叫做目的查詢工作是靠模式匹配完成的。查詢的模板叫做目標標(goal)。如果有某個事實與目標匹配,那么查詢就成功了,。如果有某個事實與目標匹配,那么查詢就成功了,Prolog的解釋器會回顯的解釋器會回顯yes.。如果沒有匹配的事實,查詢。如果沒有匹配的事實,查詢就失敗了,解釋器回顯就失敗了,解釋器回顯no.。 我們把我們把Prolog的模式匹配工作叫做聯(lián)合的模式匹配工作叫做聯(lián)合(unification)。當數(shù)。當數(shù)據(jù)庫中只包括事實時,以下三個條件是使聯(lián)合成功的必要條據(jù)庫中只包括事實時,以下三個條件是使聯(lián)合成功的必要條件。件。 目標謂詞名與數(shù)據(jù)庫中的某個謂
38、詞名相同。目標謂詞名與數(shù)據(jù)庫中的某個謂詞名相同。 這兩個謂詞的參數(shù)數(shù)目相同。這兩個謂詞的參數(shù)數(shù)目相同。 所有的參數(shù)也相同。所有的參數(shù)也相同。Prolog入門之入門之-2.簡單查詢簡單查詢10:0143例一例一人們在一個聚會上的穿戴:人們在一個聚會上的穿戴:wears(mary,dress).wears(tina,trousers).wears(fred,suit).wears(terry,suit).wears(tina,red_blouse).wears(fred,white_shirt).wears(terry,blue_shirt). 如問:瑪麗穿的是套裝嗎?進入詢問狀態(tài)后,可以打入如問
39、:瑪麗穿的是套裝嗎?進入詢問狀態(tài)后,可以打入-?wears(mary,dress).Prolog入門之入門之-2.簡單查詢簡單查詢10:0144為回答這一問題,為回答這一問題,Prolog會去搜索數(shù)據(jù)庫,查找與這一問題會去搜索數(shù)據(jù)庫,查找與這一問題相匹配的事實。如果符合前述匹配的條件,那么相匹配的事實。如果符合前述匹配的條件,那么Prolog就會就會顯示顯示“yes.” 如問:瑪麗是否穿一雙綠色的鞋子?如問:瑪麗是否穿一雙綠色的鞋子?-wears(mary,green_shoes).由于找不到相匹配的事實,由于找不到相匹配的事實,Prolog會顯示會顯示“no.”給出否定的給出否定的回答。但這
40、個回答并不是說瑪麗穿的不是綠色的鞋子,而只是回答。但這個回答并不是說瑪麗穿的不是綠色的鞋子,而只是告訴我們:數(shù)據(jù)庫中沒有這個信息。告訴我們:數(shù)據(jù)庫中沒有這個信息。 當程序中某個量的值是變化的或不確定的時,就要用到變量。當程序中某個量的值是變化的或不確定的時,就要用到變量。如問:蒂娜穿什么樣的衣服?如問:蒂娜穿什么樣的衣服?-wears(tina,Clothing). 這里這里Clothing是一個變量,變量名的第一個字符必須是大寫字母。是一個變量,變量名的第一個字符必須是大寫字母。Prolog入門之入門之-2.簡單查詢簡單查詢10:0145Prolog會在數(shù)據(jù)庫中尋找與此匹配的事實,當搜索到第
41、二個會在數(shù)據(jù)庫中尋找與此匹配的事實,當搜索到第二個事實時,就實現(xiàn)了匹配,這樣事實時,就實現(xiàn)了匹配,這樣Prolog的答復是:的答復是:Clothing=trousers 這不一定是唯一的答案,問號表示是否還需要尋找其它答這不一定是唯一的答案,問號表示是否還需要尋找其它答案。如果需要,可以接著鍵入案。如果需要,可以接著鍵入“;”,Prolog就繼續(xù)搜索。就繼續(xù)搜索。Clothing=red_blouse如果還要繼續(xù)尋找,可以再次鍵入如果還要繼續(xù)尋找,可以再次鍵入“;”,Prolog的答復為:的答復為:no.這里的這里的“no”是說明數(shù)據(jù)庫中再也找不到相匹配的事實了。是說明數(shù)據(jù)庫中再也找不到相匹配
42、的事實了。Prolog入門之入門之-2.簡單查詢簡單查詢10:0146如果不需要繼續(xù)查找,可以按回車鍵,系統(tǒng)返回詢問狀態(tài)。如果不需要繼續(xù)查找,可以按回車鍵,系統(tǒng)返回詢問狀態(tài)。?-wears(mary,Clothing).Clothing=dress?yes.?-Prolog入門之入門之-2.簡單查詢簡單查詢10:0147數(shù)據(jù)庫如下:數(shù)據(jù)庫如下:room(kitchen).room(office).room(hall). room(dining room).room(cellar). door(office, hall).door(kitchen, office).door(hall, dini
43、ng room).door(kitchen, cellar).door(dining room, kitchen).Prolog入門之入門之-2.簡單查詢簡單查詢尋找尋找Nani游戲游戲10:0148location(desk, office).location(apple, kitchen). location(flashlight, desk). location(washing machine, cellar).location(nani, washing machine).location(broccoli, kitchen).location(crackers, kitchen).l
44、ocation(computer, office).edible(apple).edible(crackers).tastes_yucky(broccoli).here(kitchen). 尋找尋找Nani游戲游戲Prolog入門之入門之-2.簡單查詢簡單查詢10:0149 第一個問題是:第一個問題是:office在本游戲中是不是一個房間。在本游戲中是不是一個房間。?-room(office). yes. Prolog回答回答yes,因為它在數(shù)據(jù)庫中找到了,因為它在數(shù)據(jù)庫中找到了room(office).這這個事實。我們繼續(xù)問:有沒有個事實。我們繼續(xù)問:有沒有attic這個房間。這個房間。?-
45、room(attic).no. Prolog回答回答no,因為它在數(shù)據(jù)庫中找不到,因為它在數(shù)據(jù)庫中找不到room(attic).這個這個事實。同樣我們還可以進行如下的詢問。事實。同樣我們還可以進行如下的詢問。?- location(apple, kitchen).yes. ?- location(kitchen, apple).no. Prolog入門之入門之-2.簡單查詢簡單查詢10:0150 接下來:接下來:?- door(office, hall). yes. ?- door(hall, office).no. 由于我們定義的門是單方向的,所以會產生這樣的結果。由于我們定義的門是單方向的
46、,所以會產生這樣的結果。 如果需要找到所有的房間,那么:如果需要找到所有的房間,那么:?- room(X).X = kitchen ;X = office ;X = hall ; X = dining room ;X = cellar ;no. (最后的(最后的no表示找不到更多的答案了。)表示找不到更多的答案了。)Prolog入門之入門之-2.簡單查詢簡單查詢10:0151 下面我們想看看下面我們想看看kitchen中都有些什么:中都有些什么:?- location(Thing, kitchen).Thing = apple ;Thing = broccoli ; Thing = crack
47、ers ;no. 我們還可以使用兩個變量來查詢所有的物體及其位置我們還可以使用兩個變量來查詢所有的物體及其位置:?- location(Thing, Place).Thing = desk Place = office ;Thing = applePlace = kitchen ;Thing = flashlight Place = desk ;.no Prolog入門之入門之-2.簡單查詢簡單查詢10:0152 當當Prolog試圖與某一個目標匹配時,例如:試圖與某一個目標匹配時,例如:location,它就,它就在數(shù)據(jù)庫中搜尋所有用在數(shù)據(jù)庫中搜尋所有用location定義的子句,當找到一條
48、與定義的子句,當找到一條與目標匹配時,它就為這條子句作上記號。當用戶需要更多的目標匹配時,它就為這條子句作上記號。當用戶需要更多的答案時,它就從那條作了記號的子句開始向下查詢。答案時,它就從那條作了記號的子句開始向下查詢。Prolog入門之入門之-2.簡單查詢簡單查詢查詢的工作原理查詢的工作原理10:0153我們來看一個例子,用戶詢問:我們來看一個例子,用戶詢問:location(X,kitchen).。Prolog找到數(shù)據(jù)庫中的第一條找到數(shù)據(jù)庫中的第一條location子句,并與目標比較。子句,并與目標比較。 目標目標 location(X, kitchen) 子句子句#1 location
49、(desk, office) 匹配失敗,因為第二個參數(shù)不同,一個是匹配失敗,因為第二個參數(shù)不同,一個是kitchen,一個是,一個是office。Prolog入門之入門之-2.簡單查詢簡單查詢查詢的工作原理查詢的工作原理10:0154于是于是Prolog繼續(xù)比較第二個子句。繼續(xù)比較第二個子句。 目標目標 location(X, kitchen) 子句子句#2 location(apple, kitchen) 這回匹配成功,而變量這回匹配成功,而變量X的值就被綁定成了的值就被綁定成了apple。 ?- location(X, kitchen). X = apple Prolog入門之入門之-2.
50、簡單查詢簡單查詢查詢的工作原理查詢的工作原理10:0155如果用戶輸入分號如果用戶輸入分號(;),Prolog就開始尋找其他的答案。首先它必就開始尋找其他的答案。首先它必須釋放(須釋放(unbinds)變量)變量X。然后從上一次成功的位置的下一條子。然后從上一次成功的位置的下一條子句開始繼續(xù)搜索。這個過程叫做回溯(句開始繼續(xù)搜索。這個過程叫做回溯(backtracking)。在本例)。在本例中就是第三條子句。中就是第三條子句。 目標目標 location(X, kitchen) 子句子句#3 location(flashlight, desk) 匹配失敗,直到第六條子句時匹配又成功了匹配失敗,
51、直到第六條子句時匹配又成功了 。 目標目標 location(X, kitchen) 子句子句#6 location(broccoli, kitchen) 結果變量結果變量X又被綁定為又被綁定為broccoli,解釋器顯示:,解釋器顯示:X = broccoli ; 再度輸入分號,再度輸入分號,X又被解放,開始新的搜索。又找到了:又被解放,開始新的搜索。又找到了:X = crackers ; 這回再沒有新的子句能夠匹配了,于是這回再沒有新的子句能夠匹配了,于是Prolog回答回答no,表示最后,表示最后一次搜索失敗了。一次搜索失敗了。no查詢的工作原理查詢的工作原理Prolog入門之入門之-2
52、.簡單查詢簡單查詢10:0156 Prolog的目標有四個端口用來控制運行的流程:調的目標有四個端口用來控制運行的流程:調用(用(call)、退出()、退出(exit)、重試()、重試(redo)以及失)以及失?。〝。╢ail)。一開始使用)。一開始使用Call端口進入目標,如果匹端口進入目標,如果匹配成功就到了配成功就到了exit端口,如果失敗就到了端口,如果失敗就到了fail端口,端口,如果用戶輸入分號,則又從如果用戶輸入分號,則又從redo端口進入目標。端口進入目標。 每個端口的功能如下:每個端口的功能如下: call 開始使用目標搜尋子句。開始使用目標搜尋子句。 exit 目標匹配成功
53、,在成功的子句上作記號,并綁定變目標匹配成功,在成功的子句上作記號,并綁定變量。量。 redo 試圖重新滿足目標,首先釋放變量,并從上次的記試圖重新滿足目標,首先釋放變量,并從上次的記號開始搜索。號開始搜索。 fail 表示再找不到更多的滿足目標的子句了。表示再找不到更多的滿足目標的子句了。 Prolog入門之入門之-2.簡單查詢簡單查詢10:0157 下面列出了調試下面列出了調試location(X,kitchen).時的情況。括號中的數(shù)時的情況。括號中的數(shù)字表示當前正在考慮的子句。字表示當前正在考慮的子句。?- location(X, kitchen).CALL: - location(X
54、, kitchen)EXIT:(2) location(apple, kitchen)X = apple;REDO: location(X, kitchen) EXIT:(6) location(broccoli, kitchen)X = broccoli ;REDO: location(X, kitchen)EXIT:(7) location(crackers, kitchen) X = crackers ; FAIL - location(X, kitchen)no Prolog入門之入門之-2.簡單查詢簡單查詢10:0158 我們可以把簡單的查詢連接起來,組成一些較復雜的查詢。我們可以把
55、簡單的查詢連接起來,組成一些較復雜的查詢。例如,如果我們想知道廚房里能吃的東西,就可以向例如,如果我們想知道廚房里能吃的東西,就可以向Prolog進行如下的詢問進行如下的詢問: ?- location(X, kitchen), edible(X). 簡單的查詢只有一個目標,而混合查詢可以把這些目標連接簡單的查詢只有一個目標,而混合查詢可以把這些目標連接起來,從而進行較為復雜的查詢。上面的連接符號起來,從而進行較為復雜的查詢。上面的連接符號,是并且是并且的意思。上面的式子用語言來描述就是的意思。上面的式子用語言來描述就是“尋找滿足條件的尋找滿足條件的X,條件是:條件是:X在廚房里,并且在廚房里,
56、并且X能吃。能吃?!鄙厦娴牟樵冎挥姓业缴厦娴牟樵冎挥姓业侥骋粋€某一個X的值,使得兩個目標都成立時,才算查詢成功。的值,使得兩個目標都成立時,才算查詢成功。 ?- location(X, kitchen), edible(X). X = apple ; X = crackers ; no 查詢結果中沒有查詢結果中沒有broccoli,因為我們沒有把它定義為可吃的,因為我們沒有把它定義為可吃的東西。東西。 Prolog入門之入門之-3.混合查詢混合查詢10:0159 上面的例子中只有一個變量,下面我們再來看一個有兩個變上面的例子中只有一個變量,下面我們再來看一個有兩個變量的例子。量的例子。?- d
57、oor(kitchen, R), location(T,R).R = officeT = desk ;R = officeT = computer ;R = cellarT = washing machine ; no 上面的查詢用邏輯的語言來解釋就是:上面的查詢用邏輯的語言來解釋就是:“找房間找房間R,使得從,使得從廚房到房間廚房到房間R有門相連,并且把房間有門相連,并且把房間R中的物品中的物品T(這里是房這里是房間間R的所有物品)也找出來。的所有物品)也找出來。”Prolog入門之入門之-3.混合查詢混合查詢10:0160Goal: door(kitchen, R), location(T
58、,R)1 CALL door(kitchen, R)1 EXIT (2) door(kitchen, office)2 CALL location(T, office)2 EXIT (1) location(desk, office)R = office T = desk ;2 REDO location(T, office)2 EXIT (8) location(computer, office)R = officeT = computer ;2 REDO location(T, office)2 FAIL location(T, office)1 REDO door(kitchen, R)
59、 1 EXIT (4) door(kitchen, cellar)2 CALL location(T, cellar)2 EXIT (4) location(washing machine, cellar)R = cellar T = washing machine ; 2 REDO location(T, cellar)2 FAIL location(T, cellar)1 REDO door(kitchen, R) 1 FAIL door(kitchen, R)no 左邊是此查詢的單步運行過程Prolog入門之入門之-3.混合查詢混合查詢10:0161 再來看個例子。再來看個例子。例例某大
60、學學生的信息。某大學學生的信息。male(tim).male(marc).male(simon).female(louise).female(hazel).female(marie).year(tim,4).year(marc,1).year(simon,2).year(louise,3).year(hazel,1).year(marie,4).Prolog入門之入門之-3.混合查詢混合查詢62studies(tim,history).studies(marc,philosophy).studies(simon,mathematics).studies(louise,computer_scie
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學大閱讀方案
- 房建裝修工程項目施工方案
- 2023年臺州天臺縣人民醫(yī)院醫(yī)共體招聘考試真題
- 排水試驗段方案
- 小學二年級語文老師的個人工作總結
- “送教上門”活動方案
- 安全生產責任考核制度
- 學校 初中學生養(yǎng)成教育實施方案
- 物業(yè)公司清潔綠化外包管控方案
- 乒乓球社團活動策劃方案
- 2024年保育員(初級)考試題庫附答案
- 水電安裝施工組織設計方案樣本
- 社會主義核心價值觀
- 水平定向鉆入場安全教育考試試題及答案
- 變電站設計問題案例及分析報告
- 建筑地基基礎檢測規(guī)范DBJ-T 15-60-2019
- DB32T3916-2020建筑地基基礎檢測規(guī)程
- 中國紡織文化智慧樹知到期末考試答案2024年
- ktv免責協(xié)議書范本模板
- 食品保藏探秘智慧樹知到期末考試答案2024年
- 天津市和平區(qū)2023-2024學年七年級上學期期中數(shù)學試題(含解析)
評論
0/150
提交評論