prolog - 在 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 的值最终没有更新(仅当列表为空时)。这是一个很好的理由吗?
解决方案
我已经看到我们收到错误“参数没有充分实例化”,这是因为 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.
推荐阅读
- angular - 如何更改离子应用程序的标题
- javascript - Jest 找不到 styledcomponent 模块
- javascript - Angular 6根据条件选择动画
- katalon-studio - 将 HTML 文件导入 Katalon Recorder(浏览器扩展)
- python - 如何/在何处使用 StandardScaler 和 GridSearchCV
- javascript - 我可以根据构造函数的位置调用 Javascript 函数吗?
- node.js - docker启动时的pm2进程
- node.js - 在 NodeJs 中使用 fast-xml-parser 将特定标签解析为数组
- jquery - 循环 .each 函数,没有发生
- arrays - 在 Swift 中从基于结构的数组中检索值