Lisp 可互换条件句

Lisp 可互换条件句,lisp,common-lisp,Lisp,Common Lisp,今天我在读《符号计算的温和介绍》一书,我得到了练习4.29。 这听起来像是:使用IF和COND而不是AND编写逻辑AND的版本 以下是原文中对其的定义: (defun logical-and (x y) (and x y t)) 这就是我用cond和if定义它的方式: (defun logical-and (x y) (cond ((and x y) t) (t nil))) (defun logical-and (x y) (if (and x y) t nil))

今天我在读《符号计算的温和介绍》一书,我得到了练习4.29。 这听起来像是:使用IF和COND而不是AND编写逻辑AND的版本

以下是原文中对其的定义:

(defun logical-and (x y) (and x y t))
这就是我用cond和if定义它的方式:

(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)))

所以问题是所有这些定义都相等吗?

这三种情况在行为上是相同的。具体来说,如果x和y都是非nil,则函数返回符号t,否则返回nil

在文本中的定义中,它只是使用带t的and运算符作为最后一个参数。这是因为如果x或y为nil,则短路并返回nil,但是如果x和y均为真,则和返回最后一个表达式的结果,即t

在第二个定义中,如果x和y都为true,则第一个子句匹配,返回t,在所有其他情况下,即x或y为false,则返回nil

if定义的工作原理类似,当且仅当x和y都为真时返回t,否则返回nil


练习的答案有效,因为如果没有匹配的子句,cond将返回nil;如果条件为false且未指定else子句,if将返回nil。因此,条件定义仅当两个条件都满足时返回t,即x为真,y为真,而if定义仅当两个条件都满足时返回t,如果不满足则返回nil。

我认为根本不使用“and”-因此,您的答案不是要求的。我想是这样的,但是在所有这些版本之后,我想知道它们是否相等。你可以自己很容易地找到:为每个函数写一个真值表。尝试所有可能的输入,计算结果并比较。。。