2017-11-27 8 views
0

部屋の状態を表すために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つのオプションは、すべての事実がわかっていれば空の となる割当てリストを返すことです。

+0

'window/1'を動的に宣言し、事実が存在しない場合に' window(X) 'クエリが失敗するようにします。 ': - dynamic(window/1).' – lurker

+0

事実が存在しなければ理想的には失敗したくありません。私はそれがそのような事実を加えることによって成功するだろうと私に伝えたい。 – Claudio

+0

もちろん、そのような事実を定義することで成功するでしょう。だからあなたはそれが何を意味するのか分かりません。それを動的に宣言することなく、事実または述語を介して照会に一致するものがなければ、存在しないというインタプリタ・エラーが発生します。動的に宣言して照会を作成しても存在しない場合、照会は単にファクト/述部が存在するかのように失敗しますが、一致するものは存在しません。たぶん、あなたの質問にもっと明確な例が必要かもしれません。 – lurker

答えて

0

真実が何であるかをあなたに与えメタインタプリタを書く、例えば、

prove(Goal, True) :- 
    phrase(prove(Goal), True). 

prove(true) --> 
    !. 
prove((A,B)) --> 
    !, 
    prove(A), 
    prove(B). 
prove((A;B)) --> 
    !, 
    ( prove(A) 
    ; prove(B) 
    ). 
prove(Fact) --> 
    [Fact], 
    { clause(Fact, Body) }, 
    prove(Body). 

は今、window(_)与え、我々が得る:バリエーションの

?- prove(temperature_trend(decrease), L). 
L = [temperature_trend(decrease), window(open)]. 

ロットが可能です!

+0

理想的には、私には「新しい」事実だけを伝えたいと思います(したがって、「ウインドウ(オープン)」のみ)。しかし、それは間違いなく正しい方向への一歩です。私はこれでいくつかの実験を行います。 – Claudio

関連する問題