我正在尝试浏览列表列表,如果指定值在给定行中出现两次,则返回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在第一行中会出现两次。
答案 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
请注意,这是一个非常简单的实现,也许有更好的方法可以解决此问题。