我一直在寻求实现一个内置的谓词,这个谓词可以让我在另一个Kb_store上证明一个目标。
前:
{ok, Db1} = erlog:new(<<"Db1Handle">>),
{ok, Db2} = erlog:new(<<"Db2Handle">>),
erlog:prove({assert, {tasty, beer}}, <<"Db1Handle">>).
erlog:prove({prove_external, <<"Db1Handle">>, {tasty, {'X'}}},<<"Db2Handle">>). %% Call tasty predicate on Db1 from Db2
> {succeed, [{'X',beer}]}
我已经制作了自己的Db处理程序,工作正常,有了这些句柄,没问题。
但是我遇到了严重的困难: prove_external(DbHandle,ExternalGoal)目标工作。
我已经编写了一个内置的谓词,它会在调用外部目标的prov_goal之前将Db ref从#db记录更改为erlog状态:
prove_external({_Atom, ExternalKb, Goal}, Next0, #est{bs = Bs} = St) ->
OldDb = St#est.db,
NewDb = OldDb#db{ref = ExternalKb},
case erlog_int:prove_goal({call,Goal}, [], St#est{db = NewDb}) of
{succeed, NewState} ->
erlog_int:prove_body(Next0, NewState#est{db = OldDb});
{fail, NewState} ->
erlog_int:fail(NewState#est{db = OldDb});
Else2 ->
erlog_int:fail(St)
end.
然后正确证明了外部目标,但是以下对prov_external的条款将保留在外部Kb而不是交换回原始Kb。
我读过:http://rvirding.blogspot.ro/2009/03/backtracking-in-erlang-part-1-control.html说明了工作原理,但我迷失了实施细节。我知道我必须以某种方式更新CPS,但我仍然对如何做到这一点感到困惑。
拜托,有人可以告诉我这个问题,或者继续这个证明 - 外出工作的方法,这对我有很大的帮助。
谢谢, 颜