我的目标是创建一个谓词,检查给定列表是否包含占据某些其他列表中某些位置的元素。
更准确地说,我正在寻找一个谓词,如果列表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很新,请原谅我,如果我的要求非常明显,但过去几个小时我一直在考虑这个问题,并且无法理解发生了什么。
答案 0 :(得分:1)
好的,我想我明白了。当我写[H|T]
时,H是一个元素,T
是一个列表。因此,在[H,T]
上调用谓词并不等同于调用由L
创建的append(H,T,L)
上的谓词。