首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何在LogicBlox中编码“暗示”逻辑?

我如何在LogicBlox中编码“暗示”逻辑?
EN

Stack Overflow用户
提问于 2015-10-10 17:18:12
回答 2查看 129关注 0票数 2

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

代码语言:javascript
复制
Number(n),hasNumberName(n:i)->int(i).
isTrue[n] = i -> Number(n), boolean(i).

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

代码语言:javascript
复制
+Number(1).

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

如果isTrue1为真,则isTrue2为真或isTrue3为真。(isTrue1意味着(isTrue2或isTrue3))

所以我创建了一个谓词:

代码语言:javascript
复制
 implies[n1,n2,n3] = e -> Number(n1), Number(n2), Number(n3),boolean(e).

然后我试着创建一个这样的规则:

代码语言:javascript
复制
isTrue[n2] = true;isTrue[n3] = true <- isTrue[n1] = true,implies[n1,n2,n3] = true.

但是LogicBlox报告说:“错误:规则的头不支持分离”

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-11 03:55:56

从你的问题看,你似乎是带着Prolog背景来问这个问题的。如果是这样的话,那么阅读Datalog简介可能会很有帮助,例如“您一直想知道的关于Datalog的信息(而且从来不敢问)”。

您要表达的逻辑在Datalog中是不允许的,因为它需要一个解决策略或搜索策略。与Prolog相反,Datalog在计算复杂性方面受到限制,您可以表示这些程序。由于这些限制,它满足了在数据库管理系统中使用的重要要求,最重要的是支持非常大的数据集。在阅读了Datalog很好的介绍之后,计算复杂度的限制将更加清晰。

人们已经对Datalog的扩展进行了研究,以允许更多的程序被表达(而不使用完整的Prolog,这将导致更多的过程语义)。这个特殊的例子被称为“析取数据模拟”。如果你想读更多的话,谷歌上的点击率看上去不错。LogicBlox没有(至少目前)实现析取的Datalog,因为我们的主要目标是成为一个可伸缩的数据库管理系统。

LogicBlox确实支持使用特定程序的求解器。一个典型的例子是背包问题。如果您的问题可以表示为优化问题(这几乎是肯定的,但对于非常规优化问题通常需要一些创造性),那么您可以使用这个特性。解决程序的功能还没有在公开的材料中得到很好的记录。如果你想尝试一下,请直接联系我们。

票数 2
EN

Stack Overflow用户

发布于 2015-10-10 18:14:31

我假设您正在尝试强制执行1 -> 2或3的约束吗?如果是这样的话,尝试使用<-获得一个值是行不通的:如果没有2或3,那么您告诉系统创建的是哪一个?相反,只需使用->语法编写约束即可。毕竟,约束是隐含的(正确的箭头语法不是偶然的!),在语言允许的情况下,将分离置于右侧。然后,如果您尝试创建1,而既不存在2,也不存在3,系统将报告约束失败,因为没有发现该含义有效。

此外,您通常不需要逻辑语言中的布尔值函数;isTrue(x)可以是您认为是"true“的x集合(而任何不存在的函数都是"false")。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33056750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档