我有一个由一组规则组成的知识库,当某些条件出现时,其每个规则的标题都会执行复杂术语的断言或缩回。

如何确保每个Id都增加assert(term(Id,A,B,C))

最佳答案

假设您不关心Id中的漏洞(在收回id_person/2子句时发生),则可以执行以下操作:

:-动态nextID / 1。
:-动态id_person / 2。
nextID(0)。

assertz_person(P):-
nextID(I),
缩回(nextID(I)),
I1是I + 1,
assertz(nextID(I1)),
assertz(id_person(I,P))。

使用示例(与SWI-Prolog 8.0.0和SICStus Prolog 4.5.0一起使用):

?-id_person(I,P)。
假。

?-assertz_person(joan),id_person(I,P)。
我= 0,P =琼。

?-assertz_person(al),assertz_person(ian),id_person(I,P)。
I = 0,P =琼
; I = 1,P = al
; I = 2,P = ian。

08-25 08:35