2015-11-22 57 views
1

说我有事实是这样的:在数据库中更新/添加事实的最佳方法?

fact(abc,2). 

我想是这样的(伪代码):

fact_update(Functor,Name,AddToValue) :- 
    if Fact_exist then update_fact : NewVal is CurrentValue + AddToValue 
    else create_new_fact : Functor(Name,AddToValue) 

我已经试过两种不同的方式。 第一我不很喜欢:

fact_add(Functor,Name,Val) :- 
    Fact =.. [Functor, Name, Val], 
    assert(Fact), 
    say([fact, Fact]). 
fact_update(true, Functor,Name,Val) :- 
    Fact =.. [Functor, Name, Amt], 
    Fact, 
    retractall(Fact), 
    X is Amt + Val, 
    fact_add(Functor,Name,X). %% retractall?? 
fact_update(false,Functor,Name,Val) :- 
    fact_add(Functor,Name,Val). 

第二不起作用:

fact_update(Functor,Name,Val) :- 
    Fact =.. [Functor, Name, Amt], 
    (
     Fact -> retractall(Fact) 
    ; 
     (
     (nonvar(Amt) -> NewAmt is Amt + Val ; NewAmt is Val), 
     Fact =.. [Functor, Name, NewAmt], 
     assert(Fact) 
    ) 
    ), 
    say([upd_fact, Fact]). 

因为当Fact没有成功Amt不会被实例化,所以我总是NewAmt is Val

回答

2

我会写

fact_update(Functor,Name,AddToValue) :- 
    Curr =.. [Functor,Name,CurrVal], 
    ( retract(Curr) 
    -> NextVal is CurrVal+AddToValue, 
     Next =.. [Functor,Name,NextVal] 
    ; Next =.. [Functor,Name,AddToValue] 
), 
    assertz(Next). 
+0

聪明,我没因子评分我可以使用回退()失败/成功作为条件..会试试看。谢谢 – user1019129

相关问题