encoding - 如何在 LogicBlox 中编码 "implies"逻辑?

标签 encoding prolog logic datalog logicblox

我想在 LogicBlox 中对“隐含”逻辑进行编码。 我有一个谓词:

Number(n),hasNumberName(n:i)->int(i).
isTrue[n] = i -> Number(n), boolean(i).

我在该谓词中添加了一些数据:

+Number(1).

现在,我想创建数字 2 和数字 3,以及这两个数字遵循以下逻辑规则的真值:

如果 isTrue[1] 为 true,则 isTrue[2] 为 true 或 isTrue[3] 为 true。 (isTrue[1] 暗示 (isTrue[2] 或 isTrue[3]))

所以我创建一个谓词:

 implies[n1,n2,n3] = e -> Number(n1), Number(n2), Number(n3),boolean(e).

然后我尝试创建这样的规则:

isTrue[n2] = true;isTrue[n3] = true <- isTrue[n1] = true,implies[n1,n2,n3] = true.

但是 LogicBlox 报告:“错误:规则头部不支持析取”

那么我如何在 LogicBlox 中编码这意味着逻辑?

最佳答案

从您的问题来看,您似乎是在有 Prolog 背景的情况下问这个问题。如果是这样,那么阅读 Datalog 介绍可能会有所帮助,例如“您一直想了解 Datalog 的哪些内容(但从来不敢问)”。

Datalog 中故意不允许您想要表达的逻辑,因为它需要解决或搜索策略。与 Prolog 不同,Datalog 有意限制您可以表达的程序的计算复杂性。由于这些限制,它满足了在数据库管理系统中使用的重要要求,最重要的是支持非常大的数据集。阅读 Datalog 的精彩介绍后,计算复杂度限制将会更加清晰。

人们已经研究了 Datalog 的扩展,以允许表达更多的程序(无需使用完整的 Prolog,这将导致更多的过程语义)。这个特定的例子称为“分离数据记录”。如果你想了解更多内容,谷歌上的点击率看起来不错。 LogicBlox(至少目前)没有实现析取数据日志,因为我们的主要目标是成为一个可扩展的数据库管理系统。

LogicBlox 确实支持对特定程序使用求解器。一个典型的例子就是背包问题。如果您的问题可以表达为优化问题(几乎可以肯定是这样,但公式通常需要一些非传统优化问题的创造力),那么您可以使用此功能。公开 Material 中尚未详细记录求解器功能。如果您想尝试一下,请直接与我们联系。

关于encoding - 如何在 LogicBlox 中编码 "implies"逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33056750/

相关文章:

java - 嵌套 for 循环中的逻辑问题

python - ngrams的计数频率

git - 提交编码更改

database - 使用 swi-prolog 更改和删除文本文件中的行

prolog - 我怎样才能以正确的方式得到这个简单的 Prolog 谓词 "return"?

c# - 将信息从 MS Access 数据库传输到 MySQL 数据库

javascript - 如何重写否定行?

ruby-on-rails - ActionMailer 非 ASCII 字符

Java:使用 key 对字符串进行 Base64 编码

list - Prolog:根据 DCG 从列表中生成一个术语