我试图解决属于该区域的一个问题。因此,我需要得到一个答案:如果一个点属于该区域。
用户从键盘输入的点的坐标。当我尝试直接在规则中传递点的坐标时: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。
答案 0 :(得分:2)
使用提示方法时:
write("Input X:"), readreal(X),
write("Input Y:"), readreal(Y),
belongsTo(X, Y).
Prolog将显示X
和Y
的值以及解决方案(是或否),因为这些变量会在查询中明确显示。查询中的任何变量都假定您希望查看结果。如果你只是想看是或否,那么你可以做一个谓词:
readuser :-
write("Input X:"), readreal(X),
write("Input Y:"), readreal(Y),
belongsTo(X, Y).
然后只查询readuser
。如果没有显示X
和Y
的值,您就会得到是或否。
就不同的结果而言,如果您为0
和0
输入X
和Y
,则此输入将成功两次:一次用于semicircle
,一次用于square
。 Prolog忠实地找到了两个成功的结果。
当你输入1和1并将它们读作&#34; real&#34;时,我怀疑内部表示会产生一点浮点精度问题,并在内部变成类似{{1}这些都会导致1.000000001
和semicircle
测试失败。
另外,square
正在测试非负semicircle
和非负X
象限,而不是真正的半圆。实际的Y
检查会限制一个坐标与semicircle
,例如,X*X + Y*Y <= 1
将在右上方和半圆的右下象限。