【问题标题】:How could I encode "implies" logic in LogicBlox?我如何在 LogicBlox 中编码“暗示”逻辑?
【发布时间】:2015-10-10 17:18:12
【问题描述】:

我想在 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 中编码这意味着逻辑?

【问题讨论】:

    标签: encoding prolog logic datalog logicblox


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多