在实践中,非关系对 core.logic 意味着啥?

Posted

技术标签:

【中文标题】在实践中,非关系对 core.logic 意味着啥?【英文标题】:What does non-relational mean in practice for core.logic?在实践中,非关系对 core.logic 意味着什么? 【发布时间】:2016-02-20 15:05:19 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

比如说:

 f(x) = x + 2

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

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

 sqrt(4) => 2 and -2

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

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

任意数量的结果(零个或多个) 非确定性 每次调用的输入/输出参数可能不同 如果关系为真,则关系返回 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-Sergeant 的 this talk 中找到许多概念。

【讨论】:

你能举例说明为什么 conda 和 condu 是非关系的,而 conde 是? conde 探索所有分支,conda 充当操作员切入序言并在找到第一个解决方案时结束。所以conda 没有找到所有满足关系的结果,而只找到了第一个。 那么您在答案中指定的 4 点中的哪一个使 conda 不是关系? conda 不是关系型的,因为你依赖规则的顺序来确定它们的逻辑含义,所以不满足非确定性原则

以上是关于在实践中,非关系对 core.logic 意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 core.logic 中模拟“外部连接”?

Core.logic的简明解释

Clojure core.logic 的简单 Prolog

对 Laravel Livewire 组件进行水合和脱水意味着啥?

为啥 core.logic 的输出重复给出相同的值?

Clojure core.logic 中的阶乘