我怎么能编码"暗示" LogicBlox中的逻辑?

时间:2015-10-10 17:18:12

标签: 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]为真,则isTrue [2]为true或isTrue [3]为真。 (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报道:&#34;错误:规则的头部不支持分离&#34;

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

2 个答案:

答案 0 :(得分:2)

从你的问题看来,你似乎是在用Prolog背景提出这个问题。如果是这样,那么阅读Datalog的介绍可能会有所帮助,例如&#34;你一直想知道的Datalog(并且从不敢问)&#34;。

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

人们已经研究过Datalog的扩展,以允许表达更多的程序(没有完整的Prolog,这将导致更多的程序语义)。这个特殊的例子被称为&#34; Disjunctive Datalog&#34;。如果您想阅读更多内容,Google上的热门游戏看起来很不错。 LogicBlox(至少目前)没有实现Disjunctive Datalog,因为我们的主要目标是成为可扩展的数据库管理系统。

LogicBlox支持使用特定程序的解算器。一个典型的例子是背包问题。如果你的问题可以表达为一个优化问题(几乎可以肯定的是,但是这个公式通常需要一些非传统优化问题的创造力),那么你可以使用这个功能。解决方案功能尚未在公开可用的材料中得到很好的记录。如果您想尝试一下,请直接与我们联系。

答案 1 :(得分:0)

我假设您正在尝试强制实施1 - &gt;的约束。 2或3?如果是这样,尝试使用<-导出值是行不通的:如果2和3都不存在,那么你告诉系统创建了哪一个?相反,只需使用->语法编写约束。毕竟,约束含义(右箭头语法并非偶然!),并且将析取放在语言允许的右侧。然后,如果您尝试创建1并且2和3都不存在,系统将报告约束失败,因为未发现含义。

此外,您通常不需要逻辑语言中的布尔值函数; isTrue(x)可以只是x的集合,您认为它是“真实的”(任何不存在的都是“假”)。