我必须找到列表中的两个成员是否相邻。限制是使用append/3
谓词。到目前为止,我已经完成了下面的工作,如果它是真的,它会起作用,否则我没有答案,就像它永远运行一样。
adjacent(X,Y,L):-
append(L1,[X,Y],T1),append(T1,T2,L).
答案 0 :(得分:6)
要查看您的程序是否循环,只需考虑以下failure-slice:
即可adjacent(X,Y,L):- append(L1,[X,Y],T1), false,append(T1,T2,L).
如果这个程序循环,那么原始程序也会循环。它可能会成功,但它仍会循环。
在您的第一个目标中,L1
和T1
都是未实例化的变量 - 这很容易看到,因为它们不会在此片段中的任何其他位置使用。因此,无论X
,Y
或L
是什么,此程序都始终循环。要解决此问题,您必须修改可见部分中的内容。
一种可能性是交换这两个目标。但是有一个更简单的出路:
adjacent(X,Y,L) :-
append(_,[X,Y|_],L)
但请注意,这并不能确保L
确实是一个格式正确的列表。事实上,adjacent(1,2,[1,2|nonlist])
成功了。如果它应该是一个列表:
adjacent(X,Y,L) :-
append(_,[X,Y|R],L),
append(R,[],R).
有关详情,请参阅failure-slice。
答案 1 :(得分:2)
这可能不是最好的答案,但您也可以尝试:
adjacent(X,Y,Zs):- append(As,[X,Y|Ys],Zs).
例如:
3 ?- adjacent(1,2,[1,2,3]).
true .
1 ?- adjacent(1,3,[1,2,3]).
false.