2014-05-01 48 views
1

今天,我讀的書「一個溫柔的介紹符號計算」,我得到了鍛鍊4.29。 這聽起來像這樣:「編寫LOGICAL-AND的版本,並使用IF和COND而不是AND。」可互換條件語句

這是如何在原始文本中定義:

(defun logical-and (x y) (and x y t)) 

這就是我如何與COND定義它,如果:

(defun logical-and (x y) 
    (cond ((and x y) t) 
    (t nil))) 

(defun logical-and (x y) 
    (if (and x y) t nil)) 

這是他們是如何的答案定義練習

(defun logical-and (x y) 
    (cond (x (cond (y t))))) 

(defun logical-and (x y) 
    (if x (if y t))) 

所以問題是所有這些定義是否相等?

+8

我覺得當時的想法是不要使用「與」不惜一切 - 這樣你的答案是沒有什麼要求。 –

+0

我想是這樣,但畢竟這些版本我想知道他們是否相等 – Gorozhin

+8

你可以很容易地發現自己:爲每個函數寫一個真值表。嘗試所有可能的輸入(不是很多),計算結果並比較... –

回答

0

這三種情況在行爲上都是相同的。具體來說,如果x和y都是非零,則函數返回符號t,否則爲零。

在文本中的定義,它只是使用了與運營商T作爲它的最後一個參數。這是有效的,因爲如果x或y是零則短路並返回nil,但是如果x和y都爲真,則返回最後一個表達式的結果,即t。

在你COND定義,如果x和y是真實的,第一個子句匹配,返回T,並且在所有其他情況下(即X或Y是假的),則返回零。

你如果定義工作方式類似,返回牛逼當且僅當x和y是真實的,否則無。

給鍛鍊工作的答案,因爲COND返回nil,如果沒有這條規則,如果返回nil如果條件是假的,並沒有指定else子句。因此cond定義只有在兩個條件都滿足的情況下才返回t(即,x爲真且y爲真),並且如果條件爲真,並且如果不返回nil,則if定義僅爲t。