2014-05-07 130 views
3

如果列表中的两个成员相邻,我必须找到它。限制是使用谓词。到目前为止,我已经完成了下面的工作,如果它是真的,它会起作用,否则我不会得到答案,就像它永远运行一样。查找相邻的会员

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

回答

6

要查看你的程序会循环,只要考虑以下

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

如果该程序将循环,那么原来的程序将循环了。它可能成功,但它仍然会循环。

在您的第一个目标中,L1T1都是无意义的变量 - 这很容易看出,因为它们在此片段中的其他任何地方都没有使用。因此,这个程序将总是循环,不管是什么X,YL可能。要解决这个问题,你必须修改可见部分的东西。

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

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

更多见

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. 
+2

这是一样的第一个解决方案@false在他的回答表明(他用'_'代表单身变量)。 – lurker