kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Reasoned Schemer (008) member?とmembero

member?を翻訳して簡略化して試します
再帰をひとつずつたどっていったり
値を持たなかったり

member?はプロパーなリストでないとエラーになりますが
memberoは最後の要素が無視されるだけ
Schemeの関数から翻訳していますがSchemeの関数と同じ結果を出すわけではないんですね

というわけで?
プロパーなリストからだけ見つけてくれるproper-memberoを定義します

(defrel (proper-membero x l)
  (conde
    ((caro l x)
     (fresh (d)
       (cdro l d)
       (listo d)))
    ((fresh (d)
     (cdro l d)
     (proper-membero x d)))))

見つかったらそのcdrがプロパーなリストかどうかを見てるだけ
難しくはないですね
ただめんどくさくなってる

(run 12 l (proper-membero'tofu l))の値の順番がなぜこうなるのか謎

めずらしく、defrelの定義を示したあとで
それに対応するSchemeの関数の定義を示してます
どっち向きも翻訳できるよ、といいたいのかなんなのか