0

我需要一个可以检查 list 是否是 lista的适当子集的函数b。到目前为止,我的代码是:

(defun proper-subset (a b)
    (cond
    (( or (null b)(null b)) nil)
    ((equal a b) nil)
    ((find (car a) b) (proper-subset (cdr a) b))
   )
)

find检查 的每个元素a是否在b. 我知道空参数也需要一些工作,但我试图弄清楚如何确定何时a找到每个元素bb具有另一个元素。有一些内置函数可以让这变得更容易,但是这是一个家庭作业问题,所以我必须自己编写。任何提示或建议将不胜感激。

4

2 回答 2

3

Common Lisp 定义了许多将列表作为集合处理的函数,因此您无需编写自己的函数。特别是,有用的功能出现在The Conses Dictionary的底部。特别有用的是

subsetp 几乎可以满足您的要求,但它正在检查不正确的子集。但是,请注意您可以使用这些函数来计算您需要的内容。最直接的方法是检查A是否是B的子集,以及B - A ≠ {}是否。这符合您的描述,“a 的每个元素都在 b 中找到,b 有另一个元素”。

(defun proper-subsetp (a b)
  (and (subsetp a b)                       ; every element of a is found in b
       (not (endp (set-difference b a))))) ; b has another element
CL-USER> (proper-subsetp '(1 2 3) '(1 2 3 4))
T
CL-USER> (proper-subsetp '(1 2 3 4) '(1 2 3 4))
NIL

由于这些函数实际上采用了一些参数,这些参数可以让您确定如何比较元素。您可以使用&rest参数添加这些并应用:

(defun proper-subsetp (a b &rest keys)
  (and (apply 'subsetp a b keys )
       (not (endp (apply 'set-difference b a keys)))))

使用它,您可以比较它们的长度,而不是直接比较元素:

CL-USER> (proper-subsetp '("a" "bb" "ccc") '("1" "22" "333") :key 'length)
NIL
CL-USER> (proper-subsetp '("a" "bb" "ccc") '("1" "22" "333" "4444") :key 'length)
T
于 2013-09-22T23:02:55.063 回答
0

以下内容仅添加if到您提到的一组操作中,但这确实是一种残酷的方法。如果那是他们教你的(你不是自愿的)。是时候买一本关于 Lisp 的好书并自己学习了。在我看来,这个练习真的毫无意义。

(defun purge (element from-list)
  (if (null from-list) nil
      (if (equal element (car from-list))
          (purge element (cdr from-list))
          (cons (car from-list) (purge element (cdr from-list))))))

(defun proper-subset-p (suspect of)
  (if (null suspect) (not (null of))
      (if (not (equal (purge (car suspect) of) of))
          (proper-subset-p
           (purge (car suspect) suspect)
           (purge (car suspect) of)) nil)))

同样的事情,但与cond

(defun purge (element from-list)
  (cond
    ((null from-list) nil)
    ((equal element (car from-list)) (purge element (cdr from-list)))
    (t (cons (car from-list) (purge element (cdr from-list))))))

(defun proper-subset-p (suspect of)
  (cond
    ((null suspect) (not (null of)))
    ((not (equal (purge (car suspect) of) of))
     (proper-subset-p (purge (car suspect) suspect) (purge (car suspect) of)))
    (t nil)))
于 2013-09-23T09:38:44.997 回答