我正在使用库(持久性),当基础数据库发生更改时,我想运行一些触发器。
这是一些示例代码:
:- 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_triggers.
true.
?- temperature(T).
T = -2.
?- retractall_temperature(_), assert_temperature(25).
true.
?- run_triggers.
temperature too high, activating cooler
true.
?- running(X).
X = cooler.
理想情况下,我希望在数据库中的每次更改后自动运行run_triggers
。
怎么做?
在这个简单的示例中,我只有两个持久性谓词,但在实际情况下,我有成百上千个谓词,因此手动包装这些谓词不是一种选择。