kb84tkhrのブログ

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

Reasoned Schemer (002) goal、run*、fresh、fuse

1. Playthings

相変わらず章タイトルは役に立ちそうにありません

  • goal: 何かしら成功したり失敗したり値を持たなかったりするもの
  • #s: 成功
  • #u: 失敗
  • run*: 成功する変数の組み合わせを探してリストで返してくれるなにか

たとえば(run* q (== q 'pea))の値は(pea)

  • The First Law of ==
    (== v w)(== w v)で置き換えることができる

freshという概念が出てくる

  • fresh: qがfreshといえばqは未確定とかなんでもOKとかそんな感じ

(run* q (== q 'pea))するとqはfreshではなくなるけど
(run* q #s)してもqはfreshなまま

  • どんな変数も最初はfresh
  • 変数でない値と関連付けられたり、freshでない変数を関連付けられたりすると変数はfreshでなくなる

  • (run* q #s)の値は(_0)

  • freshな値はアンダースコア+数字に具象化される

reifyは「to consider or represent (something abstract) as a material or concrete thing」だそうです
何かしら抽象的なものを物質的な/具体的なものと考える、だって
業界でなんと訳されてるかは不明だけど「具象化」で

  • fresh: freshな変数を導入する

(run* q (fresh (x) (== (cons x '()) q)))とか
ちなみに値は(_0)
この場合、qはなんでもありって訳にはいかないからfreshは未確定くらいの意味なのかな

  • `(,x)(cons x '())の短縮形

普通にquasiquoteのことだと思われます

  • fuse: ふたつの変数を同一とすること

融合と訳す

  • (run* q (fresh (x) (== x q)))とするとxqが融合する
  • different: ふたつの変数は、融合していなければ、異なるという
  • 異なる変数が具象化されるときは、アンダースコアに異なる数字をつける
  • 変数名が異なるだけのrun式は同じ値を持つ
  • (== `(,x) x)は決して成功しない
  • The second Low of ==
    xがfreshで、xvの中に現れなければ、(== v x)は成功してvxと結びつける