我有这 3 个谓词:
times(X, Y):-
Result is X * Y.
minus(X, Y):-
Result is X - Y.
plus(X, Y):-
Result is X + Y.
我想通过例如
times(2,2)
在 plus(X, Y)
像这样plus(times(2,2), minus(X, Y))
.
最佳答案
首先,您需要了解 Prolog 谓词实际描述的是什么:它们不是函数,而是值之间的关系。所以如果你想有一个加法谓词,这需要是一个带三个参数的谓词:plus(A, B, Sum)
.因此,在 Prolog 中,结果不像在许多其他语言中那样免费显示。
代替
plus(X, Y):-
Result is X + Y.
你需要写
plus(X, Y, Result) :-
Result is X + Y.
接下来你想要的是进一步传递中间值。在支持函数的语言中,这是一项非常容易的任务。但是在 Prolog 中,函数符号是未解释的。因此,要么您对关系中的所有内容进行编码,要么实现您自己的
(is)/2
版本。 .对于初学者,宁可坚持第一个选项。因此,而不是
..., plus(times(2,2), minus(X, Y)) ...
现在写
..., times(2, 2, R), plus(R, minus(X, Y), S), ...
与
S
作为最终结果。请注意,如果直接在关系中编码表达式,则必须引入中间变量,如
R
以上。很明显,对于这样的目的,(直接)关系符号不太优雅。对于非常精确的区域,Prolog 也提供表达式,特别是
(is)/2
然后在更一般的设置 library(clpfd)
.但是,作为初学者,最好先习惯关系表示法。学习 successor arithmetics 可能是一个更好的主意第一的。使用前
library(clpfd)
并在使用之前 (is)/2
.
关于parameters - 如何将谓词作为参数传递给 Prolog 中的另一个谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26453574/