我想在LogicBlox中编码“隐含”逻辑。我有一个谓词:
Number(n),hasNumberName(n:i)->int(i).
isTrue[n] = i -> Number(n), boolean(i).我在谓词中添加了一些数据:
+Number(1).现在,我想创建数字2和数字3,以及这两个数字的真值,遵循以下逻辑规则:
如果isTrue1为真,则isTrue2为真或isTrue3为真。(isTrue1意味着(isTrue2或isTrue3))
所以我创建了一个谓词:
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中编码这意味着逻辑呢?
发布于 2015-10-11 03:55:56
从你的问题看,你似乎是带着Prolog背景来问这个问题的。如果是这样的话,那么阅读Datalog简介可能会很有帮助,例如“您一直想知道的关于Datalog的信息(而且从来不敢问)”。
您要表达的逻辑在Datalog中是不允许的,因为它需要一个解决策略或搜索策略。与Prolog相反,Datalog在计算复杂性方面受到限制,您可以表示这些程序。由于这些限制,它满足了在数据库管理系统中使用的重要要求,最重要的是支持非常大的数据集。在阅读了Datalog很好的介绍之后,计算复杂度的限制将更加清晰。
人们已经对Datalog的扩展进行了研究,以允许更多的程序被表达(而不使用完整的Prolog,这将导致更多的过程语义)。这个特殊的例子被称为“析取数据模拟”。如果你想读更多的话,谷歌上的点击率看上去不错。LogicBlox没有(至少目前)实现析取的Datalog,因为我们的主要目标是成为一个可伸缩的数据库管理系统。
LogicBlox确实支持使用特定程序的求解器。一个典型的例子是背包问题。如果您的问题可以表示为优化问题(这几乎是肯定的,但对于非常规优化问题通常需要一些创造性),那么您可以使用这个特性。解决程序的功能还没有在公开的材料中得到很好的记录。如果你想尝试一下,请直接联系我们。
发布于 2015-10-10 18:14:31
我假设您正在尝试强制执行1 -> 2或3的约束吗?如果是这样的话,尝试使用<-获得一个值是行不通的:如果没有2或3,那么您告诉系统创建的是哪一个?相反,只需使用->语法编写约束即可。毕竟,约束是隐含的(正确的箭头语法不是偶然的!),在语言允许的情况下,将分离置于右侧。然后,如果您尝试创建1,而既不存在2,也不存在3,系统将报告约束失败,因为没有发现该含义有效。
此外,您通常不需要逻辑语言中的布尔值函数;isTrue(x)可以是您认为是"true“的x集合(而任何不存在的函数都是"false")。
https://stackoverflow.com/questions/33056750
复制相似问题