SICP練習問題(1.5)解題まとめ:応用順と正則順

1877 ワード

SICPの練習問題1.5は主に関数パラメータの評価方式を述べ,応用シーケンスと正則シーケンスを含む.
問題を解く前に、自分が応用序と正則序についてまだよく分からないことに気づいたら、1.1を見直す必要がある.5節「プロセス応用の置換モデル」は、応用序と正則序をより明確に理解した後、練習問題1.5を解くのが簡単である.
まず問題を見てみましょう.テーマはBen Bitdiddleという人が検出方法を発明しました.解釈器が使用する評価シーケンスを決定することができます.解釈器が適用シーケンスを使用するか、正規シーケンスを使用するかを判断することです.
彼の方法は次の2つのプロセスを定義することです.
(define (p) (p))

(define (test x y) (if (= x 0) 
		       0
		       y))

次に、次の式を実行します.
(test 0 (p))

問題は,解釈器がシーケンス評価を適用するとどのような状況が見られ,正規シーケンスであればどのような状況が見られるかを問う.
アプリケーションシーケンスと正規シーケンスを理解している学生は、コードを直接読んで結果を考えることができます.
よく分からないなら簡単な方法はmit-scheme環境で上記の過程を試してみることです.結果はあなたのmit-Scheme環境が「ハングアップ」したので、反応しなかったのです.mit-Schemeはアプリケーションシーケンスを使用しているので、解釈器が(test 0(p))の値を求めると、パラメータ0とパラメータ(p)の値を求めようとします.パラメータ0は何も求められません.すでに基本数字で、パラメータ(p)は求めにくいです.解釈器は(p)がプロセスであることを発見しました.それを実行して戻った結果は(p)で、そこでまた(p)の値を求めて、ずっと続けて、子孫は無限に潰れて、そこで解釈器は“死機”になりました.
より広く言えば、すべてのLisp解釈器はアプリケーションシーケンスを用いて評価される(SICP 1.1.5節終了部、中国語版11ページ参照)ため、以上の手順を実行すると、どのLisp環境でも解釈器が「フリーズ」する.
では、さらに考えてみると、解釈器が正則順であればどうなるのでしょうか.正規シーケンスであれば,インタプリタはまずパラメータの値を求めるのではなく,パラメータをプロセスに置き換えてプロセスを展開し,次に展開の結果に他のプロセスがあるかどうかを見て展開を続け,プロセスを完全に展開してから計算を行い,計算結果に基づいて帰約する.
(test 0(p)を展開すると
(if (= 0 0) 
	0 
	(p))

はい、今の問題は、上の展開の過程をどのように処理すべきか、ifを計算するか、それとも展開を続けるか(p)、展開を続けるか(p)なら同じように「ハングアップ」です.
このとき,問題の下の括弧部分にはifの計算に対して常に条件が成立するか否かを判断し,条件判断結果に応じて対応する式を選択して計算する仮定があることに注意する.
この仮定によれば,(if(=0)0(p))では0の部分しか計算されず,(p)の部分は計算されないので,この式は無限ループに入るのではなく0を返す.
以上はテーマの解答ですが、私個人の正則序に対する理解は少し違います.私は直観的に正則序の解釈器を実現させたら、私はずっと過程を展開して、展開が終わってから計算過程を始めます.この場合の問題はifプロセスを展開する必要があるかどうかであり,ifを展開すればどのように展開するかである.だから私が初めてテーマを作ったときに考えた結果、2つの評価シーケンスを使用すると、以上のプロセスが無限ループになります.もちろん、私は間違っています.テーマの後ろの括弧の仮定を無視したからです.
まとめて言えば、本の中のこの問題は応用序と正則序をもっとはっきり理解させたいので、さっき議論した細部にこだわる必要はありません.授業内容を正確に理解することが練習問題の目的です.