我試圖預先計算一些東西和我的節目開始將結果保存爲事實:(簡化代碼)序言:含有斷言規則只添加了第一個結果,以事實
:- dynamic cost/2.
%recipe(Id,Cost)
recipe(1,20).
recipe(2,40).
assert_all :- recipe(Id,Cost), assert(cost(Id,Cost)).
但只有第一結果,當我在協商的Prolog SICStus文件成本(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
我覺得這種行爲很混亂,發生了什麼事?
嘗試使用asserta在開頭保存您的結果:http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse48 –