Prolog 数据库在回溯时自动撤销

use*_*672 6 prolog

有没有支持可伸缩数据库的 Prolog 实现?我的意思是,当 prolog 引擎通过此谓词调用回溯时,数据库会自动撤回由 assert() 谓词调用插入的事实?换句话说,我想要在回溯时“自动”隐式撤回。

类似的东西可以表达为

my_assert(Fact):- assert(Fact).
my_assert(Fact):- retract(Fact), fail.
Run Code Online (Sandbox Code Playgroud)

但这在通过切割回溯时无法正常工作(!)

或者这个目标可以通过使用 Prolog 的“tabled”风格以某种方式实现?

Ste*_*eve 1

这个库可能对你有用https://github.com/tef/nomads

它使用各种序言术语重写技巧来模拟向所有包含断言事实的谓词添加附加参数。