Max Bramer:logic Programming With Prolog@2005 (第1版)

傳統程式設計(如 C++ 和 Java)採用程序式風格,指令依序執行,高度依賴底層機器架構。邏輯程式設計則提供截然不同的風格,強調程式應聚焦於「要做什麼」而非「如何執行」。Prolog 是邏輯程式設計領域中最廣泛使用的語言,其根源可追溯至 1960 和 1970 年代歐洲在自動數學定理證明(計算邏輯)方面的研究。它是一種通用語言,但在符號運算而非數值計算方面展現出特別的優勢,並在人工智慧領域有廣泛應用。

Prolog 程式的核心架構極為精簡,僅包含兩種基本構成要素:事實(facts)和規則(rules)。事實表達了關於世界的無條件真實陳述(例如 dog(fido) 表示「fido 是一隻狗」),而規則則表達了條件性的真實陳述(例如 animal(X):-dog(X) 表示「如果 X 是一隻狗,那麼 X 是一種動物」)。這些事實與規則共同構成了 Prolog 系統的知識庫或稱為資料庫。使用者透過提出查詢(queries)與系統互動,系統會利用其資料庫中的事實和規則來推導答案,並回覆「是」(yes)或「否」(no),或者提供變數的值以滿足查詢。

Prolog 用來滿足查詢(以及規則主體中的子目標)的機制是基於邏輯推理技術中的統一(unification)和回溯(backtracking)。當系統試圖滿足一個目標時,它會嘗試將該目標與其資料庫中各條款(事實或規則)的頭部進行統一。統一是一個模式匹配過程,通常涉及將變數綁定到特定值,以便使目標與條款頭部變得相同。如果一個目標與某個事實的頭部統一成功,則該目標立即成功。如果目標與某個規則的頭部統一成功,系統則轉而嘗試依序滿足該規則主體中的所有子目標。回溯是 Prolog 的自動搜尋功能,當一個子目標失敗時,系統會自動退回並嘗試重新滿足最近成功的子目標,以尋找替代的解決方案。這種深度優先的搜尋結合回溯,使得 Prolog 能夠自動探索所有可能的推導路徑。

有別於傳統語言的程序式結構(如 for 迴圈、while 迴圈、變數賦值語句、變數宣告),Prolog 鼓勵並依賴遞歸(recursion)和列表處理(list processing)等技術來實現迭代和數據操作。列表作為一種靈活的數據結構,在 Prolog 中被廣泛用於處理未知數量元素的集合。程式中的重複執行通常透過遞歸呼叫謂詞來實現,而列表則可以透過模式匹配和遞歸來處理其元素。此外,Prolog 允許在程式運行時動態地修改其資料庫,包括增加(asserta/assertz)和刪除(retract/retractall)條款。為了控制自動回溯可能帶來的非預期行為或提高效率,Prolog 提供了「切入」(cut, !)這個內建謂詞,允許程式設計師限制回溯的範圍,甚至可以配合失敗(fail)來表達通用規則的例外情況。雖然這類控制機制增加了命令式元素,但核心思想仍然是基於邏輯的。

由於其基於邏輯的特性和強大的符號處理能力,Prolog 在專家系統、自然語言處理、規劃、機器學習以及近年來在語義網(Semantic Web)的知識表示等眾多人工智慧相關領域有著實際應用。其簡潔的語法和強大的內建機制(如統一和自動回溯)使得解決某些類型的複雜問題變得異常高效,常常只需比在程序式語言中少得多的程式碼行數。雖然對於習慣程序式思維的程式設計師來說,Prolog 的聲明式特性和獨特執行模型可能需要一段時間適應,但它提供了一種強大的替代視角來解決問題。這本書旨在作為學習 Prolog 的入門指南,作者強調本書適合絕大多數不具備計算機科學、邏輯學或數學背景的讀者。它從基礎開始,逐步引入條款、謂詞、變數、目標滿足機制(統一與回溯)、操作符、算術、輸入輸出、如何模擬迴圈、控制回溯、修改資料庫、列表處理、字串處理等核心概念和技術,目標是讓讀者掌握使用 Prolog 編寫解決複雜問題的程式的技術,並領略邏輯程式設計的獨特魅力。