我有几个Prolog事实表明某物或某人是人,地点或物体。我有一个子句go(人,位置),表明一个人从他们所在的地方移动到子句中给出的位置。但是,当我询问相关查询以了解某人是否在某个位置时,Prolog会根据条款回复曾经在那里的每个人。我如何编写一条规则,说如果你在一个位置,根据定义,你不在任何其他位置?
在将情况建模为 Prolog 事实时,您似乎遗漏了一个重要方面:这个人什么时候去那个地方的?
假设您有以下形式的事实:
person_went_to_at(人、地点、时间)。
然后很容易确定,在任何时间点,每个人都在哪里,以及他们搬到 最后的位置(因此,现在)。
您可能需要将计时信息添加到您的事实中。想象一下以下位置:
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).
实际数字无关紧要,只是它们的顺序。您现在可以通过确保没有稍后与爸爸的"go"命令来获取最新位置:
location(X, Y) :- go(X, Y, T), + ( go(X, _, T2), T2 > T ).