首页 > 解决方案 > 在 Prolog 中实例化参数

问题描述

考虑带有流模型 (i,o) 的 PROLOG 谓词 f(list,integer)。

f([],0).
f([H|T],S):-
    f(T,S1),
    S1 is S-H.

给出评估结果 f([1,2,3,4,5,6,7,8],S)?证明答案。

我已经看到我们收到错误“参数没有充分实例化”,这是因为 S 的值最终没有更新(仅当列表为空时)。这是一个很好的理由吗?

标签: prologlogic

解决方案


我已经看到我们收到错误“参数没有充分实例化”,这是因为 S 的值最终没有更新(仅当列表为空时)。这是一个很好的理由吗?

如果此代码应该失败,是的。

正确的写法是:

这个谓词在第二个位置用一个未绑定的变量调用,要么在顶部,要么递归地 vai f(T,S1)(其中S1是新鲜的,因此是未绑定的)。

然后算术评估

S1 is S-H.

将在右侧有一个未绑定的变量is/2并且无法继续(即它会抛出)。

但请注意,如果您切换到“有限域上的约束满足”,它会起作用:

?- use_module(library(clpfd)).
true.

然后替换is/2#=

f([],0).
f([H|T],S):-
    f(T,S1),
    S1 #= S-H.

产生一个工作程序:

?-  f([1,2,3,4,5,6,7,8],S).
S = 36.

推荐阅读