如果列表中的兩個成員相鄰,我必須找到它。限制是使用謂詞。到目前爲止,我已經完成了下面的工作,如果它是真的,它會起作用,否則我不會得到答案,就像它永遠運行一樣。查找相鄰的會員
adjacent(X,Y,L):-
append(L1,[X,Y],T1),append(T1,T2,L).
如果列表中的兩個成員相鄰,我必須找到它。限制是使用謂詞。到目前爲止,我已經完成了下面的工作,如果它是真的,它會起作用,否則我不會得到答案,就像它永遠運行一樣。查找相鄰的會員
adjacent(X,Y,L):-
append(L1,[X,Y],T1),append(T1,T2,L).
要查看你的程序會循環,只要考慮以下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。
這可能不是最好的答案,但你也可以試試:
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.
這是一樣的第一個解決方案@false在他的回答表明(他用'_'代表單身變量)。 – lurker