3

我想知道如何在 LogicBlox / LogiQL 中使用 autoNumbered refmode 谓词

我按照手册中的示例进行操作,但是在将事实断言到实体谓词中时遇到了麻烦,将添加第一个但随后的尝试不会。

这是我在 LB 交互式 shell 中尝试做的事情:

lb> create wibble
created workspace 'wibble'
lb wibble> addblock '
>auto(x), auto_id(x:id) -> int(id).
>lang:autoNumbered(`auto_id).
>cons_auto[] = x -> auto(x).
>lang:constructor(`cons_auto).'
added block 'block_1Z2ZWC0N'
lb wibble> exec '+auto(x), +cons_auto[] = x.'
lb wibble> popcount auto
     1: auto
lb wibble> exec '+auto(x), +cons_auto[] = x.'
lb wibble> popcount auto
     1: auto
4

1 回答 1

3

这里的问题是构造函数 cons_auto。构造函数的工作方式是,对于构造函数的每个唯一键元组,都会创建一个唯一实体,无论您使用相同键元组向构造函数断言多少次

您已经定义了一个没有键的构造函数。这意味着无论您执行多少次声明到其中的增量规则,都将使用此构造函数创建一个实体。

您可以稍微不同地定义构造函数,例如使用一个键:

cons_auto_onekey[key] = x -> int(key), auto(x).
lang:constructor(`cons_auto_onekey).

现在你可以这样做:

+cons_auto_onekey[1] = x, +auto(x).

接着,

+cons_auto_onekey[2] = x, +auto(x).

您会看到创建了两个自动实体。

当然,我怀疑这不是您想要的——因为您打算如何获得钥匙?您将 auto 设置为自动编号的实体的全部意义可能是因为您想自动生成“引用”。

这是 transaction:id 有用的地方。例如

+cons_auto_onekey[key] = x, +auto(x) <-
  transaction:id[] = key.

请注意,每个事务、每个工作区的 transaction:id 都是唯一的。这意味着在同一个事务中,你只会得到一个事务:id,如果你想在同一个事务中创建多个自动实体,你必须对事务进行一些计算:id 以获得更多的唯一数字交易。

还有一个 uid 系列函数也可以帮助生成唯一的 id。但是你必须有一些独特的东西来使用它来生成。我不确定这是否会对您有所帮助,但如果以上内容还不足以帮助您,请告诉我,我们可以探索 uid 是否可以提供帮助。

于 2015-09-24T14:06:53.820 回答