Может ли кто-нибудь дать мне несколько подсказок по этому вопросу (генеалогическое древо)?

Это происходит из моих домашних заданий. Есть генеалогическое древо

                             a  +  b
                         /   |    |   \ 
                        c+u  d+c  e+w  f
                     / | \        / \
                 m+x  n+y  o      p  q
                  |
                  r

а и б - самые старые. и каждый женатый человек второй человек не является частью первоначальной семьи. Теперь мне нужно написать супруга, брата или сестру, детей, внуков, родителей, бабушек и дедушек.

Я составил список, как показано ниже: ((отец мать) chlid1 child2 child3)

(((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 sibling  (arglst lst)  
 (cond
        ((eql 
             arglst (cdr (car lst))) 
                 (rest (cdr lst))
         )
   (T (sibling (rest lst) arglst))

)

Я знал, что это неправильно, но не знаю, как это исправить ... и мне также нужна помощь с другими функциями. Надеюсь, вы можете получить подсказки от вас, ребята.


person roccia    schedule 14.09.2011    source источник


Ответы (2)


Поскольку это домашнее задание, я не буду приводить полное решение, но этого должно хватить, чтобы вы решили остальное:

(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)

Теперь, чтобы найти, например, бабушку и дедушку, вам просто нужно понять, кто такие бабушки и дедушки: (Список) Родители обоих родителей. Затем спросите себя, как обстоят дела с внуками. Наконец, в этом примере функция spouse должна быть довольно простой.

person danlei    schedule 15.09.2011
comment
BTW: Также возьмите это как пример того, как отформатировать ваш код Lisp, особенно. как делать отступы, расставлять скобки и как называть переменные и параметры. - person danlei; 15.09.2011
comment
Что-то осталось неясным, или что-то вы не поняли? - person danlei; 16.09.2011
comment
да Это очень полезно, я только что закончил сегодня. есть одна вещь, которую я не могу решить. о функции супруга. смотри ответ продул плз .. - person roccia; 17.09.2011

Я не знаю, почему он может возвращать, например, только первый уровень и второй уровень. a возвращает b, c возвращает u. но когда я ввожу m, он возвращает ошибку:

- MEMBER: A proper list must not end with F.

Я проверил код и никаких проблем не обнаружил. почему он не может искать третий уровень? но он может найти внуков, поэтому я думаю, если он может выполнять поиск внуков, почему он не может выполнять поиск супруга? что-то не так с функцией Member? в любом случае, ваш код действительно прост, его легко читать и понимать. Большое спасибо.

(defun spouse ( family-tree2 person) ;Find person's spouse
   (remove person (car (find person family-tree2 :key #'car :test #'member)))
);end
person roccia    schedule 17.09.2011
comment
Проблема в том, что до того, как spouse дойдет до ((m x) r), он обрабатывает (f nil), где f не является списком. member подавляется этим. Попробуйте протестировать, является ли первый элемент списка списком, или измените представление для незамужних людей следующим образом: ((f) nil). (Еще один момент: не помещайте закрывающие круглые скобки в их собственные строки. Потребуется некоторое время, чтобы привыкнуть к этому, но другие программисты Lisp ожидают, что ваш код будет выглядеть определенным образом. Один читает отступы, а не круглые скобки. Используйте редактор с правильным соответствием паренте. Также: почему family-tree2, а не только family-tree или family?) - person danlei; 17.09.2011
comment
Спасибо, я думаю, что понял. family-tree2 - заданная моим учителем константа. - person roccia; 18.09.2011