Clojure 对于core.logic,非关系在实践中意味着什么?

Clojure 对于core.logic,非关系在实践中意味着什么?,clojure,clojure-core.logic,minikanren,Clojure,Clojure Core.logic,Minikanren,当试图通过API文档理解core.logic时,我遇到了非关系目标和关系目标。我不知道这在实践中意味着什么,也不知道如果目标是相关的或非相关的,为什么注释目标很重要 你能举例说明这些目标是如何根据它们是否相关而不同地使用的吗 为了解释非关系的含义,我们需要重新审视关系的含义 如果在函数编程中考虑纯函数,它们总是返回一个值,对于相同的输入参数,返回相同的输出值。 比如说: f(x) = x + 2 对于输入值3,此函数始终返回5 但也有很多情况是函数不合适,如平方根,即有2个结果 sqrt(

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


你能举例说明这些目标是如何根据它们是否相关而不同地使用的吗

为了解释非关系的含义,我们需要重新审视
关系的含义

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

比如说:

 f(x) = x + 2
对于输入值
3
,此函数始终返回
5

但也有很多情况是函数不合适,如平方根,即有2个结果

 sqrt(4) => 2 and -2
或者将一个数字除以零,没有结果

将关系视为广义函数,可以:

  • 任意数量的结果(零或更多)
  • 非确定性
  • 每个调用的in/out参数可能不同
  • 如果关系为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])
在逻辑编程中,统一回答了这样一个问题:为了满足这种关系,世界应该是什么样子

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


例如,在诸如
之类的运算符中发生了这种情况。您能否举例说明为什么conda和condu是非关系的,而conde是?
conde
探索了所有分支,
conda
作为在prolog中剪切的运算符,并在找到第一个解决方案时完成。因此,
conda
不能找到所有满足关系的结果,而只能找到第一个。那么,您在Ansare中指定的4个点中,有哪一点使conda不是关系?conda不是关系的,因为您依赖规则的顺序来确定其逻辑意义,因此不满足非确定性原则