Prolog"递归"询问

时间:2018-04-30 17:15:35

标签: prolog

我最近开始学习Prolog并遇到了一个问题。

有些人坐在桌子旁边。我们得到了事实sits_right_of(X, Y)(X坐在Y的右边)。然后我写了下一条规则:

  • sits_left_of(X, Y) :- sits_right_of(Y, X)(X位于Y左侧);
  • are_neighbors_of(X, Y, Z) :- sits_left_of(X, Z)(X左边坐Z,Y坐Z右边);
  • next_to_each_other(X, Y) :- are_neighbors_of(_, X, Y); are_neighbors_of(X, _, Y)(X坐在Y旁边)。

我怎样才能找出谁坐在某个人的右边(或左边)两个地方的人?是否有某种递归查询,如sits_right_of(sits_right_of(X, alex))?我是否需要编写另一条规则来查找谁n远离某人的位置?

1 个答案:

答案 0 :(得分:0)

您可以按照与输入过程相同的方式从过程中获取值。引入一个新变量并尝试满足sits_right_of(Y, alex)。然后,这也必须满足:sits_right_of(X, Y)。该过程可以这样定义:

sits_two_places_right_of(X, Y) :- sits_right_of(X, Z), sits_right_of(Z, Y).

是的,如果你想让它成为一个参数,可以为每个数字或人,或使用算术类似地创建这样的程序。