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