测试列表的所有元素是否彼此不同

时间:2016-11-12 17:12:36

标签: lisp common-lisp

我有一个列表列表,想要测试所有元素是否彼此不同,即对于列表元素的所有组合,则equal应返回nil。

E.g。

(defparameter feld '((1 0 0 5 5 0) 
                     (0 0 0 0 0 0) 
                     (1 1 5 5 0 0) 
                     (0 1 0 1 5 5) 
                     (5 5 1 0 1 0) 
                     (1 0 1 0 5 5)))

我想过使用reduce,但据我所知,它只测试邻居的相等性,就像一个循环结构一样:

(loop for i below (length feld) 
      for j from 1 
          if (equal (nth i feld) (nth j feld)) return t)

有没有一种简单的方法使用我目前没有看到的标准构造,还是我必须创建一个递归函数?

整个数据结构代表一个“棋盘游戏”,其中每个列表都是棋盘上的一条线,而内部列表中的每个元素都是这个场的值。三个数值(0,1和5)类似于空,符号A和符号B.有效的板不能有两条相同的线。这就是我想要识别它们的原因。

基本上,它就像删除重复项而不删除。与此同时,我在考虑这样的事情:

(defun duplicates-p (lst)
  (cond ((null lst) '())
        ((member (car lst) (cdr lst)) t)
        (t (duplicates-p (rest lst)))))

1 个答案:

答案 0 :(得分:4)

这样的事情:

(defun unique (lsts &aux (h (make-hash-table :test 'equal)))
  (loop :for lst :in lsts
        :never (gethash lst h)
        :do (setf (gethash lst h) t)))