Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lisp 测试列表中的所有元素是否彼此不同_Lisp_Common Lisp - Fatal编程技术网

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

Lisp 测试列表中的所有元素是否彼此不同,lisp,common-lisp,Lisp,Common Lisp,我有一个列表,希望测试所有元素是否彼此不同,即对于列表元素的所有组合,equal应该返回nil 例如 我曾想过使用reduce,但据我所知,它只测试邻居的相等性,就像循环构造一样: (loop for i below (length feld) for j from 1 if (equal (nth i feld) (nth j feld)) return t) 有没有一种简单的方法可以使用我目前没有看到的标准构造,或者我必须创建一个递归函数 整个数据结构表

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

例如

我曾想过使用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)))))
(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)))
大概是这样的:

(defun duplicates-p (lst)
  (cond ((null lst) '())
        ((member (car lst) (cdr lst)) t)
        (t (duplicates-p (rest lst)))))
(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)))
大概是这样的:

(defun duplicates-p (lst)
  (cond ((null lst) '())
        ((member (car lst) (cdr lst)) t)
        (t (duplicates-p (rest lst)))))
(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)))

我发现这里的
finally
子句是多余和令人困惑的。虽然给定的问题不需要它,但更一般的函数将测试
gethash
的第二个返回值,而不是第一个,因此,空列表也不能出现两次。@svante两个空列表将正确计算为
nil
,因为每个当前键的值都是
t
。实际上,
最终不需要了。当我将
if
替换为
never
时,我没有考虑删除它。你说得对,我没有正确阅读。我的直觉是将项目本身保存在哈希表中,并测试是否存在,而不是值。这也有助于修改它,以显示错误消息中哪个值是“违犯者”。我发现这里的
finally
子句是多余和混乱的。虽然给定的问题不需要它,但更通用的函数将测试
gethash
的第二个返回值,而不是第一个返回值,因此,空列表也不能出现两次。@svante两个空列表将正确计算为
nil
,因为每个当前键的值都是
t
。实际上,
最终不需要了。当我将
if
替换为
never
时,我没有考虑删除它。你说得对,我没有正确阅读。我的直觉是将项目本身保存在哈希表中,并测试是否存在,而不是值。这也有助于修改它,以显示错误消息中哪个值是“违犯者”。