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