Prolog在未尝试任何RHS规则的情况下失败



我有这个代码:

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)。

这里的查询仍然失败,所以错误必须在剩余的可见部分。

相关内容

最新更新