如何在 LogiQL 中创建自动编号谓词?
How do I create a autoNumbered predicate in LogiQL?
我想知道如何在 LogicBlox / LogiQL 中使用自动编号的引用模式谓词
我按照 manual 中的示例进行操作,但后来无法将事实断言到实体谓词中,将添加第一个,但不会添加后续尝试。
这是我在 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
这里的问题是构造函数,cons_auto。构造函数的工作方式是,对于构造函数的每个唯一键元组,都会创建一个唯一实体,无论您使用相同的键元组断言多少次
您定义了一个没有键的构造函数。这意味着无论您执行多少次 delta 规则断言,都将使用此构造函数创建一个实体。
您可以稍微不同地定义构造函数,例如使用一个键:
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 设为自动编号实体的全部意义可能是因为您想自动生成 "references".
这是 transaction:id 有用的地方。例如
+cons_auto_onekey[key] = x, +auto(x) <-
transaction:id[] = key.
请注意,transaction:id 对于每个事务、每个工作区都是唯一的。这意味着在同一笔交易中,您只能得到一个 transaction:id,如果您想在同一笔交易中创建多个汽车实体,则必须对 transaction:id 进行一些计算才能得到交易中的更多唯一编号。
还有一个 uid 系列函数也可以帮助生成唯一的 id。但是你必须有一些独特的东西来使用它来生成。我不确定这是否对您有帮助,但如果以上内容还不能帮助您,请告诉我,我们可以探讨 uid 是否可以提供帮助。
我想知道如何在 LogicBlox / LogiQL 中使用自动编号的引用模式谓词
我按照 manual 中的示例进行操作,但后来无法将事实断言到实体谓词中,将添加第一个,但不会添加后续尝试。
这是我在 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
这里的问题是构造函数,cons_auto。构造函数的工作方式是,对于构造函数的每个唯一键元组,都会创建一个唯一实体,无论您使用相同的键元组断言多少次
您定义了一个没有键的构造函数。这意味着无论您执行多少次 delta 规则断言,都将使用此构造函数创建一个实体。
您可以稍微不同地定义构造函数,例如使用一个键:
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 设为自动编号实体的全部意义可能是因为您想自动生成 "references".
这是 transaction:id 有用的地方。例如
+cons_auto_onekey[key] = x, +auto(x) <-
transaction:id[] = key.
请注意,transaction:id 对于每个事务、每个工作区都是唯一的。这意味着在同一笔交易中,您只能得到一个 transaction:id,如果您想在同一笔交易中创建多个汽车实体,则必须对 transaction:id 进行一些计算才能得到交易中的更多唯一编号。
还有一个 uid 系列函数也可以帮助生成唯一的 id。但是你必须有一些独特的东西来使用它来生成。我不确定这是否对您有帮助,但如果以上内容还不能帮助您,请告诉我,我们可以探讨 uid 是否可以提供帮助。