kb84tkhrのブログ

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

Reasoned Schemer (006) (Schemeからの)翻訳

nulloは見たまんま

(defrel (nullo x)
  (== '() x))

なんだけどじーっと見てるとわからなくなってきたり
これは#sとか#uとか返すやつ

pairoもやることは見たまんまなんだけど定義にはconsoを使う

(defrel (pairo p)
  (fresh (a d) (conso a d p)))

Is pairo recursive?

そうか、nulloが出てきたということは再帰が出てくるってことか

  • singletonは要素が一つのリスト
(define (singleton? l)
  (cond ((pair?l) (null? (cdr l)))
        (else #f)))

これは普通の関数

  • リストがプロパーであるとは、空リストか、cdrがプロパーであるペアであること

日本語にするのはあきらめた

  • singleton?singletonoに翻訳するには、else#tに置き換えておく必要がある

ふむ

翻訳(最初の版)
関数を関係に翻訳するには、まずdefinedefrelに置き換える。次に、ひとつひとつのcond行をunnestし、condcondeに置き換える。#t#sに、#f#uにunnnestする。

else#tにしておくのは、ルールを減らしたい、くらいのことかな

翻訳したもの

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

#uの掟
トップレベルのゴールに#uがあるconde行は値に貢献しない

とか使って簡単にすると

(defrel (singletono l)
  (fresh (d)
    (cdro l d)
    (nullo d)))

論理脳になればこういう表現が先に出てくるんだろうな
っていうかこれくらいならSchemeで書いて翻訳するより自分で1から考えたほうが速いか
最初にSchemeで作ってから翻訳するっていう書き方を推奨しているわけではあるまい
同じことが書けるよ!って言いたいんだろう

carocdroconsoで定義せよ

(defrel (caro p a)
  (fresh (d) (conso a d) p))
(defrel (cdro p d)
  (fresh (a) (conso a d) p))


でいいかな?
せっかく翻訳の手順教えてもらったのにこれっぽっちも生かしていませんが
いいのか?