2015-11-22 4 views
1

Скажем, у меня есть факты, как это:Лучший способ обновить/добавить факт в db?

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) 

Я пробовал 2 разные пути. Сначала я не очень люблю:

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