我在迭代过程中编写了一个Prolog程序,它统一了变量并想要求解下面的等式。但它说“假”?!
?- 0.4 =< 4 - 3.6.
false.
即使这是“假”:
?- 0.4 = 4 - 3.6.
为什么?你知道如何解决这个问题的解决方案吗?
在我的程序中,它必须是真的。我认为,从数学角度来看,这两个方程都是正确的。
感谢您的帮助!!
答案 0 :(得分:3)
在Prolog中,-
不是减去两个数字的运算符。它只使用二元仿函数-
创建一个术语。
尝试:
?- X = 4 - 1.
X = 4-1 ?
yes
?- X = -(4,1).
X = 4-1 ?
yes
在比较之前,需要将此表达式简化为数字。为此,您可以使用is
运算符。通过>=
和=<
的比较也首先评估双方并比较数字。另一个有用的运算符是=:=
,它是传统意义上的相等比较。
但是,对于浮点数,您不应直接使用比较,因为4 - 3.6实际上是0.3999999999999999,因为内部存储格式无法保留任意精度。最好检查两个数字之间的差异是否相当小。
使用==
而不是=
也可能有意义,因为前者仅进行比较,如果自由变量进入此谓词,它将不受其约束。
(至少它是如何在SICStus Prolog中运行的。编辑:刚刚使用SWI Prolog进行测试,它的工作原理基本相同。)
答案 1 :(得分:3)
您遇到了浮点表示固有的问题。试试这个C程序:
#include <stdio.h>
main()
{
if (0.4 <= 4 - 3.6) printf("OK\n");
else printf("NO!\n");
printf("%.25f\n", 0.4 - (4-3.6));
}
看看会发生什么。请记住,SWI-Prolog使用C中实现的双精度算法来表示浮点数。
解决此问题的一种方法是使用SWI-Prolog提供的rational numbers:
?- X is rationalize(3.6).
X = 18 rdiv 5.
?- X is rationalize(0.4).
X = 2 rdiv 5.
?- rationalize(0.4) =< 4-rationalize(3.6).
true.