資料庫程式設計

Prolog 將所有內容歸類為:

  • 原子 - 任何不以大寫字母開頭的字元序列。例如 - abokay
  • 數字 - 數字沒有特殊語法,不需要宣告。例如 12235.8
  • 變數 - 以大寫字元或下劃線(_)開頭的字串。例如 XYAbcAA
  • 複雜術語 - 它們由仿函式和一系列引數組成。複雜術語的名稱始終是原子,而引數可以是原子或變數。例如 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 是一種宣告性語言,你可以按如下方式閱讀此資料庫:

弗雷德是蘇珊的父親

希拉里是喬的母親。

對於所有 XYXY 的孩子,如果 YX 的父親或者 YX 的母親。

實際上,一組有限的事實和/或規則構成了邏輯程式

通過查詢來演示這種程式的使用。查詢允許你從邏輯程式中檢索資訊。

要將資料庫載入到直譯器中(假設你已將資料庫儲存到正在執行直譯器的目錄中),只需輸入:

?- [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 關係在希拉里和喬之間

對於所有 XY,如果 father_childYX 之間的關係,或者 mother_childYX 之間的關係,那麼關係 child_ofXY 之間。