谓词来证明另一个kb_store的目标

时间:2015-12-15 14:31:41

标签: erlog

我一直在寻求实现一个内置的谓词,这个谓词可以让我在另一个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,但我仍然对如何做到这一点感到困惑。

拜托,有人可以告诉我这个问题,或者继续这个证明 - 外出工作的方法,这对我有很大的帮助。

谢谢, 颜

0 个答案:

没有答案