Бесконечный цикл вывода Пролога - PullRequest
0 голосов
/ 29 января 2019

Бесконечный цикл генерируется, когда логический двигатель активируется, чтобы сделать необходимые выводы.

Правила и факты были определены в соответствии с определенным синтаксисом для мета-интерпретатора, который я использую.

Правило - это пятерка, в которой второе поле является следствием правила, а третье поле - это условия для активации правила.

Цикл вызван обновлением идентификатора (I1) через термин nextID, который я использовал, чтобы убедиться, что каждое утверждение идентификатора увеличивается. Это моя база знаний:

Правила:

rule(1,[gn(Name,Surname,I1),retract(nextID(I)),nextID(I1)],
and([person(Name,Surname),nextID(I),call_p(I1 is I+1),Name=='john']),1,1).

Факты:

fact(1,nextID(0),1).
fact(2,person(john,black),1).

Как изменить правило так, чтобы бесконечный цикл не создавался?

1 Ответ

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

Из вашего описания полей правила я бы ожидал другую формулировку для этого правила:

rule(
    1,
    [retract(nextID(I)), call_p(I1 is I+1), assertz(nextID(I1), gn(Name,Surname,I1)], 
    and([person(Name,Surname), Name == 'john']),
    1,
    1
).

Это будет эквивалентно:

IF
    person(Name,Surname), Name == 'john'
THEN
    retract(nextID(I)), call_p(I1 is I+1),
    assertz(nextID(I1), gn(Name,Surname,I1)

Но трудно сказатьточно не зная деталей вашего механизма правил.

Обновление

Учитывая формулировку фактов, в частности fact(1,nextID(0),1), я не ожидал бы, однако, чтовстроенные вызовы retract/1 и assertz/1 будут работать.Разве call_p/1 не является механизмом побега, чтобы вызывать цели Пролога из правил?

...