Prologで遅延実行

組み込み述語で「freeze(変数, 実行部分)」という述語があるらしい。この述語は遅延実行を実現してくれる。遅延実行とは、「変数の中身が決まるまで、実行部分の実行はお預け」という機能。
これを使うと何ができるかというと、例えば

?- Y is X*2, X=1.

は、「*」の計算が実行できないので、SWI-PrologならExceptionを吐く。そこで

?- freeze(X,(Y is X*2)), X=1.

とすると、Xの中身に1が入るまで、(Y is X*2)の実行がサスペンドされる。そしてX=1となった後に、サスペンド部分が実行され、Y=2になるというもの。これはいい。

なお、不定変数が2つ以上はどうすんの?とか思うかもしれないが、

?- freeze(Z,freeze(X, (Y is X*Z))), Z=2, X=3.

とすれば多分できるはず。

Constraint Logic Programを調べていて初めて知った。もっと早く知っておけばー。