Динамический предикат Пролог с инкрементным компонентом
У меня есть база знаний, состоящая из набора правил, глава каждого из которых выполняет утверждение или удаление сложных терминов при возникновении определенных условий.
Как я могу гарантировать, что Id
увеличивается с каждым assert(term(Id,A,B,C))
?
2 ответа
Как вы утверждаете условия для 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
быть первым, чтобы быть извлеченным при вызове, как указано выше, со всеми несвязанными аргументами, обеспечивая тем самым доступ к последнему счетчику. Это решение предполагает, однако, что пункты не отозваны произвольно.
Предполагая, что вы не заботитесь о дырах в 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(Джоан), id_person (I, P). Я = 0, P = Джоан.?- assertz_person(al), assertz_person(ian), id_person(I,P). Я = 0, Р = Джоан; I = 1, P = al; I = 2, P = Ян.