0

我想对一些 EDB 进行更改,然后找出 IDB 是如何改变的。

文档说查询阶段在最后阶段之后,并且“可以访问最终阶段的效果” 。但如果我跑

query '_(id) <- ^level(id; _).'

(其中 level 是 IDB)我得到

block block_1Z7PZ61E: line 2: error: predicate level is an IDB, therefore deltas for it will not be available until stage final. (code: STAGE_INITIAL_IDB_DELTA)
    ^level(id; _).
    ^^^^^^^^^^^^^

1 ERROR
BloxCompiler reported 1 error in block 'block_1Z7PZ61E'

我还尝试遵循diff 谓词示例。但是这个

query '_(id) <- (level\level@prev)(id; _).'

导致语法错误:

block block_1Z80EFSZ: line 2: error: illegal character 'U+005C' (code: ILLEGAL_CHARACTER)
    (level\level@prev)(id; _).
          ^

block block_1Z80EFSZ: line 2: error: unexpected token 'level' (code: UNEXPECTED_TOKEN)
    (level\level@prev)(id; _).
           ^^^^^

block block_1Z80EFSZ: line 2: error: unexpected token ')' (code: UNEXPECTED_TOKEN)
    (level\level@prev)(id; _).
                     ^

block block_1Z80EFSZ: line 2: error: unexpected token ';' (code: UNEXPECTED_TOKEN)
    (level\level@prev)(id; _).
                         ^

4 ERRORS
BloxCompiler reported 4 errors in block 'block_1Z80EFSZ'
4

1 回答 1

0

不幸的是,差异谓词功能尚未发布(截至 2016 年 12 月)。我们已经注意到这是一个需要修复的文档错误。该功能预计在 2017 年第一季度的 LB 4.4 中。

这是一个简单的示例,用于在更改 EDB 后打印或查询 IDB 谓词中的值。在这种情况下,您不需要使用增量逻辑。

[dan@glycerine Fri Dec 30 09:55:54 ~/Temp]
$ cat foo.logic
foo(x), foo_id(x: y) -> int(y).
edb[x] = y -> foo(x), int(y).
idb[x] = y -> foo(x), int(y).
idb[x] = y <- edb[x] + 10 = y.
[dan@glycerine Fri Dec 30 09:56:33 ~/Temp]
$ lb create --overwrite foo && lb addblock foo --name foo --file foo.logic && lb exec foo '+foo(x), +foo_id[x] = 1, +edb[x] = 5.'
created workspace 'foo'
added block 'foo'
[dan@glycerine Fri Dec 30 09:57:23 ~/Temp]
$ lb print foo edb
[10000000005] 1 5
[dan@glycerine Fri Dec 30 09:57:28 ~/Temp]
$ lb print foo idb
[10000000005] 1 15
[dan@glycerine Fri Dec 30 09:57:32 ~/Temp]
$ lb exec foo '^edb[x] = 15 <- foo_id[x] = 1.'
[dan@glycerine Fri Dec 30 09:57:54 ~/Temp]
$ lb print foo idb
[10000000005] 1 25
[dan@glycerine Fri Dec 30 09:57:55 ~/Temp]
$ lb query foo '_[x] = edb[x].'
/--------------- _ ---------------\
[10000000005] 1 15
\--------------- _ ---------------/

我可以想到几个选项来更多地观察发生的变化。在这种情况下,您可以像这样创建一个观察者谓词并为其添加值。

watcher(x, y) -> int(x), int(y).
^watcher(x, y) <- foo_id[x] = id, ^idb[id] = y.

可以增强它以拥有自己的实体和时间戳......

另一种方法,如果您使用 Web 服务进行 EDB 更新,则使用

lb web-server monitor -w foo idb

查看谓词列表。

于 2016-12-30T16:07:55.740 回答