序言。如何输出是或否的解决方案

时间:2015-02-19 15:50:25

标签: prolog visual-prolog

我试图解决属于该区域的一个问题。因此,我需要得到一个答案:如果一个点属于该区域。 用户从键盘输入的点的坐标。当我尝试直接在规则中传递点的坐标时: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。

1 个答案:

答案 0 :(得分: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的值,您就会得到是或否。

就不同的结果而言,如果您为00输入XY,则此输入将成功两次:一次用于semicircle,一次用于square。 Prolog忠实地找到了两个成功的结果。

当你输入1和1并将它们读作&#34; real&#34;时,我怀疑内部表示会产生一点浮点精度问题,并在内部变成类似{{1}这些都会导致1.000000001semicircle测试失败。

另外,square正在测试非负semicircle和非负X象限,而不是真正的半圆。实际的Y检查会限制一个坐标与semicircle例如X*X + Y*Y <= 1将在右上方和半圆的右下象限。