事實、規則、目標及查詢

前頁 目錄 下頁

事實 規則 目標及查詢 常見內置謂詞

一個 Prolog 程序包含數個短句,每個短句一是事實,或是規則。當一個 Prolog 程序在一個 Prolog 解釋程序被載入(或被查閱)時,使用者可以提交目標或查詢,Prolog 解釋程序就會根據事實和規則給出結果(答案)。

事實 Top

一個事實必須以一個謂詞(是原子的一種)開始,以英文句號結束。謂詞之後可以有一對括號,�堶惘酗@個或以上的變元,變元可以是原子(在這情況下,這些原子被當成常數)、數字、變量或列表,變元以逗號分隔。

如果我們把事實中的變元視為物件,那麼事實中的謂詞就是形容這些物件的屬性。

在一個 Prolog 程序中,若果有一事實存在,即代表一個語句是真的;若果事實沒有存在,這代表一個語句不是真的。看看以下例子︰

程序二︰一個只有事實的 Prolog 程序
sunny.
father(john, peter).
father(john, mary).
mother(susan, peter).
目標/查詢及其結果(紅色所示)
?- sunny.    /* 回應是「yes」是因為事實「sunny.」存在 */

yes

?- rainy.    /* 有錯誤的結果是因為沒有一個叫「rainy」的謂詞。 */

錯誤結果。

?- father(john, mary).

yes

?- mother(susan, mary). /* 這不能被推斷出來。 */

no

?- father(john, susan). /* 這不能被推斷出來。 */

no

規則 Top

一個規則可以視為事實的伸延部份,只不過是加了條件。要這個規則成為真的,規則中的條件必須符合。規則分為兩部份︰第一部份和事實差不多(一個有變元的謂詞);第二部份包含其他短句(事實或規則,以逗號分隔),要規則成為真的,這些短句必須是真的。這兩部份由「:-」分隔,你可以把它當作是中文中的「如果」。

看看以下例子︰

程序三︰一個程序形容了一個家庭中各成員的關係

father(jack, susan).                             /* 事實一 */
father(jack, ray).                               /* 事實二 */
father(david, liza).                             /* 事實三 */
father(david, john).                             /* 事實四 */
father(john, peter).                             /* 事實五 */
father(john, mary).                              /* 事實六 */
mother(karen, susan).                            /* 事實七 */
mother(karen, ray).                              /* 事實八 */
mother(amy, liza).                               /* 事實九 */
mother(amy, john).                               /* 事實十 */
mother(susan, peter).                            /* 事實十一 */
mother(susan, mary).                             /* 事實十二 */

parent(X, Y) :- father(X, Y).                    /* 規則一 */
parent(X, Y) :- mother(X, Y).                    /* 規則二 */
grandfather(X, Y) :- father(X, Z), parent(Z, Y). /* 規則三 */
grandmother(X, Y) :- mother(X, Z), parent(Z, Y). /* 規則四 */
grandparent(X, Y) :- parent(X, Z), parent(Z, Y). /* 規則五 */
yeye(X, Y) :- father(X, Z), father(Z, Y).        /* 規則六 */
mama(X, Y) :- mother(X, Z), father(Z, Y).        /* 規則七 */
gunggung(X, Y) :- father(X, Z), mother(Z, Y).    /* 規則八 */
popo(X, Y) :- mother(X, Z), mother(Z, Y).        /* 規則九 */

拿規則三作為例子,它的意思是如果「father(X, Z)」和「parent(Z, X)」都是真的,那麼「granfather(X, Y)」是真的。在條件中的逗號可以當作是邏輯上的「AND」運算符。

你可以見到規則一及規則二都是以「parent(X, Y)」開始。什麼時候「parent(X, Y)」才會變成真的?答案就是這兩個規則當中任何一個是真的。這即是說,當「father(X, Y)」是真的或「mother(X, Y)」是真的時,「parent(X, Y)」就是真的。

由規則三至規則五所見,只出現在規則,沒有在事實出現的謂詞(在這情況下,是 parent)也可以成為其他規則的條件。

目標及查詢 Top

當 Prolog 解釋程序執行時,你可能在畫面見到提詞「?-」,這提醒使用者輸入一個目標或者查詢。

目標

目標是一個以謂詞開始(可能附有一些變元)的語句。在一個有效的目標中,謂詞必須曾在被查閱的程序當中至少一個事實或規則出現過,而變元的數目必須和在被查閱的程序當中所見的一樣。此外,所有變元都是常數。

提交目標的目的是去求出目標代表的語句是否真的,其判斷方法跟據知識數據庫(即被查閱的程序中的事實和規則)。這和證明假設相似──目標就是假設,事實就是公理,而規則就是定理。

查詢

查詢是一個以謂詞開始,附有一些變元的語句,而當中有些變元是變量。和目標一樣,有效的查詢的謂詞必須曾在被查閱的程序中至少一個事實或規則出現過,而變元的數目必須和在被查閱的程序當中所見的一樣。

提交查詢的目的是去求出適當的值去代入查詢中的變量,來滿足該查詢。這和發問問題相似,問題是問「什麼值可以使我的語句變成真的」。

以下例子展示目標和查詢如何被評估,使用的是程序三。結果以紅色表示。

?- parent(susan, mary).

yes

這個目標要證明「Susan 是 Mary 的一個家長」。從事實十二和規則二得知,這目標是真的。
?- parent(ray, peter).

no

這個目標要證明「Ray 是 Peter 的一個家長」。因為沒有事實和規則支援,所以此目標被反證。
?- yeye(X, susan).

no

這個查詢問誰是 Susan 的「yeye」。我們不能從程序中找到解,因此 Prolog 解釋程序回傳 no。
?- mama(amy, X).

X = peter ;

X = mary ;

no

這個查詢問誰稱呼 Amy 為「mama」。從程序得知 Peter 和 Mary 都是解。因此 Prolog 解釋程序會顯示這兩個答案。

因為 Prolog 解釋程序一次只能顯示一個解,我們輸入一個分號(不同的軟件可能要輸入不同的符號)去要求下一個解。如果再沒有解,Prolog 解釋程序會回傳 no。

?- gunggung(X, Y).

X = jack
Y = peter
;

X = jack
Y = mary
;

no

這個查詢問︰「X 是 Y 的『gunggung』。X 和 Y 是誰?」從程序得知,X 是 Jack,而 Y 可以是 Peter 或 Mary。所以 Prolog 解釋程序會回傳兩組結果。

看看下頁可知 Prolog 解釋程序如何處理目標和查詢。

常見內置謂詞 Top

除了自行定義的謂詞外,Prolog 亦有提供內置謂詞。以下是一些常見的內置謂詞︰

留意以上的內置謂詞有兩個變元,一個在左面,另一個在右面(和其他的程序語言相似)。不過,自行定義的謂詞和部份內置謂詞一定要在變元之前出現。

亦請留意 is 和 = 的分別。試看看以下的目標︰

?- 4 = 4.

yes

很明顯。
?- 4 is 4.

yes

很明顯。
?- 4 = 1 + 3.

no

答案是 no,因為左面(4)和右面(1 + 3)不是完全一樣。
?- 4 is 1 + 3.

yes

左面的值和右面的值相等。

前頁 目錄 下頁