无限循环推理序言

时间:2019-01-29 16:48:27

标签: prolog inference-engine

当启动推理电机进行必要的推理时,将生成无限循环。

已根据我使用的元解释器的特定语法定义了规则和事实。

规则是一个五元组,其中第二个字段是规则的结果,而第三个字段是激活规则的条件。

该周期是由术语nextID更新ID(I1)引起的,我用来确保每个断言ID都递增。这是我的知识库:

规则:

rule(1,[gn(Name,Surname,I1),retract(nextID(I)),nextID(I1)],
and([person(Name,Surname),nextID(I),call_p(I1 is I+1),Name=='john']),1,1).

事实:

fact(1,nextID(0),1).
fact(2,person(john,black),1).

我应该如何以不创建无限循环的方式修改规则?

1 个答案:

答案 0 :(得分:0)

根据您对规则字段的描述,我希望该规则有不同的表述:

rule(
    1,
    [retract(nextID(I)), call_p(I1 is I+1), assertz(nextID(I1), gn(Name,Surname,I1)], 
    and([person(Name,Surname), Name == 'john']),
    1,
    1
).

这等同于:

IF
    person(Name,Surname), Name == 'john'
THEN
    retract(nextID(I)), call_p(I1 is I+1),
    assertz(nextID(I1), gn(Name,Surname,I1)

但是在不知道规则引擎的细节的情况下很难准确分辨。

更新

考虑到事实的表达,尤其是fact(1,nextID(0),1),但是我不希望嵌入对retract/1assertz/1的调用会起作用。 call_p/1是否不是从规则中调用Prolog目标的逃逸机制?