假设我想写一个(不可否认,但这只是一个例子)谓词,比较两个值,并将结果作为可引用的变量返回,如下所示:
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的哲学?
答案 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')).