Lisp 如何测试一个列表是否是另一个列表的成员

Lisp 如何测试一个列表是否是另一个列表的成员,lisp,common-lisp,membership,Lisp,Common Lisp,Membership,假设我有两个列表,((123))和((123))((45))。我想知道第一个列表是否是第二个列表的成员。我尝试使用subsetp,但对于此查询,它不会返回true。如何实现这一点?如果要将列表作为子TP的集合元素,必须更改:test关键字的值 CL-USER 1 > (subsetp '(1 2 3) '(1 2 3 4 5)) T CL-USER 2 > (subsetp '((1) (2) (3)) '((1) (2) (3) (4) (5))) NIL 第一个给T,第二个给零

假设我有两个列表,
((123))
((123))((45))
。我想知道第一个列表是否是第二个列表的成员。我尝试使用
subsetp
,但对于此查询,它不会返回true。如何实现这一点?

如果要将列表作为
子TP
的集合元素,必须更改
:test
关键字的值

CL-USER 1 > (subsetp '(1 2 3) '(1 2 3 4 5))
T
CL-USER 2 > (subsetp '((1) (2) (3)) '((1) (2) (3) (4) (5)))
NIL
第一个给T,第二个给零。为什么?因为相等性是用
#'eql
检查的,它适用于相同值和相同类型的相同对象或数字。由于两个列表不能是相同的对象,
(eql'(1)“(1))
给出零。(这可能取决于您的CL实现。)如果您想比较conse树,
tree equal
可以帮助您

CL-USER 3 > (subsetp '((1) (2) (3)) '((1) (2) (3) (4) (5)) :test #'tree-equal)
T
我不完全理解您作为示例给出的集合的结构,但我希望这能有所帮助。

作为Rainer Joswig,您不是在检查子集,而是在检查成员,您可以使用适当命名的函数来完成这项工作
Member
返回一个广义布尔值,即
nil
表示false,不一定
t
,非
nil
表示true。具体来说,如果元素是列表的成员,
member
返回第一个元素为元素的列表的尾部

CL-USER> (member 3 '(1 2 3 4 5))
(3 4 5)
CL-USER> (member 7 '(1 2 3 4 5))
NIL
当然,在检查列表中的成员资格时,存在一个问题,即如何将给定项与列表中的元素进行比较
Member
的默认比较是
eql
,它可以处理数字之类的事情,如上面的示例所示。但是,对于您的情况,您可能希望使用
equal
进行测试,因为
((1 2 3))
可能与
((1 2 3))((4 5))的第一个元素不是同一个对象:


第一个列表如何成为第二个列表的子集???因为第二个列表的第一个元素等于第一个列表。这不是子集。那是会员资格。第一个列表是第二个列表的成员,但不是子集。我为不正确的措辞道歉。那么我该如何解决成员资格问题呢?
member
检查给定元素是否是列表的顶级元素
subsetp
检查列表1的每个元素是否都是列表2的顶级元素。如果您想检查成员资格,可能这正是您想要的:
(成员“((1 2 3))”((1 2 3))((4 5)):test#'tree-equal)
CL-USER> (member '((1 2 3)) '(((1 2 3)) ((4 5))))
NIL
CL-USER> (member '((1 2 3)) '(((1 2 3)) ((4 5))) :test 'equal)
(((1 2 3)) ((4 5)))
CL-USER> (member '((4 5)) '(((1 2 3)) ((4 5))) :test 'equal)
(((4 5)))
CL-USER> (member '((1 2 4)) '(((1 2 3)) ((4 5))) :test 'equal)
NIL