制約の拡散

SICP3章の復習。数学的モデルに見られる、多くの量の間の関係を制約とコネクタを用いてモデル化する話。

例えば機械構造の数学的モデルを見ると、金属棒のたわみdは、棒に加わる力F、棒の長さL、横断面積Aおよび弾性係数Eについて方程式、「dAE=FL」の関係があるという情報があったりする。こういう方程式は一方向性ではない。任意の4つの量があれば、それを使って五番目が計算できる。しかし方程式を伝統的な計算機言語に翻訳しようとすると、他の4つを使って計算する量を一つ選ばなければならない。断面積Aを計算するプログラムは、Aの計算もdの計算も同じ方程式から出たのに、たわみdの計算に使えない。

制約の拡散とは、こうした一つの基本要素(primitive constraints)が変更された際に他の要素へ伝播していくことを言う。この制約は簡易的なものではあるが、これら制約を組み合わせることによって複雑な計算を実現させ、また、自動的に変更を全体へと反映させようとする。

制約の拡散は、制約(constraint)とコネクタ(connector)を用いて実現する。コネクタは1つ以上の制約をリストとして持っており、制約に関わる値を「保持する」オブジェクトである。また、制約は自分が接続しているコネクタの値が変更された際に呼ばれる手続きを定義する。この制約をコネクタで接続して構成するネットワークを「制約ネットワーク(constraing networks)」と呼ぶ。

コネクタのオブジェクトには内部定義で「値の変更(set-my-value!)」と「値の削除(forget-my-value)」を定義されている。定義したコネクタに対して振る舞いを与えると、制約の拡散は実行される。たとえば、set-value!によって値が変更された場合は、接続している制約の手続きを順に呼び起こしていく。このようにして、その手続きで他のコネクタの値が変更されれば、値の変更が伝播していくという仕組みとなる。

例えば、カ氏の温度Fとセ氏の温度Cの間には「9C=5(C-32)」という関係が成り立つ。この関係を基本加算器と乗算器と定数の制約によりネットワークを構築することが出来る。

このネットワークを動かすと下記ようにF値が導き出せる。

Probe: c = 25
Probe: f = 77

コネクタには、現在の値であるvalue、オブジェクトのinformant、コネクタが関わる制約リストのconstraintsという局所状態変数を持たせる。コネクタはいくつかの内部手続きを持っており、meはそれらの内部手続きの振分けの役割を持ち、オブジェクトに渡される命令により動きを変える。


やっていることは非常に単純で、制約をリストでネットワークに保持させることで、コネクタが持つ値の変更をイベント駆動として、順に実行して伝播させていく、というやり方。一番重要なのは、やっぱりオブジェクトを定義するところで、あとは構文インターフェースによって外からは簡素化されて利用されるようになっている。

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.