Prolog:使用事实替换事实
Prolog: Replace fact using fact
我正在尝试实现谓词 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).
我正在尝试实现谓词 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).