4

当试图通过 API 文档理解 core.logic 时,我遇到了非关系目标和关系目标。我不知道这在实践中意味着什么,以及为什么注释目标是否是相关的很重要。

您能否举例说明如何根据目标是否相关来以不同方式使用目标?

4

1 回答 1

8

为了解释非关系意味着什么,我们需要重新审视什么relational意味着什么。

如果你在函数式编程中考虑纯函数,它们总是返回一个值,并且对于相同的输入参数,返回相同的输出值。

比如说:

 f(x) = x + 2

此函数始终返回5输入值3

但是有很多情况是函数不合适,作为平方根,有 2 个结果。

 sqrt(4) => 2 and -2

或者将一个数字除以零,没有结果

将关系视为广义函数,您有:

  • 任意数量的结果(零个或多个)
  • 非确定性
  • 每次调用的输入/输出参数可以不同
  • 如果关系为真,则关系返回真,否则返回

为了将函数转换为关系,我们将结果设置为新参数:

(cons 1 [2]) => [1 2]

(conso 1 [2] [1 2]) => true

但是conso如果一个参数是变量,现在可以用作生成器:

 (run 1 [x]
    (conso 1 [2] x)) => ([1 2])

 (run 1 [x]
    (conso 1 x [1 2])) => ([2])

在逻辑编程中,统一回答了这个问题:要满足这种关系,世界应该是什么样子

non-relational运算符或函数是不作为关系而是作为简单函数工作的运算符,因此不可能将任何参数作为变量进行统一。

例如,在命名空间中引入了有限域等运算符时,就会>发生<这种CLP情况clojure.core.logic.fd

您可以在Ambrose Bonnaire-Sergeant的这次演讲中找到许多概念。

于 2015-11-19T17:00:12.710 回答