Prolog 序言。如何输出解决方案,如是或否
我试图解决一个属于该地区的问题。因此,我需要得到一个答案:一个点是否属于该区域。 用户从键盘输入的点的坐标。当我试图在规则中直接传递点的坐标时:Prolog 序言。如何输出解决方案,如是或否,prolog,visual-prolog,Prolog,Visual Prolog,我试图解决一个属于该地区的问题。因此,我需要得到一个答案:一个点是否属于该区域。 用户从键盘输入的点的坐标。当我试图在规则中直接传递点的坐标时:belongsTo(1,1)。我得到了所需的结果(是或否),但当我用键盘输入坐标时 write ("Input X:"), readreal (X), write ("Input Y:"), readreal (Y), belongsTo (X, Y). 然后答案将是“无解决方案”或“2个解决方案”(如果通过点(0,0))(X=0,Y=0,X=0,Y=
belongsTo(1,1)。
我得到了所需的结果(是或否),但当我用键盘输入坐标时
write ("Input X:"), readreal (X),
write ("Input Y:"), readreal (Y),
belongsTo (X, Y).
然后答案将是“无解决方案”或“2个解决方案”(如果通过点(0,0))(X=0,Y=0,X=0,Y=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).
谓词
正方形(真的,真的)
半圆(实,实)
belongsTo(真实,真实)
条款
正方形(X,Y):-
十> =-1,X=-1,Y=0,Y>=0,
使用提示方法时,X*X+Y*Y
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
的值的情况下,您将得到是或否
对于不同的结果,如果为X
和Y
输入0
和0
,此输入将成功两次:一次为半圆
,一次为正方形
。Prolog忠实地发现了这两个成功的结果
当您输入1和1并将其读取为“real”时,我怀疑内部表示有一点浮点精度问题,并且内部变得类似于,1.00000000 1
,这些将使半圆
和正方形
测试失败
另外,半圆
正在测试非负的X
和非负的Y
象限,而不是真正的半圆。实际的半圆
检查将仅约束其中一个坐标与X*X+Y*Y=0,X*X+Y*Y Visual Prolog是否允许在函子名称和引入其参数的左括号之间留有空格?例如,readreal(X)
是否有效?或者应该是readreal(X)
以避免错误?按照当前定义的半圆
的方式,它实际上只检查象限(非负X
和非负Y
),而不是半圆
。您需要准确显示您在键盘上输入的内容,这会产生意外的结果。readreal(X)
和readreal(X)
都是有效的/OK,在SWI Prolog中,空格不起作用,这就是我问的原因。它现在起作用了。我非常感谢你的帮助和耐心。非常感谢。