具有递增分量的动态Prolog谓词

时间:2019-01-28 20:36:24

标签: prolog global-variables swi-prolog prolog-assert

我有一个由一组规则组成的知识库,当某些条件出现时,每个规则的头将对复杂术语进行断言或缩回。

如何确保每个nvm list递增 Id

2 个答案:

答案 0 :(得分:5)

假设您不关心Id中的孔(缩回id_person/2子句时会发生孔),可以这样做:

:- dynamic nextID/1.
:- dynamic id_person/2.
nextID(0).

assertz_person(P) :-
   nextID(I),
   retract(nextID(I)),
   I1 is I+1,
   assertz(nextID(I1)),
   assertz(id_person(I,P)).

样品使用(与SWI-Prolog 8.0.0和SICStus Prolog 4.5.0一起使用):

?- id_person(I,P).
false.

?- assertz_person(joan), id_person(I,P).
I = 0, P = joan.

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

答案 1 :(得分:5)

在为term/3谓词声明子句时,第一个参数是唯一(整数)标识符,因此不需要辅助动态谓词来表示当前计数器。您可以改为:

:- dynamic(term/3).

assert_term(A, B, C) :-
    (   term(Id, _, _, _) ->
        NextId is Id + 1
    ;   NextId is 1
    ),
    asserta(term(NextId, A, B, C)).

asserta/1的调用将使term/3的最新断言子句在被调用时成为第一个被检索的子句,如上所述,所有参数都未绑定,从而提供了对最后一个计数的访问。但是,该解决方案假定子句不会被任意撤回。