序言。如何输出像 Yes 或 No 这样的解决方案

Prolog. How to output solution like Yes or No

我试图解决一个点属于区域的问题。结果,我需要得到一个答案:一个点是否属于该区域。 用户从键盘输入的点的坐标。当我尝试在规则中直接传输点的坐标时:belongsTo (1,1). 我得到了想要的结果(是或否),但是当我用键盘输入坐标时

write ("Input X:"), readreal (X),
write ("Input Y:"), readreal (Y),
belongsTo (X, Y).

那么答案将是'no solutions'或只是'2个解决方案'(X = 0,Y = 0,X = 0,Y = 0,如果你通过点(0,0))

完整代码如下:

PREDICATES
    square(real,real)
    semicircle(real,real)
    belongsTo(real,real)
CLAUSES
    square(X,Y):-
        X>=-1,X<=0,
        Y>=-1,Y<=0.

    semicircle(X,Y):-
        X>=0,Y>=0,
        X*X+Y*Y<=1.

    belongsTo(X,Y):-
        square(X,Y);
        semicircle(X,Y),!.
GOAL
    write("Input X: "), readreal(X),
    write("Input Y: "), readreal(Y),
    belongsTo(X,Y).

因此我需要得到一个解决方案,例如是(如果该点属于该区域)或否。

当您使用提示方式时:

write("Input X:"), readreal(X),
write("Input Y:"), readreal(Y),
belongsTo(X, Y).

Prolog 将显示 XY 的值以及解决方案(是或否),因为这些变量明确出现在您的查询中。您查询中的任何变量,它假设您想要查看其结果。如果只想看yes or no,那么可以做谓词:

readuser :-
    write("Input X:"), readreal(X),
    write("Input Y:"), readreal(Y),
    belongsTo(X, Y).

然后直接查询readuser。然后你会得到是或否而不显示 XY 的值。

至于不同的结果,如果你为XY输入00,这个输入会成功两次:一次用于 semicircle,一次用于 square。 Prolog 忠实地找到了两个成功的结果。

当您输入 1 和 1 并将它们读取为 "real" 时,我怀疑内部表示会出现一些浮点精度问题并且在内部变成类似 1.000000001这些将无法通过 semicirclesquare 测试。

顺便说一句,semicircle 正在测试非负 X 和非负 Y 象限,而不是真正的半圆。实际 semicircle 检查将仅限制 一个 坐标与 X*X + Y*Y <= 1 例如 X >= 0, X*X + Y*Y <= 1 将是半圆的右上象限和右下象限。