Encoding 我该如何编码;暗指;LogicBlox中的逻辑?

Encoding 我该如何编码;暗指;LogicBlox中的逻辑?,encoding,prolog,logic,datalog,logicblox,Encoding,Prolog,Logic,Datalog,Logicblox,我想在LogicBlox中编码“暗示”逻辑。 我有一个谓词: Number(n),hasNumberName(n:i)->int(i). isTrue[n] = i -> Number(n), boolean(i). +Number(1). implies[n1,n2,n3] = e -> Number(n1), Number(n2), Number(n3),boolean(e). 我在谓词中添加了一些数据: Number(n),hasNumberName(n:i)-&

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

Number(n),hasNumberName(n:i)->int(i).
isTrue[n] = i -> Number(n), boolean(i).
+Number(1).
 implies[n1,n2,n3] = e -> Number(n1), Number(n2), Number(n3),boolean(e).
我在谓词中添加了一些数据:

Number(n),hasNumberName(n:i)->int(i).
isTrue[n] = i -> Number(n), boolean(i).
+Number(1).
 implies[n1,n2,n3] = e -> Number(n1), Number(n2), Number(n3),boolean(e).
现在,我想创建数字2和数字3,这两个数字的真值遵循以下逻辑规则:

如果isTrue[1]为真,则isTrue[2]为真或isTrue[3]为真。(isTrue[1]表示(isTrue[2]或isTrue[3]))

所以我创建了一个谓词:

Number(n),hasNumberName(n:i)->int(i).
isTrue[n] = i -> Number(n), boolean(i).
+Number(1).
 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.

isTrue[n2]=true;isTrue[n3]=true我假设您试图强制执行1->2或3的约束?如果是,请尝试使用
语法导出值。毕竟,约束是隐含的(右箭头语法不是偶然的!),这将析取放在语言允许的右侧。然后,如果您尝试创建1,但2和3都不存在,则系统将报告约束失败,因为未发现蕴涵


此外,在逻辑语言中,通常不需要布尔值函数<代码> ISTIUE(X)可以是<>代码> x>代码>,您认为它是“true”(并且任何不存在的都是“false”)。p> 从你的问题来看,你问这个问题的背景好像是序言。如果是这样,那么阅读数据日志介绍可能会有所帮助,例如“关于数据日志,您一直想知道什么(但从来不敢问)”

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

人们已经研究了数据日志的扩展,以允许表达更多的程序(不必使用完整的Prolog,这将导致更程序化的语义)。这个特殊的例子被称为“析取数据日志”。如果你想阅读更多,谷歌上的点击率看起来很不错。LogicBlox没有(至少目前)实现析取数据日志,因为我们的主要目标是成为一个可伸缩的数据库管理系统

LogicBlox支持对特定程序使用解算器。一个典型的例子是背包问题。如果您的问题可以表示为优化问题(几乎可以肯定是这样,但公式通常需要一些创造性来处理非常规优化问题),那么您可以使用此功能。解算器功能尚未在公开可用的资料中很好地记录。如果您想尝试一下,请直接联系我们