2

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

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

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

+Number(1).

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

如果 isTrue[1] 为真,则 isTrue[2] 为真或 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 报告:“错误:规则头部不支持析取”

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

4

2 回答 2

2

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

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

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

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

于 2015-10-11T03:55:56.163 回答
0

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

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

于 2015-10-10T18:14:31.977 回答