当我试图通过API文档理解core.logic时,我会遇到非相关目标和关系目标。我不知道这在实践中意味着什么,也不知道为什么注释目标很重要,无论它们是否是关系的。
你能举例说明目标是如何根据它们是否是关系型的而不同地使用的吗?
为了解释非关系意味着什么,我们需要重新审视relational
的含义。
如果在函数式编程中考虑纯函数,它们总是返回一个值,对于相同的输入参数,返回相同的输出值。
例如:
f(x) = x + 2
对于输入值3
,此函数始终返回5
。
但在许多情况下,函数是不合适的,作为平方根,有2个结果。
sqrt(4) => 2 and -2
或者将数字除以零,没有结果
把一个关系看作一个广义函数,你就得到了:
- 任意数量的结果(零个或更多)
- 不确定性
- 每次调用的输入/输出参数可能不同
- 如果关系为true,则关系返回true,否则返回false
为了将函数转换为关系,我们将结果设置为一个新参数:
(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
运算符或函数是不作为关系而作为简单函数工作的运算符,因此不可能将任何参数作为变量进行统一。
例如,在命名空间clojure.core.logic.fd
中引入有限域上的CLP
之前,>
和<
之类的运算符就发生了这种情况。
这里的许多概念你可以在Ambrose Bonnaire中士的演讲中找到