我想實現一個謂語replace(+OldFact,+NewFact)
只有當OldFact存在哪些成功更換的事實。如果成功,則 NewFact必須添加到組子句和OldFact必須 刪除。序言:用事實
我該怎麼做? 我不能夠清楚地弄清楚,如何使用的事實,以及如何使用這些斷言和收回 數據庫操作命令實現這個 更換。
謝謝。
我想實現一個謂語replace(+OldFact,+NewFact)
只有當OldFact存在哪些成功更換的事實。如果成功,則 NewFact必須添加到組子句和OldFact必須 刪除。序言:用事實
我該怎麼做? 我不能夠清楚地弄清楚,如何使用的事實,以及如何使用這些斷言和收回 數據庫操作命令實現這個 更換。
謝謝。
如果我參加面值的要求,你只需要使用我在評論中提到的斷言。你謂詞將是這個樣子:
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).
如果有多個事實,說'F(1)。 F(1).'? – false
@ lurker。非常感謝。現在我明白了這些撤銷和斷言命令的實現。這將幫助我進一步解決更多問題。 –
您可以直接調用'OldFact '以確定它是否在數據庫中。調用(OldFact)'會成功,如果是。然後你可以使用'retract/1'和'assertz/1'來做你想做的事情。您所展示的列表示例代碼不相關,除非您想要做的是具有替換條款列表而非已聲明的事實。 – lurker
你確定你想修改Prolog謂詞嗎?你的定義看起來不像 – false
@lurker。謝謝。其實是的,我想用一個新的事實取代舊事實。如果在數據庫中發現舊的事實,則將其刪除,並在數據庫中插入新的事實。謂詞實現類似於:replace(Oldfact,NewFact)。 –