2008年11月11日火曜日

【PAIP】2 A Simple Lisp Program

二章の趣旨は、

"Chapter 2 is a more extended example showing how the Lisp primitives can be put together to form a program. It should be studied carefully by the novice, and even the experienced programmer will want to look through it to get a feel for my programming style."

とのこと。私はnorviceなので、しっかりやらなければいけないし、Norvigが、これがおれ様のプログラミングスタイルだ、というなら興味深いのでしっかりやりたい。


  • 2.1 A Grammar for a Subset of English
  • シプサでもやったな、これ。文脈自由文法。
  • あっさり。

  • 2.2 A Straightforward Solution
  • "a function with no arguments would always return the same thing" ごもっとも。関数は関数。
  • "..., but they are still called functions in Lisp, because they return a value" なるほど。
  • 関数による実装。できるといえばできる。
  • しかし文法が複雑になると、文法を記述するためにLispをごちゃごちゃかかねばならん。それをなんとかしたい。

  • 2.3 A Rule-Based Solution
  • で、文法を記述する、ということと、その文法に従って文を生成するということを分解して考えるのはどうか、ということ。
  • defparameterで定義したものを変更するのは人手であり、defvarで定義したものを変更するのはプログラムのrun-timeにおいてプログラムによって行われる。変更の頻度でいえば、defvarのほうが遥に高い。なるほど。

  • 2.4 Two Paths to Follow
  • 問題の解決をLisp codeとしてそのまま書き下すか、それとも、問題のできるだけ自然な表現をまず確立して、それのインタプリタを書く形で問題を解決するか。
  • AIプログラミングでは後者が有効な場合が多い。
  • Lispは後者が得意である。
  • 問題自身の言葉で記述できる限り記述して、直接Lispで書く部分を最小化せよ。なるほど。

  • 2.5 Changing the Grammar without Changing the Program
  • インタプリタ方式だと簡単に文法を変えられるよ。

  • 2.6 Using the Same Data for Several Programs
  • インタプリタ方式だと、作成済みの文法を別のプログラムの入力としても使えるよ。


Lispはやっぱ、LISt Processor なんだ、という実感。こういう具体的な問題への適用をイメージした形でリストの取り扱いに習熟するのが大事に感じた。これは実はPGのANSI-CLでも感じた。

はじめ、ちょろちょろ。

0 件のコメント: