如何将比较结果存储在Prolog中并在以后使用?

如何将比较结果存储在Prolog中并在以后使用?,prolog,swi-prolog-for-sharing,Prolog,Swi Prolog For Sharing,假设我想写一个公认不必要的谓词,但它是一个比较两个值的示例谓词,并将结果作为可引用的变量返回,如下所示: compare(Value1, Value2, Result) :- Result is Value1 > Value2. 但在这一点上,我得到了一个错误: src:2: Syntax error: Operator priority clash compare/3: Domain error: `order' expected, found `'5'' 在得到结果之后,

假设我想写一个公认不必要的谓词,但它是一个比较两个值的示例谓词,并将结果作为可引用的变量返回,如下所示:

compare(Value1, Value2, Result) :- 
    Result is Value1 > Value2.
但在这一点上,我得到了一个错误:

src:2: Syntax error: Operator priority clash
compare/3: Domain error: `order' expected, found `'5''
在得到结果之后,我将如何在另一个谓词中使用它的值?是否可以说:

compare(5, 2, Result),
Result.

还是我完全误解了Prolog的原理?

表面上看,这是一个运算符优先级的问题:这是编译

compare(Value1, Value2, R) :- R is (Value1 > Value2).
但它没有运行:

?- compare(1,3,X).
ERROR: compare/3: Type error: `atom' expected, found `1' (an integer)
您将与内置的碰撞,请参见/3。 最好避免,尽管在SWI Prolog/1指令中可能会有所帮助

/2是一个谓词,它实现了一个小的函数子语言,对右侧算术表达式求值,而/2则在对两侧求值后实现比较。我的意思是:

..., A > B, ...
它要么是真的,要么是假的,不会产生一个数字

也许你想要

my_compare(A,B,C) :- A > B -> C = 1 ; A < B -> C = -1 ; C = 0.
然后


您试图使用prolog,就像它计算结果一样。它通常不是那样工作的。更多的是术语的统一。这是一个与命令式语言和函数式语言截然不同的概念。你们想做的是什么?你们期望得到的结果是什么?对还是错?@WillNess:好了,谢谢。我想不起来为什么我删除了它。有一个bug?是的,在生成输出的过程中。上面写着挪威语。没什么大不了的而且,烟的名字也不一样。
my_compare(A,B,C) :- A > B -> C = true ; C = false.
?- my_compare(1,3,R), (R -> writeln('comparison succeeded') ; writeln('comparison failed')).