等价类LISP

等价类LISP,lisp,class,equivalence,Lisp,Class,Equivalence,我需要为等价类编写一个程序,并得到这个输出 (equiv '((a b) (a c) (d e) (e f) (c g) (g h))) => ((a b c g h) (d e f)) (equiv '((a b) (c d) (e f) (f g) (a e))) => ((a b e f g) (c d)) 基本上,集合是一个顺序无关紧要的列表,但元素不会出现多次。 函数应该接受一组对(根据某些等价关系相关的元素),并返回一组等价类,而不使用迭代或赋值语句(例如,do

我需要为等价类编写一个程序,并得到这个输出

(equiv '((a b) (a c) (d e) (e f) (c g) (g h))) 
 => ((a b c g h) (d e f))

(equiv '((a b) (c d) (e f) (f g) (a e)))
 => ((a b e f g) (c d))
基本上,集合是一个顺序无关紧要的列表,但元素不会出现多次。 函数应该接受一组对(根据某些等价关系相关的元素),并返回一组等价类,而不使用迭代或赋值语句(例如,
do
set!
,等等)

但是,允许使用设置实用程序,例如
设置交叉点
设置并集
,以及消除列表中重复项的函数和内置函数
并集
交叉点
,以及
删除重复项

非常感谢


顺便说一下,这不是家庭作业问题。我的一个朋友需要这段代码来解决一些可笑的问题。

这听起来像是一个典型的家庭作业问题

不过,这并不难

输入列表上的一个简单递归函数就可以了。任务描述中已经提到了函数的组成部分:简单的集合操作

如果是家庭作业,那么这是适用的:家庭作业问题的典型策略是,你必须首先展示你的解决方案。这至少应该是一个基本正确的算法公式或几乎可以工作的代码。然后Lispers可能会帮你完成最后的润色

时间流逝,没有解决办法

下面是一个使用公共Lisp的示例:

我们需要三个功能

第一个函数将单个对添加到对集合中。一对就是一张单子。成对的集合是成对的列表。对于对,我们计算两个集合:等价的对集合和不等价的对集合。我们将与输入对等效的对组合成一个集合

(defun equiv-add (e l)
  (let ((l- (remove-if     (lambda (i) (intersection e i)) l))
        (l+ (remove-if-not (lambda (i) (intersection e i)) l)))
    (cons (remove-duplicates (reduce #'union (cons e l+)))
          l-)))
第二个函数将一组对中的每一对添加到结果中。它通过调用EQUIV-ADD来添加它们

(defun equiv-aux (list result)
  (if (null list)
      result
    (equiv-aux (rest list)
               (equiv-add (first list)
                          result))))
第三个函数只调用带有输入集和空结果的EQUIV-AUX。此外,它对结果子列表进行排序

(defun equiv (list)
  (mapcar (lambda (el)
            (sort el #'string-lessp))
          (equiv-aux list '())))
电话示例:

CL-USER 34 > (equiv '((a b) (c d) (e f) (f g) (a e)))
((A B E F G) (C D))

CL-USER 35 > (equiv '((a b) (a c) (d e) (e f) (c g) (g h))) 
((A B C G H) (D E F))

如果这是家庭作业,你能把它标记为家庭作业吗?如果你这样做了,你会得到更合适的答案。对我来说,听起来像是家庭作业…谁定义了限制(没有迭代…),为什么?因为这是一本书中的问题。。。