資料庫程式設計
Prolog 將所有內容歸類為:
- 原子 - 任何不以大寫字母開頭的字元序列。例如 -
a
,b
,okay
- 數字 - 數字沒有特殊語法,不需要宣告。例如
1
,22
,35.8
- 變數 - 以大寫字元或下劃線(
_
)開頭的字串。例如X
,Y
,Abc
,AA
- 複雜術語 - 它們由仿函式和一系列引數組成。複雜術語的名稱始終是原子,而引數可以是原子或變數。例如
father(john,doe)
,relative(a)
,mother(X,Y)
。
邏輯資料庫包含一組事實和規則。
僅將原子作為引數的複雜術語稱為事實,而將變數作為引數的複雜術語稱為規則。
Prolog 中的事實示例:
father_child(fred, susan).
mother_child(hillary, joe).
Prolog 中的規則示例:
child_of(X,Y):-
father_child(Y,X)
;
mother_child(Y,X).
請注意,此處的 ;
與其他語言的 or
運算子類似。
Prolog 是一種宣告性語言,你可以按如下方式閱讀此資料庫:
弗雷德是蘇珊的父親
希拉里是喬的母親。
對於所有
X
和Y
,X
是Y
的孩子,如果Y
是X
的父親或者Y
是X
的母親。
實際上,一組有限的事實和/或規則構成了邏輯程式。
通過查詢來演示這種程式的使用。查詢允許你從邏輯程式中檢索資訊。
要將資料庫載入到直譯器中(假設你已將資料庫儲存到正在執行直譯器的目錄中),只需輸入:
?- [nameofdatabase].
用實際檔名替換 nameofdatabase
(請注意,這裡我們將 .pl
副檔名排除在檔名之外)。
上述程式的直譯器中的查詢示例和結果:
?- child_of(susan,fred).
true
?- child_of(joe,hillary).
true
?- child_of(fred,susan).
false
?- child_of(susan,hillary).
false
?- child_of(susan,X).
X = fred
?- child_of(X,Y).
X = susan,
Y = fred ;
X = joe,
Y = hillary.
上述查詢及其答案可以解讀如下:
蘇珊是弗雷德的孩子嗎? - 是的
喬是希拉里的孩子嗎? - 是的
是一個蘇珊的孩子? - 假
是蘇珊是希拉里的孩子嗎? - 假
誰是蘇珊的孩子? - 弗雷德
這就是我們在 Prolog 中程式設計邏輯的方式。邏輯程式更正式:一組公理或規則,定義物件之間的關係(也就是謂詞)。以更正式的邏輯方式解釋上述資料庫的另一種方法是:
father_child
關係在 fred 和 susan 之間
mother_child
關係在希拉里和喬之間
對於所有
X
和Y
,如果father_child
在Y
和X
之間的關係,或者mother_child
在Y
和X
之間的關係,那麼關係child_of
在X
和Y
之間。