Lisp 有人能给我一些关于这个问题(家谱)的提示吗?

Lisp 有人能给我一些关于这个问题(家谱)的提示吗?,lisp,common-lisp,clisp,Lisp,Common Lisp,Clisp,它来自我的家庭作业。有一棵家谱 a + b / | | \ c+u d+c e+w f / | \ / \ m+x n+y o p q |

它来自我的家庭作业。有一棵家谱

                             a  +  b
                         /   |    |   \ 
                        c+u  d+c  e+w  f
                     / | \        / \
                 m+x  n+y  o      p  q
                  |
                  r
a和b是最老的。而每一个已婚的人,第二个人都不是原来家庭的一部分。 现在我需要编写配偶、兄弟姐妹、子女、孙子女、父母和祖父母函数

我写的清单如下: ((父亲母亲)孩子1孩子2孩子3)

我对同级函数有一些问题,下面是我的代码

(defun sibling  (arglst lst)  
 (cond
        ((eql 
             arglst (cdr (car lst))) 
                 (rest (cdr lst))
         )
   (T (sibling (rest lst) arglst))

)

我知道它错了,但我不知道如何修改它。。我还需要一些其他功能的帮助。希望你们能给我一些提示

因为这是家庭作业,我不会给出完整的解决方案,但这应该足以让您解决其余问题:

(defparameter *family* '(((a b) c d e f)
                         ((c u) m n o)
                         ((d v) nil)
                         ((e w) p q)
                         (f nil)
                         ((m x) r)
                         ((n y) nil)
                         (o nil)
                         (p nil)
                         (q nil)))

(defun siblings (person family)
  "Return a list of PERSON's siblings."
  (remove person (cdr (find person family :key #'cdr :test #'member))))

(defun siblingsp (person1 person2 family)
  "Are PERSON1 and PERSON2 siblings?"
  (find person2 (siblings person1 family)))

(defun parents (person family)
  "Return a list of PERSON's parents."
  (car (find person family :key #'cdr :test #'member)))

(defun parentp (parent child family)
  "Is PARENT a parent of CHILD?"
  (find parent (parents child family)))
试试看:

CL-USER> (siblings 'p *family*)
(Q)
CL-USER> (siblingsp 'q 'p *family*)
P
CL-USER> (parents 'p *family*)
(E W)

比如说,要找到祖父母,你只需要了解什么是祖父母(父母双方的父母列表)。然后,问问你自己,这对孙子孙女们有什么好处。最后,考虑到这个例子,
配偶
函数应该相当简单。

我不知道为什么它只能返回第一级和第二级。a返回b,c返回u。但当我输入m时,它返回一个erro:

-成员:正确的列表不能以F结尾

我检查了代码,没有发现任何问题。为什么它不能搜索第三级?但它可以找到孙子,所以我想如果它可以做孙子搜索,为什么它不能做配偶搜索呢?
成员
功能是否有问题?总之,您的代码非常简单,易于阅读和理解。非常感谢

(defun spouse ( family-tree2 person) ;Find person's spouse
   (remove person (car (find person family-tree2 :key #'car :test #'member)))
);end

顺便说一句:还以这个为例,介绍如何格式化Lisp代码,特别是如何缩进、放置参数以及如何命名变量和参数。是否有什么不清楚的地方,或者您不理解的地方?是的,非常有用,我今天刚刚完成。有一件事我不能解决。关于配偶功能。问题是,在
配偶
到达
((mx)r)
之前,它处理
(f nil)
,其中
f
不是一个列表<代码>成员被它卡住了。试着测试一下,列表的第一个元素是列表,还是像这样更改未婚者的表示:
((f)nil)
。(另一件事:不要在他们自己的行上加上右括号。这需要一点时间来适应,但其他Lisp程序员希望您的代码看起来有一定的方式。一个是读取缩进,而不是括号。使用具有适当paren匹配的编辑器。还有:为什么
家族树2
而不仅仅是
家族树
家庭
?)谢谢,我想我明白了。家谱是我的老师给我的一个恒量。
(defun spouse ( family-tree2 person) ;Find person's spouse
   (remove person (car (find person family-tree2 :key #'car :test #'member)))
);end