【问题标题】:Prolog rules for small environment小环境的 Prolog 规则
【发布时间】:2016-11-07 11:23:38
【问题描述】:

我有几个 Prolog 事实表明某物或某人是人、位置或对象。我有一个子句 go(person,location) 表示一个人从他们所在的位置移动到子句中给定的位置。但是,当我询问相关查询以确定某人是否在某个位置时,Prolog 会根据条款对曾经在那里的每个人进行响应。我该如何编写一条规则,说明如果您在一个位置,则根据定义,您不在其他任何位置?

【问题讨论】:

  • 旧样式是update_person_pos(Pers, Pos) :- retract(person(Pers, _Old)), assert(person(Pers, Pos)).

标签: prolog rules


【解决方案1】:

在将情况建模为 Prolog 事实时,您似乎遗漏了一个重要方面:什么时候该人去了该地点?

假设您有以下形式的事实:

person_went_to_at(人员,位置,时间)。

那么就很容易确定,在任何时间点,每个人都在哪里,以及他们最后搬到哪里(因此,现在是)。

【讨论】:

    【解决方案2】:

    您可能需要在事实中添加时间信息。想象以下情况:

    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 ).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多