Prolog教程 4 簡單查詢

2021-09-06 08:44:56 字數 2919 閱讀 5192

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 是謂詞的定義部分,與事實一樣,也包括謂詞名和謂詞的引數說明。連線符,一般可以...