Prolog 序言;触发器“;在持久谓词上,即当某些内容发生更改时运行某些代码
我正在使用库(persistency),我希望在底层数据库更改时运行一些触发器 以下是一些示例代码: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),
:- 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.