1

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

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

那么答案将是“没有解决方案”或只有“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).

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

4

1 回答 1

2

使用提示方式时:

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

Prolog 将显示解决方案的值XY解决方案(是或否),因为这些变量明确显示在您的查询中。查询中的任何变量都假定您希望查看结果。如果您只想查看是或否,那么您可以做一个谓词:

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

然后只是查询readuser。然后,您将只得到是或否,而不显示 和 的XY

至于不同的结果,如果你输入0and 0for Xand Y,这个输入会成功两次:一次 forsemicircle和一次 for square。Prolog 忠实地发现了这两个成功的结果。

当您输入 1 和 1 并将它们读为“真实”时,我怀疑内部表示出现了一点浮点精度问题并且内部变得类似,1.000000001并且这些都将失败semicirclesquare测试。

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

于 2015-02-19T20:53:09.993 回答