当启动推理电机进行必要的推理时,将生成无限循环。
已根据我使用的元解释器的特定语法定义了规则和事实。
规则是一个五元组,其中第二个字段是规则的结果,而第三个字段是激活规则的条件。
该周期是由术语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).
我应该如何以不创建无限循环的方式修改规则?
答案 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/1
和assertz/1
的调用会起作用。 call_p/1
是否不是从规则中调用Prolog目标的逃逸机制?