SICP

質問システムの実装:断念

「4.4.4 質問システムの実装」では、10ページに渡って質問システムの具体的な実装内容が説明されています。何度か読んでみましたが、今の自分では理解することは難しいだろうと思って投げ出してしまいました。そのため問題も解いていません。悔しいですが、粘…

問題4-64〜66

「4.4.2 質問システムはどう働くか」「4.4.3 論理型プログラミングは数学的論理か」というトピックを何度か読みましたが、いまいち理解が深まっていません。次のトピックである質問システムの実装の部分を読み進めながら、このあたりにも戻ってこようと思ってい…

問題4-61〜62

「プログラムとしての論理」というトピックに取り組んでいます。規則を用いて、論理的推論を実行させるようなプログラムが紹介されています。 問題4-61。与えられたリストの中の隣同士の要素を見つけるnext-toについて考えます。(?x next-to ?y in ?list)とい…

問題4-55〜56

「4.4 論理型プログラミング」に入りました。宣言的(何である)知識を用いる数学的な方法でプログラムが登場します。その事例としてデータベースが取り上げられています。この節も、前の非決定性プログラミング/amb評価器と同様、最初に論理型プログラムの使い…

問題4-57〜60

「規則」を作れば、質問を抽象化することができるそうです。 問題4-57。person-1とperson-2が同じ担当か、person-1がperson-2の仕事もできる(can-do-job)の場合を洗い出し、これだけだと、person-1とperson-2が同じ人になってしまう可能性があるため、not条件…

amb評価器:断念

楽しみにしていた「4.3.3 amb評価器の実装」の節ですが、想像以上に難しく、5-6回読み返して、ああだこうだと試行錯誤しましたが、自分の中で完全に腑に落ちるまで理解を深めることはできませんでした。自分の無能さに直面して、若干気持ちが落ち込み気味です…

問題4-42

嘘つきパズルを解きます。ある人が試験の結果について、二つの証言をしているわけですが、その証言のどちらかが本当でどちらかが嘘だという条件です。そのため(or (and 証言1 (not 証言2)) (and (not 証言1) 証言2))ということになるのではないかと思いまし…

問題4-45〜49

「自然言語の構文解析」というトピックに取り組んでいます。与えられた文章の構文を解析するようなparse-sentenceを読解します。 問題4-45。「The professor lectures to the student in the class with the cat」は、以下の五種類の出力が考えられます。かなり…

問題4-38〜40

「4.3.2 非決定性プログラムの例」の一つ目として、与えられた条件に合致する組み合わせを見つけるというロジックを簡潔に書けることが示されています。 問題4-38。五階建てアパートがあって、どの階にどの住人が住んでいるのかを条件から判定する例が示されて…

問題4-35〜37

「4.2.3 遅延評価リストとしてのストリーム」の問題4-32〜34は飛ばしました。このトピックでは、ストリームからcarするまで遅延することができるということで、先頭要素さえも決まっていない状態でもストリームを扱うことができるということで、いろいろと使い…

問題4-30

eval-sequence内で渡された式の並びに対して、一つずつactual-valueをしなければならないのではないかというCyの疑問について考えます。 aでBenが書いている手続きが、evalでも上手く動く理由としては、例え並びの要素がthunkされていたとしても、それ自身が…

問題4-25〜26

「4.2 Schemeの変形 --- 遅延評価」に入りました。自前評価器を機能拡張していきます。こういうことができると、その機能を低水準言語やハードウェアに実装する前に、その動きを自前評価器を使ってシミュレーションすることができるということが冒頭に述べられ…

問題4-27〜28

「4.2.2 遅延評価の解釈系」では、合成手続きの引数は実際に必要とされるまで評価しない、ノンストリクトな正規順序的処理を行なうように自前評価器を改良します。applyの中で、procedureが合成手続きだったならば、渡された実引数にdelay-itしてthunk?という…

問題4-29

この問題では、メモ化するのとしないのとで、振る舞いがどう変わるかを調べます。下記のような定義が存在していて、 (define count 0) (define (id x) (set! count (+ count 1)) x) (define (square x) (* x x)) メモ化をしない場合は、 (square (id 10)) ;=…

4.1 超循環評価器

「4.1.7 構文解析を実行から分離する」の中にある問題4-22〜24は飛ばしました。解析と実行を分離すれば、同じ式を何度も解析しなくて済むようになるということはわかりましたが、一度解析された結果が、どこでどのように保持され、再利用されるのかということ…

問題4-21

