我正在尝试实现谓词replace(+OldFact,+NewFact)
只有OldFact存在才能成功。如果这成功那么
必须将NewFact添加到子句集中,并且必须使用OldFact
删除。
我该怎么做? 我无法弄清楚如何实现这一目标 使用事实替换以及如何使用这些断言和撤回 数据库操作命令。
感谢。
答案 0 :(得分: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).