“会员”将不会识别列表的成员

时间:2012-05-10 15:40:28

标签: lisp common-lisp clisp

我遇到了一个非常奇怪的问题。我有一个名为“定理”的列表,它只有一个项目。这是证据:

[]> theorems
(((ROSES ARE RED) ^ (~ (ROSES ARE RED))))
[]> (car theorems)
((ROSES ARE RED) ^ (~ (ROSES ARE RED)))

显然((玫瑰红色)^(〜(玫瑰红)))是列表“定理”的成员。但是当我测试它的成员身份时,它失败了:

[]> (member '((ROSES ARE RED) ^ (~ (ROSES ARE RED))) theorems)
NIL

但是,如果我明确地称之为它,那就有效:

[]> (member (car theorems) theorems)
(((ROSES ARE RED) ^ (~ (ROSES ARE RED))))

为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:6)

Common Lisp使用EQL作为默认测试函数。 EQL检查项目是否是相同的相同项目。您想测试项目是否具有相同的结构。因此,您需要使用EQUALEQUALP

CL-USER 11 > (setf theorems '(((ROSES ARE RED) ^ (~ (ROSES ARE RED)))))
(((ROSES ARE RED) ^ (~ (ROSES ARE RED))))

CL-USER 12 > (member '((ROSES ARE RED) ^ (~ (ROSES ARE RED))) theorems)
NIL

告诉MEMBER使用EQUAL

CL-USER 13 > (member '((ROSES ARE RED) ^ (~ (ROSES ARE RED)))
                     theorems
                     :test 'equal)
(((ROSES ARE RED) ^ (~ (ROSES ARE RED))))