言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

制約

僕らが答えを望むとき、ある問題を入力し、答えが出てくるのを待つ。これはプログラム開発の低レベルな部分でもやはりこのようになっていて、オブジェクト指向では多くの小さな部品たちがお互いに質問しあいながら最後に僕らに何を答えたらよいのかを決定する。果たして僕らの質問は、問題から回答に向かって複雑な経路を辿る事になるが、一般にこの経路は一方通行で、答えから逆に問題を辿る事は出来ない。

一方で、僕らの望む質問の中には、単なる一つの問いと一つの答えではなく、制約の形を取るものも多い。ある面積が決められていて、縦の長さから横の長さを知りたい時、多くの場合同じように横の長さから縦が知りたくなる。価格から予算を決めたい場合は、同時に予算を先に決めてから価格を決めたくもなる。僕たちの世界が制約だらけで出来ている限り、コンピュータの世界も制約を上手く扱う仕組みが必要だ。

prolog は、理論的にはそういうシステムだ、prolog の述語は物事間の関係を表し、問題を解く方法を与える物では無い。ある関係を示す述語に、必要な条件を課す事によって、僕らは条件を満たすパターンをしらみつぶしに得る事が出来る。僕は最初 prolog と、その概念がイマイチ理解できなかった。それは、妙に人工知能がかった解説が理解できなかったからだ。prolog の動作は決して知能などではなく、単に情報をしらみつぶしに検索しているだけで、電卓を賢いと思う程度にしか賢くは無い。むしろ、制約システムを単なる表の操作くらいに思ったほうが、より理解が単純になるのでは無いかと思う。

[乗っている|りんご|オレンジ]
[乗っている|バナナ|りんご  ]

[上にある| X | Y ] とは [乗っている| X | Y ]
[上にある| X | Z ] とは [上にある  | X | Y ] かつ [乗っている| Y | Z ]

典型的な述語を、表っぽく書いてみたつもり(かえって分かりにくいかな?)
この定義によって、表

[上にある|りんご|オレンジ]
[上にある|バナナ|りんご  ]
[上にある|バナナ|オレンジ]

が生成されたのと同じ事になるので、これを元に検索を行う。

  • todo - ルールのスマートな表現
  • todo - 自然数の表的表現