0

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

compare(Value1, Value2, Result) :- 
    Result is Value1 > Value2.

但是在Swish中我得到一个错误:

src:2: Syntax error: Operator priority clash
compare/3: Domain error: `order' expected, found `'5''

在我拥有 之后Result,我将如何在另一个谓词中使用它的值?能不能说:

compare(5, 2, Result),
Result.

还是我完全误解了 Prolog 的哲学?

4

1 回答 1

0

从表面上看,这是运算符优先级的问题:this compiles

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 中redefine_system_predicate /1 指令可能会有所帮助。

is /2 是实现小型 (?) 功能子语言的谓词,评估右侧算术表达式,而> /2 实现在评估两侧后进行比较。我的意思是说:

..., A > B, ...

它是真还是假,不会产生数字...

也许你想要

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

编辑

我想我应该说明如何存储比较值:只需实例化结果并稍后调用它。

my_compare(A,B,C) :- A > B -> C = true ; C = false.

然后

?- my_compare(1,3,R), (R -> writeln('comparison succeeded') ; writeln('comparison failed')).
于 2015-09-16T03:50:59.850 回答