prolog - 如何编写序言数学函数?

标签 prolog

我正在尝试将数学函数转换为 prolog,但我不断收到错误。谁能给我一个提示,我的错误在哪里?

我想转换 f (x) = x ^ 2 + f (x - 1)。所以我假设这是一个递归过程。这是我到目前为止所做的。

function(0,0) :- !.
function(1,1) :- !.
function(X,Y) :-
   X1 is ((X * X) + (X - 1)),
   function(X1, Y).

我也试过

function(0,0) :- !.
function(1,1) :- !.
function(X,Y) :- 
  X1 is (X * X), X2 is (X - 1),
  function(X1, N1),
  function(X2, N2),
  Y is N1 + N2.

感谢任何帮助。

最佳答案

Prolog 使用谓词演算。 谓词可以评估为真或假。

您需要写出真实的内容(任何其他内容都被假定为错误的,因为 prolog 解释器将使用封闭世界假设)。

我们可以为您的函数定义一个谓词:

函数(X,Y)

其中 func 是一个谓词,如果 X 是 x 且 Y 是 f(X),则计算结果为真 当 func(X, Y) 为真时你需要告诉 prolog

func(0, 0).
func(X, Y) :- X > 0, U is X - 1, func(U, V), Y is X * X + V.

上面的代码可以认为是说 当 X 为 0 且 Y 为 0 时,您的谓词 func 为真

这将是您的基本案例。 (您只需要一个,因为您只有 1 个递归调用)。

接下来是你的递归案例:

一般 X 的函数何时为真

  • 我们需要 X 大于 0
  • 我们需要我们称为 V 的 f(x-1) 的结果
  • 当 func(X-1, V) 为真时,V 是 f(X-1) 的结果
  • prolog 不允许谓词内部的表达式,所以我们声明 U 是 X-1
  • 然后我们将所有内容放在一起并声明 Y 是 X *X + V

关于prolog - 如何编写序言数学函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31443464/

相关文章:

prolog - 使用 clpfd 时,问题空间很小,超出了 SWI-Prolog 堆栈限制

prolog - 基本 PROLOG 计数

prolog - abolish/1和retractall/1有什么区别?

unit-testing - 扩展 DCG 测试用例

prolog - 从 Logtalk 访问 SWI-Prolog 库

prolog - 如何构建主列表中某个元素的位置列表?

prolog - 如何在 Prolog 中创建算术和不等式约束

否定序

prolog - 向 DCG 添加解析约束

prolog - 将字符串转换为序言中的列表