2011-09-12 30 views
1

次の問題があります。キューブをテーブルに作成するタワーがいくつかあります。プロローグで位置Aから位置Bへのキューブの移動

 a 
     b d 
     c e 
------------------- <- table 

今、私はこの1つのように、別の状況にキューブを移動したい:

 c e 
     a b d 
------------------- 

のPrologプログラムは、例えば、このような状況を取得するための手順を印刷する必要がありますようにmove cube a onto the tableをし、 。私はPrologで表された第1の状況がある:

clean(t). % t is the table, you can always put things there 
clean(X) :- \+ on(_,X). % X is the top element, if there is nothing above it 

on(a,b). % a is on b 
on(b,c). % b on c 
on(d,e). % d on e 
on(c,t). % c on the table 
on(e,t). % and e on the table 

今私の問題は、プロローグは新しい状況へのステップを印刷するようにする解決策を見つけることです。私の最初の問題は、Prologに新しい状況の様子を伝える方法です。私はいくつかのリストでそれを試しましたが、私は今まで成功していませんでした。

これを解決する方法はありますか?

+0

私は、他の事実、多分nextTo(a、b)のようなものを述べる必要があるかもしれないと思いますか? –

+0

nextToとはどういう意味ですか?左か右?それとも? – Tobias

+0

余計な事実がなければ、プロローグで新しい状況を印刷することができないかもしれないと言っていました。私は左右を意味していましたが、それがあいまいな場合は、別の識別子名を使用してみてください。 –

答えて

1

あなたは、データベース内on/2述語の事実を持っていることによって、問題の状態をエンコードする場合は、あなただけのデータベースを変更するassertretractを使用して、その状態を変更することができます(そして、あなたの述語は、おそらく同様にdynamicを宣言する必要があります) 。これは扱いにくいです。より良い解決策は、問題状態をパラメータとして解決述語に渡すことです(そして、その構造をラッパー述語の背後に隠すこともできます)。これは、おそらくあなたがソリューションの検索を実装する必要があるだろうバックトラックではるかに優れて動作します。

+0

あなたはそれについて私に例を示すことができますか? – Tobias

関連する問題