1. 程式人生 > >4.4邏輯程式設計

4.4邏輯程式設計

4.4邏輯程式設計

在第一章中, 我們瞭解了電腦科學是處理過程式的知識,而數學是處理宣告式的知識。
的確,程式語言要求程式設計師表達知識時,以一種特定的形式。這種形式顯示出解決特定問題的一步步的方法。
另一方面,高層次的語言提供了,作為語言實現的一部分,大量的方法論的知識。這些知識把使用者從具體執行的
大量的細節中解放出來。

大部分的程式語言,包括lisp,被組織成計算數學函式的值。面向表示式的語言(例如lisp,fortran,algol)
評估表示式的雙關語。表示式描述了一個函式的值,也可能被解釋為計算那個值的方法。
正因為此,絕大部分的程式語言都強烈地傾向於單方向的計算。也就是計算是有定義好的輸入和輸出。
然而,有完全不同的程式語言解除了這種偏見。我們在3.3.5部分中看到了一個這樣的例子,
在那裡,計算的物件有算術約束。在一個約束的系統裡,計算的方向和次序沒有被很好地指定。
在執行一個計算時,系統必須提供更多的如何做的細節知識,這些知識遠比普通的算術計算的知識多。
然而,這並不是意味著,使用者能從提供過程式的知識的責任中完全解脫出來。這有實現相同的約束的集合的許多的約束網路。
為了一個指定的特定的計算,在數學上等價的網路的集合中,使用者必須選擇一個合適的網路。

4.3部分中,非確定性程式的評估器 也改變了那個觀點。觀點是程式設計是為了計算單一方向的函式,
而組裝起演算法。在一個非確定性的語言中,表示式能有超過一個值,作為結果,計算處理關係,而不是
一個單值函式。 邏輯程式設計擴充套件了這個思想,通過組合一個關係的程式設計美景。
這種程式設計有一種強有力的符號模式匹配,這種匹配稱為統一。

這個方法,當它在使用時,是寫程式時的強有力的方式。力量的部分來源是
是一個事實。這個事實是一個單一的“是什麼”的事實能被用來解決一系列不同的問題。
這些問題有不同的“怎麼做”的元件。作為一個例子,考慮一下,append操作,
它有兩個列表作為引數,組合它們的元素形成一個單一的列表。在一個程式化的語言中,
例如lisp,我們能定義append,用基本的列表組裝子,cons,正如我們在2.2.1部分中使用的那樣。

(define (append x y)
   (if (null? x)
       y
      (cons (car x) (append (cdr x) y))
   )
)

這個程式被認為是如下的兩條規則被翻譯成了Lisp語言。規則之一是覆蓋了
第一個列表是空的情況,第二個規則是處理一個非空的列表的情況,它使用cons組裝這兩個部分。

對於任何一個列表y,空列表和y 進行append操作,得到y.
對於任何u,v,y,z,如果v和y進行append操作,形成z,那麼
(cons u v)和 y 進行 append 操作,形成(cons u z)。

使用這個程式append,我們能回答如下的問題,例如

   找到 (a b) 和( c d) 的append 的結果。

但是對於append程式不能解決的,如下的排序的問題,
這兩條相同的規則也是充分的。

   找到一個列表y,y和(a b) 進行append 操作,生成(a b c d)

   找到所有的 x 和y 列表,x和y進行append 操作,生成(a b c d)

在一個邏輯程式語言中,程式設計師寫一個"append"程式,通過宣告關於append的如上的兩條規則,
"怎麼做"的知識由直譯器自動地提供,來允許這單一的一對規則被用來回答
關於append的這三種類型的問題。

當代的邏輯程式語言(包括我們實現的這個)有大量的缺陷,例如,
它們的通用化的“怎麼做”的方法能夠導致它們進入虛假的,無窮的迴圈之中。
或者是其它的非預期的行為。在電腦科學中,邏輯程式設計是一個研究的熱點區域。

在這一章的前面的部分, 我們探索了實現直譯器的技術,描述瞭解釋器的元素。
這些元素對於類Lisp語言的直譯器來說,是必須的。其實對於任何一個傳統的語言的
直譯器來說,都是必須的。 現在,我們應用這些思想,來討論一個邏輯程式語言的直譯器。
我們叫這個語言是查詢語言。因為對於從資料庫中檢索資訊,它是很有用的,
通過公式化語言中表達的查詢或者是問題。 即使查詢語言非常不同於lisp,我們仍然能發現
使用已有的框架,描述語言時的方便性。這個框架包括,原生元素的集合,結合組合的方法,抽象的方法。
組合的方法讓我們能把簡單的元素組合成複雜的元素。抽象的方法讓我們能把複雜的元素作為一個單一的概念。
一個邏輯語言的直譯器被認為比一個類lisp的直譯器更加複雜 。
然而,我們將看到,我們的查詢語言的直譯器,包括很多的與在4.1部分中的直譯器相同的元素。
特別是, 這有一個"評估"部分,它根據型別分類表示式,還有一個“應用”部分,實現語言的抽象機制。
(這個抽象機制是lisp的程式,邏輯語言的規則)。還有,一個框架性的資料結構的實現中,起核心作用的角色,
這個角色確定了符號和它們關聯的值之間的通訊。我們的查詢語言的實現中,有一個附加的有趣的方面,
是我們大量地使用了在第三章中,被介紹過的流。