Динамический предикат Пролог с инкрементным компонентом - PullRequest
0 голосов
/ 28 января 2019

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

Как я могу гарантировать, что Id увеличивается с каждым assert(term(Id,A,B,C))?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

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

0 голосов
/ 29 января 2019

Предполагая, что вас не волнуют дыры в 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.
...