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
を作ったり、
作った関係をいろいろ動かして試したり