goal–查詢目標
unification–匹配工作三個必要哦條件1.目標謂詞一致 2.謂詞引數數量一致 3. 所有引數相同
;–查詢繼續
查詢4個埠:1.call 開始查詢
2. exit 成功查詢到結果,並繫結到變數
3. redo 從上次成功查詢處之後繼續查絢,先釋放變數
4. fail 查詢失敗退出
現在我們的遊戲中已經有了一些事實,使用prolog的直譯器調入此程式後,我們就可以對這些事實進行查詢了。本章和下一章中的prolog程式只包括事實,我們要學會如何對這些事實進行查詢。
prolog的查詢工作是靠模式匹配完成的。查詢的模板叫做目標(goal)。如果有某個事實與目標匹配,那麼查詢就成功了,prolog的直譯器會回顯』yes.』。如果沒有匹配的事實,查詢就失敗了,直譯器回顯』no.』。
我們把prolog的模式匹配工作叫做聯合(unification)。當資料庫中只包括事實時,以下三個條件是使聯合成功的必要條件。
目標謂詞名與資料庫中的某個謂詞名相同。
這兩個謂詞的引數數目相同。
所有的引數也相同。
在介紹查詢之前,讓我們回顧一下上一章所編寫的prolog程式。
room(kitchen).
room(office).
room(hall).
room(『dining room』).
room(cellar).
door(office, hall).
door(kitchen, office).
door(hall, 『dining room』).
door(kitchen, cellar).
door(『dining room』, kitchen).
以上是我們的「尋找nani」中的所有事實。把這段程式調入prolog直譯器中後就可以開始進行查詢了。
我們的第乙個問題是:office在本遊戲中是不是乙個房間。
?-room(office).
yes.
prolog回答yes,因為它在資料庫中找到了room(office).這個事實。我們繼續問:有沒有attic這個房間。
?-room(attic).
no.prolog回答no,因為它在資料庫中找不到room(attic).這個事實。同樣我們還可以進行如下的詢問。
你看prolog懂我們的意思呢,它知道蘋果在廚房裡,並且知道廚房不在蘋果裡。但是下面的詢問就出問題了。
?- door(office, hall).
yes?- door(hall, office).
no由於我們定義的門是單方向的,結果遇到了麻煩。
在查詢目標中我們還可以使用prolog的變數。這種變數和其他語言中的不同。叫它邏輯變數更合適一點。變數可以代替目標中的一些引數。
變數給聯合操作帶來了新的意義。以前聯合操作只有在謂詞名和引數都相同時才能成功。但是引入了變數之後,變數可以和任何的條目匹配。
當聯合成功之後,變數的值將和它所匹配的條目的值相同。這叫做變數的繫結(binding)。當帶變數的目標成功的和資料庫中的事實匹配之後,prolog將返回變數繫結的值。
由於變數可能和多個條目匹配,prolog允許你察看其他的繫結值。在每次prolog的回答後輸入「;」,可以讓prolog繼續查詢。下面的例子可以找到所有的房間。「;」是使用者輸入的。
?- room(x).
x = kitchen ;
x = office ;
x = hall ;
x = 『dining room』 ;
x = cellar ;
no最後的no表示找不到更多的答案了。
下面我們想看看kitchen中都有些什麼。(變數以大寫字母開始)
我們還可以使用兩個變數來查詢所有的物體及其位置。
?- location(thing, place).
thing = desk
place = office ;
thing = flashlight
place = desk ;…no
查詢的工作原理
當prolog試圖與某乙個目標匹配時,例如:location/2,它就在資料庫中搜尋所有用location/2定義的子句,當找到一條與目標匹配時,它就為這條子句作上記號。當使用者需要更多的答案時,它就從那條作了記號的子句開始向下查詢。
我們來看乙個例子,使用者詢問:location(x,kitchen).。prolog找到資料庫中的第一條location/2子句,並與目標比較。
目標 location(x, kitchen)
子句#1 location(desk, office)
匹配失敗,因為第二個引數不同,乙個是kitchen,乙個是office。於是prolog繼續比較第二個子句。
目標 location(x, kitchen)
子句#3 location(flashlight, desk)
匹配失敗,直到第六條子句時匹配又成功了 。
目標 location(x, kitchen)
子句#6 location(broccoli, kitchen)
結果變數x又被繫結為broccoli,直譯器顯示:
x = broccoli ;
再度輸入分號,x又被解放,開始新的搜尋。又找到了:
x = crackers ;
這回再沒有新的子句能夠匹配了,於是prolog回答no,表示最後一次搜尋失敗了。
noprolog的目標有四個埠用來控制執行的流程:呼叫(call)、退出(exit)、重試(redo)以及失敗(fail)。一開始使用call埠進入目標,如果匹配成功就到了exit埠,如果失敗就到了fail埠,如果使用者輸入分號,則又從redo埠進入目標。下圖表示了目標和它的四個埠。
每個埠的功能如下:
在prolog的直譯器中輸入,
?- debug.
就可以開始除錯你的程式了。
在下一章中將介紹更為複雜的查詢。
Prolog中文教程 簡單的查詢
現在我們的遊戲中已經有了一些事實,使用prolog的直譯器調入此程式後,我們就可以對這些事實進行查詢了。本章和下一章中的prolog程式只包括事實,我們要學會如何對這些事實進行查詢。prolog的查詢工作是靠模式匹配完成的。查詢的模板叫做目標 goal 如果有某個事實與目標匹配,那麼查詢就成功了,p...
Prolog教程 5 組合查詢
常用內部謂詞 write 1 此謂詞被呼叫時永遠是成功的,並且它可以把它的引數作為字串輸出到螢幕上。當回溯時,它永遠是失敗,所以回溯是不會把已經寫到螢幕上的字元又給刪除的。nl 0 此謂詞沒有引數,和write一樣,從call埠呼叫時總是成功的,從redo埠回溯時總是失敗的,它的作用是在螢幕上輸出乙...
Prolog教程 6 規則
pred x pred y pred z 前面我們已經說過,謂詞是使用一系列的子句來定義的。以前我們所學習的子句是事實,現在讓我們來看看規則吧。規則的實質就是儲存起來的查詢。它的語法如下 head body 其中,head 是謂詞的定義部分,與事實一樣,也包括謂詞名和謂詞的引數說明。連線符,一般可以...