問題4-18〜20は深追いしませんでしたが、感じたことを一応メモしておきます。 問題4-18については、別名の束縛変数に元々のdefine式の本体を放り込んで、その後にset!で投入するという方法のようですが、これだとsolveのdyの本体をbに束縛する時、その中でy…

問題4-15

「4.1.5 プログラムとしてのデータ」では、これまでに説明されてきた評価器は万能機械であるという視点について述べられています。プログラムそのものも、評価器にとってはデータなのだということで、非常に興味深く読み進めました。注釈19には、Turing機械に…

問題4-16

「4.1.6 内部定義」に入りました。四章の第一節もゴールが見えてきましたが、このトピックは問題が多く、しかも一筋縄では解けそうにないので、ちょっと参っています。 問題4-16を解く前に、問題4-6で定義した自前のletが正しく動くかを試してみました。結果は…

問題4-14

「4.1.4 評価器をプログラムとして走らせる」ということで、これまでに本文の中で登場してきた手続き達をコピペして、実際にevalを通せるようにしました。コピペなので動いて当然ですが、それでも今まで解読してきたことが実行されるのを確認できたということ…

問題4-11〜13

「4.1.3 評価器のデータ構造」では評価器の内部的なロジック、特に環境を操作するための定義の詳細について述べられています。「3.2 評価の環境モデル」を読み返しながら、本文で描かれているコードを解読していきました。 問題4-11。フレームの表現方法を変更し…

問題4-7〜8

問題4-7。nested-lets式を普通のlet式に変換します。以下のようなnested-lets式を、その下のlet式に変換することを目的とします。 ;;変換前 (let* ((x 3) (y (+ x 2)) (z (+ x y 5))) (* x z)) ;;変換後 (let ((x 3)) (let ((y (+ x 2))) (let ((z (+ x y 5)…

問題4-4〜6

問題4-4。andとorの式を扱えるようにします。eval手続き内で、 (define (eval exp env) (cond (..) ;;others ((and? exp) (eval-and (and-predicates exp) env)) ((or? exp) (eval-or (or-predicates exp) env)) ;;others )) のような型判別と評価を行なうこ…

問題4-2〜3

「4.1.2 式の表現」ということで、evalに渡された式が何者で、それをどう評価するべきなのかということが述べられています。渡された式が変数なのか、何かを定義するのか、純粋に作用させる式なのか。それらをcond式で判別して、式の形式がわかったら然るべき…

問題4-1

第四章「超言語的抽象(metalinguistic abstraction)」に入りました。本章の冒頭では、いきなり野心的なことが述べられています。 新しい言語を創設する超言語的抽象は、工学的設計のすべての分野で重要な役割を果す。これはプログラミングにおいて、新しい言語…

問題3-69〜70

問題3-69。pairsの拡張版であるtriplesを定義します。triplesの内部でpairsを使うという発想が浮かばなかったため、全ての組み合わせを洗い出せなかったり、同じ組み合わせが重複して出現してしまったりと、いろいろ試行錯誤してしまいました。Pythagorasの…

問題3-73〜76

「信号としてのストリーム」というトピックです。電気回路の仕組みについては興味はあるものの、なかなか手をつけられていないのが現状です。そのため、問題を一応は解いてはみましたが、問題に書かれていることをそのままコードとして表現しただけで、その正…

問題3-77〜78

「3.5.4 ストリームと遅延評価」に入りました。短いトピックですが、delayとforceに関する非常に興味深い内容が説明されています。まだまだ理解が曖昧なところもありますが、cons-streamの内部で行なわれているdelayに頼らなくても、明示的にdelayを定義するこ…

第三章、ひとまず終了

「第3章 標準部品化力、オブジェクトおよび状態」を読み終えました。代入や局所状態変数から始まり、ディジタル回路のシミュレータの動きを追いながら感動と苦悩を味わい、共有資源を扱う際に発生する問題点について考え、さらに、それを回避するための一つの…

問題3-66〜68

「対の無限のストリーム」というトピックで、任意の対を無限に並べたように見えるストリームを扱います。 問題3-66。本文に掲載されているpairsの動きを調べます。(pairs integers integers)がどのようなストリームになっているのかを100個くらい出力し、その…

問題3-63〜65

問題3-59〜62は、数学的な要素が多分に含まれていて、今の自分には問題を解いたとしても正否を判定できないので飛ばしました。 そんなわけで、「3.5.3 ストリームパラダイムの開発」に入りました。代入を使うことなく、何らかの計算結果をstreamに追加していき…