1

我有这个代码:

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。为什么会这样?我应该改变什么才能使这项工作?

4

1 回答 1

1

您已经在一些经验丰富的 Prolog 程序员的评论中得到了正确的答案。但可能会暂停一段时间,并考虑如何找到此类错误。

Prolog 的好处是程序可以用一种非常简单的方式进行泛化:通过删除目标和删除子项。如果这样的通用程序也失败了,那么剩余的片段中肯定错误。在您的示例中,这将是:

:- op(950, fy, *)。
*_。

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([_ /*[a,b]*/ ],[],M)。

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

于 2016-05-16T15:22:28.700 回答