Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 序言。如何输出解决方案,如是或否_Prolog_Visual Prolog - Fatal编程技术网

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中,空格不起作用,这就是我问的原因。它现在起作用了。我非常感谢你的帮助和耐心。非常感谢。