【问题标题】:Instantiate arguments in Prolog在 Prolog 中实例化参数
【发布时间】:2021-01-05 00:19:41
【问题描述】:

考虑带有流模型 (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 的值最终没有更新(仅当列表为空时)。这是一个很好的理由吗?

【问题讨论】:

  • 您的第二个子句中可能有两个拼写错误,应该是f([H|T], S):- f(T, S1), S is S1-H.f([H|T], S1):- f(T, S), S1 is S-H.
  • “流模型”一词从何而来?通常有人说谓词支持“模式”(在这种情况下,模式(+,?):第一个参数是in,第二个参数是“out”或者可以设置,在这种情况下谓词“验证”)

标签: prolog logic


【解决方案1】:

我看到我们收到错误“参数不够充分 实例化”,这是因为 S 的值没有在 结束(仅当列表为空时)。这是一个很好的理由吗?

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

正确的写法是:

调用此谓词时在第二个位置使用 未绑定变量,在顶部或递归地使用 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    相关资源
    最近更新 更多