Prolog:用事实代替事实

时间:2016-06-17 01:31:48

标签: prolog swi-prolog

我正在尝试实现谓词replace(+OldFact,+NewFact) 只有OldFact存在才能成功。如果这成功那么 必须将NewFact添加到子句集中,并且必须使用OldFact 删除。

我该怎么做? 我无法弄清楚如何实现这一目标 使用事实替换以及如何使用这些断言和撤回 数据库操作命令。

感谢。

1 个答案:

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