2016-05-17 5 views
1

にのみ、最初の結果を追加し、私はいくつかのものを事前計算し、私のプログラムの冒頭で事実として結果を保存しようとしている:(簡略化されたコード)プロローグ:アサートを含むルールは事実

:- dynamic cost/2. 
%recipe(Id,Cost) 
recipe(1,20). 
recipe(2,40). 

assert_all :- recipe(Id,Cost), assert(cost(Id,Cost)). 

しかし、唯一のしかしながら

| ?- assert_all. 
yes 
| ?- cost(Id,Cost). 
Id = 1, 
Cost = 20 ? ; 
no 
| ? 

場合直接SICStusプロローグコンソールのI入力assert_allの右側を、コスト/ 2の両方、私はSICStusプロローグでファイルを参照したときに最初の結果は、コスト(1,20)がアサートされます事実はそこにある。

| ?- 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 

この動作は非常に混乱していますが、どうなっていますか?

+0

最初に結果を保存するためにassertaを試してみてください。http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse48 –

答えて

2

元の句でfail/0を入れて、ちょうど成功した別の句を追加:起こっていただきました

assert_all:- 
    recipe(Id,Cost), 
    assert(cost(Id,Cost)), 
    fail. 
assert_all. 

は、あなたが書いたように、それはレシピの最初のコストを主張し、選択ポイントを残し、あなたの手順ということです。バックトラックすると、最終的に他の事実がアサートされます(バックトラックした場合は、Sicstusコンソールで;を押してより多くの選択肢を求めるときに起こります)。

この回答の失敗駆動ループは、recipe/2のすべてのソリューションをバックトラックし、そのコストをアサートします。次に、2番目の節が成功します。

+0

それは動作します、ありがとう、また説明のために! – Juraj

関連する問題