在Prolog中检查三角形是否等边

洪阮

我正在学习Prolog,并尝试创建一个程序来检查三角形是否等边。

这是我的代码

equilateral(point2d(X1,Y1),point2d(X2,Y2),point2d(X3,Y3)):- 
    ((X2-X1)*(X2-X1) + (Y2-Y1)*(Y2-Y1)) =:= ((X3-X2)*(X3-X2) + (Y3-Y2)*(Y3-Y2)),
    ((X3-X2)*(X3-X2) + (Y3-Y2)*(Y3-Y2)) =:= ((X3-X1)*(X3-X1) + (Y3-Y1)*(Y3-Y1)).

当我运行时equilateral(point2d(2,3),point2d(6,3),point2d(4,3+sqrt(12))).,结果为假,我知道三个点(2,3)(6,3)(4,3 + sqrt(12))构成等边三角形(已手动检查)。请让我知道我想念的是什么?

保罗·莫拉(Paulo Moura)

比较浮点数是否相等通常很危险。在您的特定情况下,如果您跟踪查询,则会得到:

| ?- 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的良好定义取决于应用程序,并且可以使用几个标准定义(例如,近似相等,本质相等或公差相等)。我强烈建议您找到并阅读有关浮点算法的良好介绍。

您可以在大多数Prolog系统上运行的PS Logtalk,为四个不同的相等性测试提供库支持:https : //logtalk.org/library/number_0.html使用这些库谓词之一将使您能够获得自己的有效定义。equilateral/3谓词。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章