3

それは私の宿題から来ています。家系図があります

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

a と b が最も古い。そして、すべての既婚者は、二人目は元の家族の一員ではありません。次に、配偶者、兄弟、子供、孫、両親、祖父母の関数を記述する必要があります。

私は以下のようにリストを書きました: ( (父母) 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))

)

私はそれが間違っていることを知っていましたが、それを修正する方法がわかりません..また、他の機能についても助けが必要です。皆さんからヒントが得られることを願っています。

4

2 に答える 2

1

これは宿題なので、完全な解決策は示しませんが、残りを解決するにはこれで十分です。

(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この例を考えると、関数はかなり簡単なはずです。

于 2011-09-15T08:44:33.403 に答える
0

たとえば、第 1 レベルと第 2 レベルしか返せない理由がわかりません。a は b を返し、c は u を返します。しかし、mを入力すると、エラーが返されます:

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

コードを確認しましたが、問題は見つかりませんでした。なぜ第 3 レベルを検索できないのですか? でも孫は検索できるので、孫検索ができるのに配偶者検索ができないのはなぜだと思いますか?機能に何か問題がありMemberますか?とにかく、あなたのコードは本当にシンプルで読みやすく、理解しやすいです。どうもありがとう。

(defun spouse ( family-tree2 person) ;Find person's spouse
   (remove person (car (find person family-tree2 :key #'car :test #'member)))
);end
于 2011-09-17T01:06:52.423 に答える