非关系在core.logic的实践中意味着什么?

use*_*545 3 clojure minikanren clojure-core.logic

当试图理解core.logic时,我会遇到非关系目标和关系目标.我不知道这在实践中意味着什么,以及为什么如果它们是关系的话,注释目标很重要.

您能否举例说明目标的使用方式,具体取决于它们是否是关系?

Gui*_*ler 6

为了解释我们需要重新审视什么relational意思的非关系手段.

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

比如说:

 f(x) = x + 2
Run Code Online (Sandbox Code Playgroud)

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

但是有很多情况下功能都不合适,因为平方根,即有2个结果.

 sqrt(4) => 2 and -2
Run Code Online (Sandbox Code Playgroud)

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

将关系视为一般化函数,您有:

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

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

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

(conso 1 [2] [1 2]) => true
Run Code Online (Sandbox Code Playgroud)

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

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

 (run 1 [x]
    (conso 1 x [1 2])) => ([2])
Run Code Online (Sandbox Code Playgroud)

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

一个non-relational运算符或函数是运营商不作为的关系,但作为一个简单的功能工作,所以统一采取任何参数为变量是不可能的.

例如,在名称空间中引入有限域之前><之前的运算符.CLPclojure.core.logic.fd

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