LISP:如何测试两个列表是否具有相同的元素?

seb*_*598 3 lisp equality list

我想编写一个函数,它将参数作为参数两个列表,并检查第一个元素中的每个元素是否包含在第二个元素中(元素的顺序无关紧要).该函数还将检查两个列表是否具有相同的长度(两个列表不能具有重复元素),因为如果不是,则该函数将返回nill/false.

例如:(ABCDEF)和(BEAFDC)具有相同的元素(nil)和(nil)具有相同的元素

(ABCDEF)和(ABCDEFG)没有相同的元素

问题是我只知道一些基本命令,我只能使用那些命令.这几乎是我所知道的所有命令:

CAR, CDR, LENGTH, NULL, MEMBER, NOT, AND, OR, NOT, MAPCAR, APPLY, DO, SETQ, LET
Run Code Online (Sandbox Code Playgroud)

到目前为止我编写了以下函数,但我不知道如何检查重复的成员,并且它对于我要检查的所有列表都不能正常工作:

(defun same-elem-p (lst1 lst2)
  (cond ((not (null lst1))
         (cond ((member (car lst1) lst2)
                (same-elem-p (cdr lst1) lst2))
               (t nil)))
        (t t))) 
Run Code Online (Sandbox Code Playgroud)

我希望我能够很好地解释这个问题.

Kir*_*ira 6

您可以定义一个函数,当列表包含另一个列表时,该函数返回true:

(defun member (x liste) 
   (cond
      ((null liste) ()) 
      ((equal (car liste) x) liste) 
      (t (member x (cdr liste))))) 

(defun inclus (liste1 liste2) 
   (cond 
      ((null liste1) t) 
      ((member (car liste1) liste2)(inclus (cdr liste1) liste2)) 
      (t ()))) 
Run Code Online (Sandbox Code Playgroud)

然后用它来确定两个列表是否相等:

(defun compare (liste1 liste2)
   (if ((and (inclus liste1 liste2) (inclus liste2 liste1)))
      (print "the 2 lists are equivalent")
      (print "the 2 lists aren't equivalent"))) 
Run Code Online (Sandbox Code Playgroud)