3

我必须找出列表的两个成员是否相邻。限制是使用append/3谓词。到目前为止,我已经完成了以下操作,如果它是真的,它会起作用,否则我没有得到任何答案,就像它永远运行一样。

adjacent(X,Y,L):-
   append(L1,[X,Y],T1),append(T1,T2,L).
4

2 回答 2

6

要查看您的程序是否会循环,只需考虑以下

    相邻(X,Y,L):-
       追加(L1,[X,Y],T1),追加(T1,T2,L)

如果这个程序会循环,那么原来的程序也会循环。它可能会成功,但它仍然会循环。

在您的第一个目标中,L1T1都是未实例化的变量 - 这很容易看出,因为在此片段的其他任何地方都没有使用它们。因此,无论是什么,或者可能是什么,这个程序都会一直循环。要解决此问题,您必须修改可见部分中的某些内容。XYL

一种可能性是交换两个目标。但是还有一个更简单的方法:

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).

有关更多信息,请参见

于 2014-05-07T12:25:13.083 回答
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.
于 2014-05-07T18:23:36.577 回答