我有这个代码:
res([],M,M).
res([[A,B]|G],inM,M) :-
dfs(A, [[A,B]|G], [], [], Out),
processResponse(Out,inM,M1),
dfs(B, [[A,B]|G], [], [], Out2),
processResponse(Out2,M1,M2),
res(G,M2,M).
如果我在解释器上运行res([],[],M)
,它会正常工作并返回M = []
。
如果我运行res([[a,b]],[],M)
,它将失败。我尝试查看跟踪,但它在res
上立即失败,甚至没有尝试dfs
或任何其他规则。如果我用相同的输入直接在解释器上编写规则,它们会很好地工作。
我正在使用SWI Prolog。为什么会发生这种情况?我应该更改什么才能使其工作?
您已经在一些经验丰富的Prolog程序员的评论中得到了正确的答案。但也许可以暂停一段时间,考虑一下您是如何发现此类错误的。
Prolog中的好处是,程序可以用一种非常简单的方式进行推广:通过删除目标和子术语。如果这样的通用程序也失败了,则在剩余的片段中有错误。在您的示例中,这将是:
:-op(950,fy,*)。*_。res([],_/*M*/,_/*M*/*[A,B]*/|_/*G*/],inM,_>/*M*/):-*dfs(A,[[A,B]|G],[],[],Out),*processResponse(Out,inM,M1),*dfs(B,[[A,B]|G],[],[],Out2),*processResponse(Out2,M1,M2),*res(G,M2,M)。?-res([_/*[a,b]*/],[],M)。
这里的查询仍然失败,所以错误必须在剩余的可见部分。