2016-07-05 3 views
1

私はいくつかのPrologの事実が何か、誰かが人、場所、またはオブジェクトであることを示しています。私は、人がどこからその節に与えられた場所に移動することを示す節(人、場所)を持っています。しかし、私が関係する質問をして、誰かが特定の場所にいるかどうかを調べると、Prologはそこにあったすべての人に句に応じて応答します。あなたが1つの場所にいる場合、あなたは他のどの場所にも定義されていないというルールを書くにはどうすればいいですか?小さな環境のためのPrologの規則

+0

古いスタイルは 'update_person_pos(ペールス、POS)にした: - (人物(ペールス、_old))を後退させ、主張する(人(Pers、Pos))。 – CapelliC

答えて

3

Prologの事実をモデリングするときに、重要な側面が1つ残っているように見えます。人がその場所に行ったときは?誰もがした任意の時点、のために、決定するのは簡単だろう

 
person_went_to_at(Person, Location, Time). 

、と彼らはので、最後(とする を動かし場所:

は、フォームの代わりに事実関係を持っていたと仮定します現在は です)。

0

おそらく、タイミング情報をファクトに追加する必要があります。次situtation想像:プロローグは(多かれ少なかれ)宣言型であるので

go(dad, kitchen, bathroom). 
go(dad, bathroom, garage). 
go(dad, garage, kitchen). 

を、この場合には、ファイル内の事実の実際の順序は重要ではありません。だから、あなたは、お父さんが台所にいると結論づけることはできません。彼は出発してガレージに戻ったかもしれません。何らかの開始述語、たとえばstartLoc(dad, kitchen)を追加しても、これはループに役立ちません(たとえば、上記のルールにgo(dad, kitchen, outside)を追加する場合)。

あなたはタイミング情報を(これはタイミング情報から明らかなように、前の部屋を残して)追加した場合、これは次のようになります。

go(dad, bathroom,1). 
go(dad, garage,2). 
go(dad, kitchen,3). 

実際の数値は、ちょうど彼らの順序は関係ありません。あなたは今、後でお父さんとコマンドを「行く」何があることを確実にしないで最新の場所を取得することができます:

location(X, Y) :- go(X, Y, T), \+ (go(X, _, T2), T2 > T). 
関連する問題