Поскольку вы утверждаете предложения для предиката 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
первым, который будет извлечен при вызове, как указано выше, со всеми аргументами, не связанными, таким образомпредоставление доступа к последнему счету.Это решение предполагает, однако, что пункты не отозваны произвольно.