持久谓词上的序言“触发”,即在某些更改时运行一些代码

时间:2018-07-09 17:08:27

标签: prolog swi-prolog

我正在使用库(持久性),当基础数据库发生更改时,我想运行一些触发器。

这是一些示例代码:

:- 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 。 怎么做?

在这个简单的示例中,我只有两个持久性谓词,但在实际情况下,我有成百上千个谓词,因此手动包装这些谓词不是一种选择。

0 个答案:

没有答案