section15

先週あたりからp210あたりで苦戦しています。
Lists in Structures , List in Structuresのところなのですが家系図を下にたどっていく問題で足踏み状態です。<原文 :http://www.htdp.org/2003-09-26/Book/curriculum-Z-H-20.html#node_chap_15>
以下、自分なりに考えてみた結果です。(未完)

(define (inc x)
  (+ x 1))

;;--------------------------------------------
(define-struct parent (children name date eyes )) ;家族のツリーを定義する

;youngest generation


(define Gustav (make-parent empty 'Gustav 1998 'blue))

(define Fred&Eva (list Gustav))  ;;children of Fred&Eva


;;Middle Generation

(define Adam (make-parent empty 'Adam 1950'yellow))
(define Dave (make-parent empty 'Dave 1955 'black))
(define Eva (make-parent Fred&Eva 'Eva 1955 'brown))
(define Fred (make-parent Fred&Eva 'Fred 1966 'pink))

(define Carl&Bettina (list Adam Dave Eva))


;; oldest Generation 

(define Carl (make-parent Carl&Bettina 'Carl 1926 'green))
(define Bettina (make-parent Carl&Bettina 'Bettina 1926 'green))</span>




;;exercises 15.1.2

"訳 parentを引数に取りそこから何世代目に青い目をした子供がいるかを調べる関数 <span style="font-style:italic;">how-far-removed</span>を定義してください。
もしparentが青い目をしていた場合、distanceは0;もし子供のうち誰かが青い目をしていたら1といったとなっていきます。仮にparentのツリーに青い目を持った人が誰もいなかった場合この関数はfalseを返します。"


(define (how-far-descendant? a-parent counter)
  (cond
    ((symbol=? (parent-eyes a-parent) 'blue) true)
    (else
     (how-far-children? (parent-children a-parent) (inc counter)))))

(define (how-far-children? aloc counter)
  (cond
    ((empty? aloc) false)
    (else
     (cond
       ((how-far-descendant? (first aloc) counter) counter)
       (else
        (how-far-children? (rest aloc) counter))))))


(define (how-far-removed? a-parent)
  (cond
    ((symbol=? (parent-eyes a-parent) 'blue ) 0)
    (else
     (how-far-descendant? a-parent 0))))

;;-------test------------

(how-far-removed? Gustav)  evaluate to : 0
(how-far-removed? Eva)     evaluate to : 1
(how-far-removed? Carl)    evaluate to :  cond: question result is not true or false: 2 (error) 

これだと二下層下まで繰り返したときに(carlからみて孫の誰かに青い目をした人がいるとき)condにtrue or falseではなく 2 が帰ってきてしまいます。
自分の考えでは、引数にとったparentの子供に対してhow-far-descendant?がtrueを返せば(+ conter 1)をして繰り返しemptyになったらcountを表示する。
ということをしたかったのですが・・・もうちょっと考えないと。