ECLiPSe谓词,用于检查列表是否包含具有另一个列表中某些位置的元素

时间:2016-12-13 18:31:52

标签: prolog logic

我的目标是创建一个谓词,检查给定列表是否包含占据某些其他列表中某些位置的元素。

更准确地说,我正在寻找一个谓词,如果列表L内部有元素,它表示由展平列表表示的NxN数组A的行,则该谓词是真的C。例如,如果A = [[0,1],[1,1]], C = [0,1,1,1], L = [1,1], N=2,则predicate(L,C,2)应为真。

我的尝试如下(假设L至少有2个元素):

row([H1,H2|T],C,N) :- M is N*N-N+1, X::1..M, X #= N*_ + 1, 
                      nth1(X,C,H1), Y is X+1, nth1(Y,C,H2),
                      nextr([H2,T],C,Y).

nextr([H1,H2|T],C,Y) :- nth1(Y,C,H1), Z is Y+1, nth1(Z,C,H2), 
                        nextr([H2,T],C,Z).

nextr([H1,H2],C,Y) :- nth1(Y,C,H1), Z is Y+1, nth1(Z,C,H2).

row谓词确保L的第一个元素在C中占据一个位置,表示数组A中新行的开头,另外还有检查L的下一个元素也是C中的下一个元素。然后,nextr谓词只检查后一种情况。

在我看来,这应该工作得很好。可悲的是 - 它没有,row([0,1],[0,1,1,1],2).输出No :(

编辑:好的,这是我注意到的一个愚蠢的例子。但无论如何 - 它在row([1,2,3],[1,2,3,4,5,6,7,8,9],1).上无效,但在Yes输出row([1,2|3],[1,2,3,4,5,6,7,8,9],1).我无法得到它。

我对Prolog很新,请原谅我,如果我的要求非常明显,但过去几个小时我一直在考虑这个问题,并且无法理解发生了什么。

1 个答案:

答案 0 :(得分:1)

好的,我想我明白了。当我写[H|T]时,H是一个元素,T是一个列表。因此,在[H,T]上调用谓词并不等同于调用由L创建的append(H,T,L)上的谓词。