【发布时间】:2016-07-05 08:42:21
【问题描述】:
我在 CLP(FD) 的这个页面上找不到除号 (/):http://www.swi-prolog.org/man/clpfd.html
这个简单的代码也会报错:
:-use_module(library(clpfd)).
afn(A,B,C):-
C #= B / A.
?- afn(23, 56, C).
ERROR: Domain error: `clpfd_expression' expected, found `56/23'
问题出在哪里,如何解决?谢谢。
【问题讨论】:
-
你应该使用整数除法'//'
-
将所有输入缩放 10000,然后发布所有约束。如果需要,缩小结果。
-
这可能是实数与本质上有限的生物和机器不匹配的原因,我们需要尽力而为。例如,在 SWI-Prolog 和 YAP 中,“有限域”可以增长到可用 RAM 的数量。对于我见过的大多数 Prolog 应用程序中出现的数字,这足以将它们乘以你需要使用 CLP(FD) 约束在 整数 上执行所有计算所需的因子,即使您稍后将这些数字视为小数,并在显示它们时在某处插入一个小数点。
-
正如我所说,最好的方法是不使用浮点数。您不能相信结果,因为编程语言无法检查浮点数推理时必不可少的关键细节。使用有理数、整数或询问、支付或等待更好的格式(如小数)。整数足以满足几乎所有用例。在许多情况下,您可以简单地将所有数字相乘,并在您的大部分程序中处理整数。使用 CLP(FD) 约束对整数进行推理。
-
在 Prolog 中使用浮点的最佳方法是什么? 这个问题可能对于一个单一的答案来说太宽泛了。如果您需要做的只是取一些浮点数并用它们计算一个新的结果,那么这可以在 Prolog 中使用任何其他语言中的数字表达式并使用
is/2来完成,例如,产生一个结果。但是一般的浮点数不能很好地适应 Prolog 的关系方面。
标签: prolog swi-prolog clpfd