【问题标题】:Best way to update/add fact in the db?在数据库中更新/添加事实的最佳方式?
【发布时间】:2015-11-22 20:05:47
【问题描述】:

假设我有这样的事实:

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

【问题讨论】:

    标签: prolog prolog-assert


    【解决方案1】:

    我会写

    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).
    

    【讨论】:

    • 聪明,我没有坚持我可以使用retract() 失败/成功作为条件.. 会试一试。谢谢
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2011-11-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多