定理証明手習い (78) sub-var 〜 sub-e
やっと形式チェックではない処理
(sub-var vars args var)
変数に対応する引数
vars
変数のリスト
args
引数のリスト
var
変数
(sub-es vars args es)
(複数の)式の置き換え
(sub-e vars args e)
(単独の)式の置き換え
ここも複数の式を置き換える関数を作ってからその特殊系として単独の式の置き換えを作ってる
どうして単独の式の置き換えを使ってからmapするようなやり方をしないんだろうか
できそうな気がするけど
ここでは置き換えた項をさらに再帰的に置き換える、といったことはしてないですね
1ステップ分だけの置き換え
J-Bobはもともとそれしかやってないですしね
定理証明手習い (76) extend-rec 〜 defs?
(extend-rec defs def)
???
定義済みのリストに関数の新しい定義を追加してるんだけれども
ただ自分を呼ぶだけの関数を追加している
なんだこれ
(def-contents? known-defs formals body)
仮引数と本体が正しい形か
known-defs
は定義済みの関数・定理のリスト
いつもdefs
と言ってるのになぜここだけことさらにknownと言っているんだろう
チェックしてるのは仮引数に重複がないことと、本体が正しい式かということ
名前は渡されてもいない
(def? defs def)
正しい定義か
defs
が定義済みの関数・定理でdef
はこれから定義しようとしている関数・定理
まず、定理を定義している場合
まだ定義されていない名前で、仮引数と本体が正しい形であること
関数を定義している場合も
まだ定義されていない名前で、仮引数と本体が正しい形であること
ただし、定義済みリストに自分自身を追加している・・・
これかextend-rec
のやっていることは
関数・定理のリストに自分自身を追加しているというのは
再帰呼び出しを認めるっていうことだな
rec
はrecordかと思ってたけどrecursiveか
勘が悪かった
ここまで形のチェックばっかりやってきたけど
考えてみたら関数が全域だから形さえ合っていれば必ず値があるんだな
なにかが腑に落ちた
(defs? known-defs defs)
正しい定義の列か
known-defs
にdefs
の定義が順次追加されていくので、先に出てきた関数を呼ぶことが可能
定理証明手習い (75) step-args? 〜 seed?
(step-args? defs def args)
args
がdef
の正しい引数かどうか
組み込み関数に渡す引数はクォートされたリテラルでなければなりません。
そういうものだったっけか
はっきり認識できてなかったな
なにかそれっぽいものがあるとは思ってた気がするけど
こんなシンプルな条件だとは思ってなかった
(step-app? defs app)
正しい関数適用の形をしているか
(step? defs step)
ステップの形をしているか
ん、ステップは必ず関数適用だったか
ということはif
で始まっちゃいけないんだな
これも認識してなかった気がする
今更ながら
(steps? defs steps)
ステップの列かどうか
ここらへんから種
いったい何が書けるのか気になってたところ
seed
から見ていったほうが理解しやすそう
(seed? defs def seed)
seed
がdef
の種として正しいか
defs
は関数・定理の定義のリスト
def
は今定義しようとしている関数または定理
seed
は種
種として許されるのは
'nil
か、
関数の定義ならば、定義している関数の仮引数に含まれている変数のみを使った式、か
定理の定義ならば、帰納法の型であるもの
align
を定義するときの(wt x)
とか他の関数の(size x)
は条件を満たしてる
定理の定義についてはあとで
(induction-scheme? defs vars e)
e
が帰納法の型かどうか
defs
は関数・定理の定義のリスト
vars
は今定義しようとしている定理の仮引数
e
は種(帰納法の型)
帰納法の型として許されるのは、
関数適用であって、induction-scheme-for?
であるもの
(induction-scheme-for? def vars e)
def
はe
で呼んでいる関数の定義
vars
は今定義しようとしている定理の仮引数
e
が種になる式
この関数が真になるのは
e
で呼んでいるものが関数であって、
e
で呼んでる関数の仮引数の数とe
の引数の数が一致していて、
e
の仮引数に重複がなくて、
e
の引数が定義しようとしている定理の仮引数に含まれているとき
つまり
定義済みの関数に相異なる変数の列を渡した関数適用
ってことだな
(list-induction xs)
とかは大丈夫そうだし
align/align
のalign
も条件を満たす
小さな習慣が小さい
小さな習慣は続いてたり増えてたりします
いいことなんですけど、小さいままなんですよね
大きくしたいんだけど何かやめない限り大きくするすきまがない
うーん
残業?やっぱそこ?
ここんとこ少し増えてるからなあ
それでももう今さら途切れさせるのはもったいないと思って続けるくらいには
習慣づいてるのはプラスな面
でも最低限の目標だけクリアしとこうみたいな日が増えるのはマイナスな面
とりあえずこんな風になんか書いとくだけとかね
うむ