作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
不断出现错误 Arguments are not enoughly instantiated
对于我编写的乘法加法规则,如下所示。
mult(_, 0, 0). %base case for multiplying by 0
mult(X, 1, X). % another base case
mult(X, Y, Z) :-
Y > 1,
Y1 is Y - 1,
mult(X, Y1, Z1),
Z is X + Z1.
我是 Prolog 的新手,即使是这样简单的问题也真的很挣扎。
任何关于书籍或在线教程的推荐都会很棒。
我在 Ubuntu Linux 上的 SWI-Prolog 上运行它。
最佳答案
在您定义的 mult/3
中,前两个参数必须是已知的。如果其中之一仍然是变量,则会发生实例化错误。例如。 mult(2, X, 6)
将产生实例化错误,尽管 X = 3
是正确答案;事实上,唯一的答案。
您有多种选择:
successor-arithmetics 、约束或元逻辑谓词。
这里是后继算术的起点:
add(0,Y,Y).
add(s(X),Y,s(Z)) :- add(X,Y,Z).
另一种方法是对整数使用约束。 YAP 和 SWI 有一个 library(clpfd)
可以以非常灵活的方式使用:既可用于常规整数计算,也可用于更一般的约束。当然,乘法已经预定义了:
?- A * B #= C. A*B#=C.?- A * B #= C, C = 6. C = 6, A in -6.. -1\/1..6, A*B#=6, B in -6.. -1\/1..6.?- A * B #= C, C = 6, A = 2. A = 2, B = 3, C = 6.
元逻辑谓词:我不推荐您使用 var/1
、nonvar/1
、ground/1
的选项区分不同的情况,区别对待。这是非常容易出错的,以至于我很少看到使用它们的正确程序。事实上,即使是非常有名的教科书也存在严重错误!
关于exception - 不断收到错误信息 "Arguments are not sufficiently instantiated"不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9775414/
我是一名优秀的程序员,十分优秀!