我正在尝试预先计算一些东西并将结果保存为程序开头的事实:(简化代码)
:- 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 prolog 控制台中输入 assert_all 的右侧时,两个 cost/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
我发现这种行为非常令人困惑,这是怎么回事?