資料庫程式設計

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 之間。