我必须找出列表的两个成员是否相邻。限制是使用append/3
谓词。到目前为止,我已经完成了以下操作,如果它是真的,它会起作用,否则我没有得到任何答案,就像它永远运行一样。
adjacent(X,Y,L):-
append(L1,[X,Y],T1),append(T1,T2,L).
我必须找出列表的两个成员是否相邻。限制是使用append/3
谓词。到目前为止,我已经完成了以下操作,如果它是真的,它会起作用,否则我没有得到任何答案,就像它永远运行一样。
adjacent(X,Y,L):-
append(L1,[X,Y],T1),append(T1,T2,L).
要查看您的程序是否会循环,只需考虑以下failure-slice:
相邻(X,Y,L):- 追加(L1,[X,Y],T1),假,追加(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).
有关更多信息,请参见故障切片。
这可能不是最佳答案,但您也可以尝试:
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.