Я изучаю книгу Ивана Братко: «Программирование для искусственного интеллекта» для универсального exame и использования SWI Prolog, и у меня есть некоторые сомнения в примере, показанном в этой книге относительно утверждают и retract предикаты.Некоторые проблемы с утверждением нового правила в SWI-Prolog
Он просто представить следующий код, который декларировать некоторые факты, как динамические:
:-dynamic fast(ann).
:-dynamic slow(tom).
:-dynamic slow(pat).
Тогда в оболочке Пролога Используйте утверждает, правила, чтобы определить новое правило в базу данных:
[debug] 59 ?- assert((faster(X,Y) :- fast(X), slow(Y))).
true.
Итак, новое правило, похоже, добавлено в мою базу данных.
Теперь я пытаюсь выполнить этот запрос, и он не в состоянии:
[debug] 64 ?- faster(X,Y).
false.
О книге говорит, что вывод должен быть таким:
A = ann
B = tom
и это звучит хорошо и рационально, потому что у меня есть проконсультируйтесь с предыдущей программой, где говорится, что укажите, кто быстро, а кто медленный, и позже я добавляю более быстрое правило, утверждающее это ...
Почему бы не сработать? возможно, это зависит от реализации Prolog (SWI-Prolog)?
Использование директивы 'dynamic' должен просто указать предикат и его количество аргументов, например ': - динамический быстрый/1' и': -динамический медленный/1'. Утверждение фактов для этих динамических предикатов является отдельным (runtime) шагом. – hardmath
ok, tnx для уточнения – AndreaNobili
Интересное оповещение: Вещи утверждаются только в памяти на время выполнения программы. Я играю с ним, и когда я пытаюсь отменить факты, которые я определил с помощью 'assertz' на отдельных прогонах, он терпит неудачу, потому что их нет. Чтобы постоянно добавлять базу знаний, вам нужен выходной поток с добавлением. –