比较浮点数是否相等通常是危险的。在您的特定情况下,如果您跟踪查询,您将获得:
| ?- trace.
The debugger will first creep -- showing everything (trace)
yes
{trace}
| ?- equilateral(point2d(2,3),point2d(6,3),point2d(4,3+sqrt(12))).
1 1 Call: equilateral(point2d(2,3),point2d(6,3),point2d(4,3+sqrt(12))) ?
2 2 Call: (6-2)*(6-2)+(3-3)*(3-3)=:=(4-6)*(4-6)+(3+sqrt(12)-3)*(3+sqrt(12)-3) ?
2 2 Fail: (6-2)*(6-2)+(3-3)*(3-3)=:=(4-6)*(4-6)+(3+sqrt(12)-3)*(3+sqrt(12)-3) ?
1 1 Fail: equilateral(point2d(2,3),point2d(6,3),point2d(4,3+sqrt(12))) ?
如果您单独评估=:=/2
参数,您可以看到查询失败的原因:
| ?- X is (6-2)*(6-2)+(3-3)*(3-3).
X = 16
yes
| ?- X is (4-6)*(4-6)+(3+sqrt(12)-3)*(3+sqrt(12)-3).
X = 15.999999999999998
yes
通常,如果两个浮点值相等或接近,则您认为它们是相同的。什么是 close 的良好定义取决于应用程序,并且有几个标准定义可用(例如近似相等、基本相等或容差相等)。我强烈建议您找到并阅读浮点运算的良好介绍。
PS Logtalk 可以在大多数 Prolog 系统上运行,它为四种不同的相等测试提供库支持:https ://logtalk.org/library/number_0.html使用这些库谓词之一将允许您为您的equilateral/3
谓词。