我如何在 LogicBlox 中编码 "implies" 逻辑?
How could I encode "implies" logic in LogicBlox?
我想在 LogicBlox 中编码 "implies" 逻辑。
我有一个谓词:
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 报告:"error: disjunction is not supported in the head of a rule "
那么如何在 LogicBlox 中对这隐含的逻辑进行编码?
我假设您正在尝试强制执行 1 -> 2 或 3 的约束?如果是这样,尝试使用 <-
得出一个值是行不通的:如果 2 和 3 都不存在,您要告诉系统创建哪个?相反,只需使用 ->
语法编写约束。约束 是 的含义,毕竟(右箭头语法并非偶然!),并且将析取放在语言允许的右侧。然后,如果您尝试创建 1 而 2 和 3 都不存在,系统将报告约束失败,因为未发现蕴涵成立。
此外,您通常不需要逻辑语言中的布尔值函数; isTrue(x)
可以只是您认为是 "true" 的 x
的集合(任何不存在的都是 "false")。
从你的问题来看,你问这个问题的背景似乎是 Prolog。如果是这样,那么阅读 Datalog 介绍可能会有所帮助,例如 "What you always wanted to know about Datalog (and never dared to ask)".
你想表达的逻辑在Datalog中是故意不允许的,因为它需要解决或搜索策略。与 Prolog 不同,Datalog 有意限制了您可以表达的程序的计算复杂性。由于这些限制,它满足了在数据库管理系统中使用的重要要求,最重要的是支持非常大的数据集。读了Datalog的好介绍,计算复杂度限制会更清楚。
人们研究了 Datalog 的扩展以允许表达更多的程序(无需使用完整的 Prolog,这将导致更多的过程语义)。这个特殊的例子叫做 "Disjunctive Datalog"。如果您想阅读更多内容,Google 上的点击率看起来很不错。 LogicBlox 确实(至少目前)没有实现析取数据日志,因为我们的主要 objective 是一个可扩展的数据库管理系统。
LogicBlox 支持对特定程序使用求解器。一个典型的例子是背包问题。如果您的问题可以表示为优化问题(几乎可以肯定是,但对于非传统优化问题的问题,表述通常需要一些创造性),那么您可以使用此功能。求解器功能在公开可用的 material 中还没有很好的记录。如果您想尝试一下,请直接与我们联系。
我想在 LogicBlox 中编码 "implies" 逻辑。 我有一个谓词:
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 报告:"error: disjunction is not supported in the head of a rule "
那么如何在 LogicBlox 中对这隐含的逻辑进行编码?
我假设您正在尝试强制执行 1 -> 2 或 3 的约束?如果是这样,尝试使用 <-
得出一个值是行不通的:如果 2 和 3 都不存在,您要告诉系统创建哪个?相反,只需使用 ->
语法编写约束。约束 是 的含义,毕竟(右箭头语法并非偶然!),并且将析取放在语言允许的右侧。然后,如果您尝试创建 1 而 2 和 3 都不存在,系统将报告约束失败,因为未发现蕴涵成立。
此外,您通常不需要逻辑语言中的布尔值函数; isTrue(x)
可以只是您认为是 "true" 的 x
的集合(任何不存在的都是 "false")。
从你的问题来看,你问这个问题的背景似乎是 Prolog。如果是这样,那么阅读 Datalog 介绍可能会有所帮助,例如 "What you always wanted to know about Datalog (and never dared to ask)".
你想表达的逻辑在Datalog中是故意不允许的,因为它需要解决或搜索策略。与 Prolog 不同,Datalog 有意限制了您可以表达的程序的计算复杂性。由于这些限制,它满足了在数据库管理系统中使用的重要要求,最重要的是支持非常大的数据集。读了Datalog的好介绍,计算复杂度限制会更清楚。
人们研究了 Datalog 的扩展以允许表达更多的程序(无需使用完整的 Prolog,这将导致更多的过程语义)。这个特殊的例子叫做 "Disjunctive Datalog"。如果您想阅读更多内容,Google 上的点击率看起来很不错。 LogicBlox 确实(至少目前)没有实现析取数据日志,因为我们的主要 objective 是一个可扩展的数据库管理系统。
LogicBlox 支持对特定程序使用求解器。一个典型的例子是背包问题。如果您的问题可以表示为优化问题(几乎可以肯定是,但对于非传统优化问题的问题,表述通常需要一些创造性),那么您可以使用此功能。求解器功能在公开可用的 material 中还没有很好的记录。如果您想尝试一下,请直接与我们联系。