gia*_*kis 3 prolog failure-slice
我必须找到列表中的两个成员是否相邻.限制是使用append/3谓词.到目前为止,我已经完成了下面的工作,如果它是真的可行,否则我得不到答案,就像它永远运行一样.
adjacent(X,Y,L):-
append(L1,[X,Y],T1),append(T1,T2,L).
Run Code Online (Sandbox Code Playgroud)
要查看您的程序将循环,只需考虑以下故障片:
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)
Run Code Online (Sandbox Code Playgroud)
但是请注意,这并不能确保它L确实是一个格式良好的列表.事实上,adjacent(1,2,[1,2|nonlist])成功了.万一它应该是一个列表:
adjacent(X,Y,L) :-
append(_,[X,Y|R],L),
append(R,[],R).
Run Code Online (Sandbox Code Playgroud)
请参阅failure-slice了解更多信息.