首页 > 解决方案 > 编写 Prolog isSquare 函数

问题描述

我正在尝试编写一个简单的函数来检查输入的坐标列表是否是序言中的正方形,例如: isSquare(x1,y1,x2,y2,x3,y3,x4,y4) 并且响应为真或错误的

我目前有以下

isSquare(x1, y1, x2, y2, x3, y3, x4, y4)
        Slope1 = (y2 - y1) / (x2 - x1)
        Slope2 = (y3 - y2) / (x3 - x2)
        Slope3 = (y4 - y3) / (x4 - x3)
        Slope4 = (y1 - y4) / (x1 - x4)
        
        If Slope1 * Slope2 == Slope3 * Slope4 
                return true
        else 
                return false

但我碰壁了,我会很感激任何指导,因为我对 prolog 完全陌生,并且正在学习

标签: prolog

解决方案


这里有一些问题。首先,Prolog 使用谓词,而不是函数。谓词不会“返回”某些东西。它要么成功,要么失败。它也可能陷入无限循环或引发异常,但现在让我们忽略它。

此外,变量以大写字母开头,因此x1不是变量,而是常量。有一个 if-then-else 语法,但就是,我们在这里不需要它。( condition -> then-body; else-body )

为了评估表达式,使用is/2. 您还可以使用(=:=)/2此处来评估两个操作数并检查结果是否相等,因此我们可以将谓词重写为。

谓词的头部和主体由 a 分隔:-,并且使用逗号 ( ,) 表示逻辑上类似于 an 的内容。所以谓词看起来像:

isSquare(X1, Y1, X2, Y2, X3, Y3, X4, Y4) :-
        Slope1 = (Y2 - Y1) / (X2 - X1),
        Slope2 = (Y3 - Y2) / (X3 - X2),
        Slope3 = (Y4 - Y3) / (X4 - X3),
        Slope4 = (Y1 - Y4) / (X1 - X4),
        Slope1 * Slope2 =:= Slope3 * Slope4.

推荐阅读