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