0

当推理电机被激活以进行必要的推理时,将生成一个无限循环。

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

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

该循环是由通过术语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).

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

4

1 回答 1

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/1andassertz/1会起作用。call_p/1从规则中调用Prolog目标的逃生机制不是吗?

于 2019-01-29T17:17:31.343 回答