2014-05-07 74 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