exception - 不断收到错误信息 "Arguments are not sufficiently instantiated"不明白为什么

标签 exception recursion prolog successor-arithmetics instantiation-error

不断出现错误 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 是正确答案;事实上,唯一的答案。

您有多种选择:

、约束或元逻辑谓词。

这里是后继算术的起点:

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/1nonvar/1ground/1 的选项区分不同的情况,区别对待。这是非常容易出错的,以至于我很少看到使用它们的正确程序。事实上,即使是非常有名的教科书也存在严重错误!

关于exception - 不断收到错误信息 "Arguments are not sufficiently instantiated"不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9775414/

相关文章:

clojure - Clojure 中的相互递归定义

prolog - 是纯Prolog Turing-complete,如果是,为什么不能实现列表交集?

prolog - 使用swi-prolog将prolog代码+C代码编译成二进制

java - 将资源作为类成员尝试使用资源

Java 用递归解决迷宫问题

algorithm - 计算走 1、2 或 3 步后爬 n 步的方法

prolog - 按位求反运算符 (\) 在 prolog 中起什么作用?

c# - 为什么 XmlSerializer 抛出 InvalidOperationException?

python - 如何通过引发异常来 pytest 一个 python 函数

c++ - 抛出多个相同类型的异常