【问题标题】:Check if triangle is equilateral in Prolog在Prolog中检查三角形是否等边
【发布时间】:2019-11-13 20:42:42
【问题描述】:

我正在学习 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)) 组成一个等边三角形(已经手动检查过) .请让我知道我错过了什么?

【问题讨论】:

    标签: prolog geometric-arc


    【解决方案1】:

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

    | ?- 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 系统上运行的 Logtalk 为四种不同的相等性测试提供库支持:https://logtalk.org/library/number_0.html 使用这些库谓词之一将允许您获得 equilateral/3 谓词的工作定义。

    【讨论】:

      猜你喜欢
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 2011-05-11
      • 2013-02-07
      相关资源
      最近更新 更多