2016-07-05 55 views
1

我有幾個Prolog事實表明某事或某人是人,地點或對象。我有一個條款去(人,地點),表明一個人從他們的位置移動到條款中給出的位置。但是,當我詢問相關查詢以確定某人是否在某個位置時,Prolog會根據這些條款與所有曾經在那裏的人進行響應。我該如何着手編寫一條規則,說如果你在一個地方,你根據定義不在任何其他地方?小環境的序言規則

+0

老風格是'update_person_pos(Pers的,POS):現在,您可以通過確保沒有後來的「走出去」命令爸得到的最新位置 - 收縮(人(人數,_OLD)),斷言(人(Pers,Pos)) – CapelliC

回答

3

看起來您在將事件建模爲Prolog事實時留下了一個重要方面:確實人員去了位置?

假設你有形式,而不是事實:

 
person_went_to_at(Person, Location, Time). 

那麼這將是很容易確定,在任何時間點,在那裏每個人都和他們搬到 到最後(和,因此,現在是 )。

0

您可能需要將時間信息添加到您的事實。想象一下以下situtation:

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

由於Prolog是(或多或少)聲明,在這種情況下,事實的文件,在實際的順序並不重要。所以,你不能斷定爸爸在廚房裏,他可能已經開始回到車庫了。即使您添加某種起始謂詞(如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).