prolog - 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
远离某人的地方?
解决方案
您从过程中获取值的方式与输入它们的方式相同。引入一个新变量并尝试满足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).
是的,可以为每个数字或人类似地创建这样的过程,或者使用算术,如果你想将它作为参数。
推荐阅读
- python - 如何在 PyQt5 中创建多个秒表计时器?
- c# - 无法从 API(dotNet Core)获取数据(使用角度)没有“Access-Control-Allow-Origin”
- axios - Svelte 中的 axios 循环依赖错误
- c# - Linq 方法的单元测试
- javascript - 将变量推送到包含变量的数组中 - Javascript
- go - Golang sql驱动程序,为什么我们需要将字节数组的切片作为参数传递给查询
- html - 这是设置自定义字体的正确方法吗?
- c++ - E0070 不完整类型不允许
- linux - linux中文件写入相关的查询
- linkedin - Linkedin API v2/人员权限问题