2016-06-17 46 views
0

我想實現一個謂語replace(+OldFact,+NewFact) 只有當OldFact存在哪些成功更換的事實。如果成功,則 NewFact必須添加到組子句和OldFact必須 刪除。序言:用事實

我該怎麼做? 我不能夠清楚地弄清楚,如何使用的事實,以及如何使用這些斷言和收回 數據庫操作命令實現這個 更換。

謝謝。

+0

您可以直接調用'OldFact '以確定它是否在數據庫中。調用(OldFact)'會成功,如果是。然後你可以使用'retract/1'和'assertz/1'來做你想做的事情。您所展示的列表示例代碼不相關,除非您想要做的是具有替換條款列表而非已聲明的事實。 – lurker

+0

你確定你想修改Prolog謂詞嗎?你的定義看起來不像 – false

+0

@lurker。謝謝。其實是的,我想用一個新的事實取代舊事實。如果在數據庫中發現舊的事實,則將其刪除,並在數據庫中插入新的事實。謂詞實現類似於:replace(Oldfact,NewFact)。 –

回答

1

如果我參加面值的要求,你只需要使用我在評論中提到的斷言。你謂詞將是這個樣子:

replace_existing_fact(OldFact, NewFact) :- 
    ( call(OldFact) 
    -> retract(OldFact), 
     assertz(NewFact) 
    ; true 
    ). 

我假設,如果沒有找到OldFact,那麼你想要的只是謂詞成功。如果斷言失敗是可以接受的,如果老的事實並不存在,這將是簡單地寫:

replace_existing_fact(OldFact, NewFact) :- 
    call(OldFact), 
    retract(OldFact), 
    assertz(NewFact). 


注意,如果你有一個以上的相同 OldFact在數據庫中,該斷言爲回溯每一個在每個回溯軌道上替換一個事件。如果你只是想更換其中的一個,你可以使用一個切割:

replace_existing_fact(OldFact, NewFact) :- 
    call(OldFact), !, % Don't backtrack to find multiple instances of old fact 
    retract(OldFact), 
    assertz(NewFact). 

另外,如果你想更換每一個不會被提示進行回溯:

replace_each_existing_fact(OldFact, NewFact) :- 
    forall(replace_existing_fact(OldFact, NewFact), true). 
+0

如果有多個事實,說'F(1)。 F(1).'? – false

+0

@ lurker。非常感謝。現在我明白了這些撤銷和斷言命令的實現。這將幫助我進一步解決更多問題。 –