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

时间:2015-09-16 03:32:46

标签: prolog

假设我想写一个(不可否认,但这只是一个例子)谓词,比较两个值,并将结果作为可引用的变量返回,如下所示:

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的哲学?

1 个答案:

答案 0 :(得分:0)

表面上看,这是运营商的问题。优先:这个编译

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

但它没有运行:

?- compare(1,3,X).
ERROR: compare/3: Type error: `atom' expected, found `1' (an integer)

您将与内置版发生冲突,请参阅compare / 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')).