parameters - 如何将谓词作为参数传递给 Prolog 中的另一个谓词?

标签 parameters prolog expression predicate

我有这 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/

相关文章:

bash - 如何在 bash 中组合 getopts 和位置参数?

c# - 多个方法,或参数?

hadoop - SQOOP 连接参数文件格式

序言 : toplevel: Undefined procedure (simple tree)

c# - 如何动态构建()=>新的{x.prop} lambda表达式?

c# - 如何在 VSTemplate 中创建评估的自定义参数

prolog - 有界表

prolog - 如何获取可能的谓词值的列表

c# - 当我只有泛型类型和实例值时,如何手动构建表达式树?

java - 生成添加到目标的所有数学表达式组合(Java作业/面试)