kb84tkhrのブログ

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

Reasoned Schemer (007) list?とlisto、など

3. Seeing Old Friends in New Ways

再帰出てきました

(define (list? l)
  (cond
    ((null? l) #t)
    ((pair? l) (list? (cdr l)))
    ((#t #f))))

翻訳だけすると

(defrel (listo l)
  (conde
    ((nullo l) #s)
    ((pairo l) (fresh (d)
                 (cdro l d)
                 (listo d)))
    (#s #u)))

ほぼそのままですね

#sの掟
conde行のトップレベルにある#sは取り除くことができる

を使うと

(defrel (listo l)
  (conde
    ((nullo l))
    ((fresh (d)
       (cdro l d)
       (listo d))))

まで簡単にできます

  • (run* x (listo `(a b c . ,x)))は値を持たない

値を持たない、っていうのは()を返す、っていう意味ではないんだな
帰ってこないってことなんだ
(run 1 x ...)ってやると値が取れる、っていうのは
遅延ストリームをちょっと連想するけど的を射ているかどうかは不明

run*が値を持たないっていうのはそういうことだとして
ゴールが値を持たないっていうのも同じ理解でいいのかな?
そもそもゴールってなんだっけ?

  • goal: 何かしら成功したり失敗したり値を持たなかったりするもの

しか聞いてないんですけど?
(listo `(a b c . ,x)))もゴールでいいのかな?
自由変数があってもいいんだろうか
ほかに値なしになりそうなのは・・・

(defrel (eternity) (eternity))(eternity)とやっても値なしか
これでエラーにならずに通るかはわからないけど気持ちは通じたと思う

このあとlol?(list of lists?)を翻訳してloloを作ったり、
singleton?を翻訳してsinglotonoを作ったり、
作った関係をいろいろ動かして試したり