prologは基本的には自由変数には1度しか値を入力できず、処理の途中で書き換えることはできない。
唯一書き換えられるタイミングはバックトラックで、バックトラックが発生するとchoice point以降の処理で設定した自由変数が全て未設定の状態になる。
しかし、attributed variableという、自由変数の属性値のような変数があり、これは変更が可能なようだ。
これは結び付けられた自由変数が設定されるとunify_hookというゴールが駆動されるようになっているようだ。
しかもattributed variableは変更の履歴情報を持っており、バックトラックで以前の値が復活されるような感じらしい。
ちょっとまだ仕組みが良く分からないが、clpfdライブラリのソースをみるとこの仕組みが多用されているのがわかる。
他にfreeze,meltという述語があり、これも自由変数に値を設定するとfreezeにより結び付けられたgoalが自動的に実行されるような仕組みになっている。whenとかいう述語はfreezeの条件付バージョンのようだ。
freeze,meltは30年くらい前の書籍であるart of prologにも記述があるので、かなり歴史のある述語のようだ。
freeze,meltはclpfdのソースでは使っていないようだ(→改めてgrepしてみると使ってる場所ありました 2016/10/04)
clpfdのソースは自分にとってはかなり難解で、Prologの基本レベルの文法を押さえただけではまったく理解することが出来ない。
気長に解析していこうと思う。