Prolog坐标检查

时间:2018-12-12 18:03:52

标签: list prolog

我正在尝试浏览列表列表,如果指定值在给定行中出现两次,则返回true。例如

%B is a list of lists such the positions of x are denoted by the values
[[1,1],[2,3],[3,2]] would be visualized like:
x--
--x
-x-

,这些坐标将由B表示 所以是方法foo(B),其中B =

[[1,1],[1,3],[2,3],[3,3]] = true

因为x在第一行中会出现两次。

1 个答案:

答案 0 :(得分:0)

如评论部分所述,您需要检查列表中的两个对是否具有相同的X坐标。因此,想到的第一个解决方案可能是这样的(添加了一些writeln以取消显示值):

j = 0

谓词j < N-1检查作为第二个参数传递的列表中是否存在第一个元素。运行查询solution1(L):- member([X,Y1],L), member([X,Y2],L), writeln([X,Y1]), writeln([X,Y2]). ,我们得到以下结果:

member/2

嗯,很多解决方案,并不是我们想要的。问题之一是,以这种方式编写的?- solution1([[1,1],[1,3],[2,3],[3,3]]).会检查整个列表,因此在每种情况下我们都可以找到解决方案,因为第一次调用?- solution1([[1,1],[1,3],[2,3],[3,3]]). [1, 1] [1, 1] true [1, 1] [1, 3] true [1, 3] [1, 1] true [1, 3] [1, 3] true [2, 3] [2, 3] true [3, 3] [3, 3] true 时选择的每一对都在列表中。使用第二个member/2,我们可以选择相同的元素,以便谓词成功。 为了避免这种行为,我们可以编写如下谓词:

memeber/2

使用第二个谓词,我们检查所选元素是否在列表的其余部分中,因此我们从搜索中排除了该元素本身,并且仅获得了一个解决方案。

member/2

请注意,这是一个非常简单的实现,也许有更好的方法可以解决此问题。