当试图理解core.logic时,我会遇到非关系目标和关系目标。我不知道这在实践中意味着什么,以及为什么如果它们是关系的话,注释目标很重要。
您能否举例说明目标的使用方式,具体取决于它们是否是关系?
答案 0 :(得分:6)
为了解释我们需要重新审视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
之前发生了这种情况。
您可以在this talk中找到Ambrose Bonnaire-Sergeant的许多概念。