Динамический предикат Пролог с инкрементным компонентом

У меня есть база знаний, состоящая из набора правил, глава каждого из которых выполняет утверждение или удаление сложных терминов при возникновении определенных условий.

Как я могу гарантировать, что 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 = Ян.
Другие вопросы по тегам