部屋の状態を表すためにPrologを使用しようとしています。中間変数の割り当てを取得する
私は一連のルールと一連の事実を持っていますが、事実のいくつかは で定義されていません。たとえば、部屋の温度は、 の冷却または窓の開放のために低下することがありますが、窓センサーがないことがあります。
% Rules
temperature_trend(decrease) :-
cooling(on).
temperature_trend(decrease) :-
window(open).
% Facts
cooling(off).
%window(close). % Unknown, I do not have a window sensor
% Main
main() :-
temperature_trend(decrease).
このプログラムを実行すると、undefined procedure
というエラーが発生します。私は を明示的にウィンドウ の状態をwindow(W).
と「何か」に設定することで対処することができます(プロローグ ソースをプログラムで準備するので、これは簡単です)。
window(W)
はwindow(open)
になるため、temperature_trend(decrease)
のクエリが成功しました。ただし、この の場合は、W = open
を知りたいと思います。
この事実のために変数の代入を返す方法はありますか?あるいは、私は間違った方法で問題に近づいていますか? ルールツリーは、例えば、私は新しいルールnext_temperature(lower) :- temperature_trend(decrease).
を追加することができますし、私はまだ がnext_temperature(lower)
がW = open
を設定することによってのみ成功することを知ってほしい、任意の深ことができることを
注意。また、時間インデックス(T = 232
)も持っているので、用語はより複雑です。
1つのオプションは、すべての事実がわかっていれば空の となる割当てリストを返すことです。
'window/1'を動的に宣言し、事実が存在しない場合に' window(X) 'クエリが失敗するようにします。 ': - dynamic(window/1).' – lurker
事実が存在しなければ理想的には失敗したくありません。私はそれがそのような事実を加えることによって成功するだろうと私に伝えたい。 – Claudio
もちろん、そのような事実を定義することで成功するでしょう。だからあなたはそれが何を意味するのか分かりません。それを動的に宣言することなく、事実または述語を介して照会に一致するものがなければ、存在しないというインタプリタ・エラーが発生します。動的に宣言して照会を作成しても存在しない場合、照会は単にファクト/述部が存在するかのように失敗しますが、一致するものは存在しません。たぶん、あなたの質問にもっと明確な例が必要かもしれません。 – lurker