Prolog 序言;触发器“;在持久谓词上,即当某些内容发生更改时运行某些代码

Prolog 序言;触发器“;在持久谓词上,即当某些内容发生更改时运行某些代码,prolog,swi-prolog,Prolog,Swi Prolog,我正在使用库(persistency),我希望在底层数据库更改时运行一些触发器 以下是一些示例代码: :- use_module(library(persistency)). :- persistent temperature(t:any). :- persistent running(device:any). :- db_attach('foo.db', []), db_sync(gc(0)). run_triggers :- forall(trigger(GoalCond, Body),

我正在使用库(persistency),我希望在底层数据库更改时运行一些触发器

以下是一些示例代码:

:- use_module(library(persistency)).
:- persistent temperature(t:any).
:- persistent running(device:any).
:- db_attach('foo.db', []), db_sync(gc(0)).

run_triggers :- forall(trigger(GoalCond, Body), ignore((GoalCond, Body))).

trigger(
    (temperature(T), T > 23, \+ running(cooler)),
    (writeln('temperature too high, activating cooler'), assert_running(cooler))
).
trigger(
    (temperature(T), T < 4, running(cooler)),
    (writeln('temperature too low, deactivating cooler'), retractall_running(cooler))
).
理想情况下,我希望在数据库中每次更改后自动运行
run\u触发器。
怎么做


在这个简单的例子中,我只有两个持久性谓词,但在实际情况中,我有数百个持久性谓词,因此手动包装这些谓词不是一个选项。

我将创建一个不同的谓词,包装
assert\u temperature
,调用
run\u触发器。然后,根本不要导出
assert\u temperature
,而是导出新的包装器。@DanielLyons问题是我必须包装的持久谓词有数百个,所以不是simpleLogalk的事件驱动编程支持()这将是一个完美的选择,但它需要以不同的方式执行持久性。也许可以找到一种方法来包装
持久性
声明,以便它同时对触发器进行一些簿记?持久性库在几行代码中实现。也许您可以稍微修改一下(例如,在断言过程中的
persistency:DBAction
之后添加一个目标;查看persistence.pl中的
assert\u子句/3
?- run_triggers.
true.

?- temperature(T).
T = -2.

?- retractall_temperature(_), assert_temperature(25).
true.

?- run_triggers.
temperature too high, activating cooler
true.

?- running(X).
X = cooler.