序言。如何输出像 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 将显示 X
和 Y
的值以及解决方案(是或否),因为这些变量明确出现在您的查询中。您查询中的任何变量,它假设您想要查看其结果。如果只想看yes or no,那么可以做谓词:
readuser :-
write("Input X:"), readreal(X),
write("Input Y:"), readreal(Y),
belongsTo(X, Y).
然后直接查询readuser
。然后你会得到是或否而不显示 X
和 Y
的值。
至于不同的结果,如果你为X
和Y
输入0
和0
,这个输入会成功两次:一次用于 semicircle
,一次用于 square
。 Prolog 忠实地找到了两个成功的结果。
当您输入 1 和 1 并将它们读取为 "real" 时,我怀疑内部表示会出现一些浮点精度问题并且在内部变成类似 1.000000001
这些将无法通过 semicircle
和 square
测试。
顺便说一句,semicircle
正在测试非负 X
和非负 Y
象限,而不是真正的半圆。实际 semicircle
检查将仅限制 一个 坐标与 X*X + Y*Y <= 1
、 例如 、X >= 0, X*X + Y*Y <= 1
将是半圆的右上象限和右下象限。
我试图解决一个点属于区域的问题。结果,我需要得到一个答案:一个点是否属于该区域。
用户从键盘输入的点的坐标。当我尝试在规则中直接传输点的坐标时: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 将显示 X
和 Y
的值以及解决方案(是或否),因为这些变量明确出现在您的查询中。您查询中的任何变量,它假设您想要查看其结果。如果只想看yes or no,那么可以做谓词:
readuser :-
write("Input X:"), readreal(X),
write("Input Y:"), readreal(Y),
belongsTo(X, Y).
然后直接查询readuser
。然后你会得到是或否而不显示 X
和 Y
的值。
至于不同的结果,如果你为X
和Y
输入0
和0
,这个输入会成功两次:一次用于 semicircle
,一次用于 square
。 Prolog 忠实地找到了两个成功的结果。
当您输入 1 和 1 并将它们读取为 "real" 时,我怀疑内部表示会出现一些浮点精度问题并且在内部变成类似 1.000000001
这些将无法通过 semicircle
和 square
测试。
顺便说一句,semicircle
正在测试非负 X
和非负 Y
象限,而不是真正的半圆。实际 semicircle
检查将仅限制 一个 坐标与 X*X + Y*Y <= 1
、 例如 、X >= 0, X*X + Y*Y <= 1
将是半圆的右上象限和右下象限。