私はいくつかのものを事前計算し、結果をプログラムの最初に事実として保存しようとしています:(簡略化されたコード)
:- dynamic cost/2.
%recipe(Id,Cost)
recipe(1,20).
recipe(2,40).
assert_all :- recipe(Id,Cost), assert(cost(Id,Cost)).
しかし、SICStus Prolog でファイルを参照すると、最初の結果 cost(1,20) のみがアサートされます。
| ?- assert_all.
yes
| ?- cost(Id,Cost).
Id = 1,
Cost = 20 ? ;
no
| ?
しかし、SICStus プロローグ コンソールで assert_all の右側を直接入力すると、両方のコスト/2 ファクトが存在します。
| ?- recipe(Id,Cost), assert(cost(Id,Cost)).
Id = 1,
Cost = 20 ? ;
Id = 2,
Cost = 40 ? ;
no
| ?- cost(Id,Cost).
Id = 1,
Cost = 20 ? ;
Id = 2,
Cost = 40 ? ;
no
この動作は非常に紛らわしいと思います。何が起こっているのでしょうか?