我有一个由一组规则组成的知识库,当某些条件出现时,每个规则的头将对复杂术语进行断言或缩回。
如何确保每个nvm list
递增
Id
?
答案 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
的最新断言子句在被调用时成为第一个被检索的子句,如上所述,所有参数都未绑定,从而提供了对最后一个计数的访问。但是,该解决方案假定子句不会被任意撤回。