Невозможно создать Fact в Jekejeke Prolog
Я использую учебник Пролог "Семь языков за семь недель" и пытаюсь пробежаться по нескольким примерам, используя Android Jekejeke Runtime. Например, если я добавлю
likes(wallace, grommit).
из учебника я понял.
Error: Undefined, private or package local predicate likes/2
Я пытался использовать assert, как описано в разделе Как создать факт в SWI-Prolog?, но тогда это говорит о том, что assert
не определено, вместо лайков.
Предположительно, я упускаю что-то простое о том, как работает среда выполнения, или ее диалекте prolog.it.
2 ответа
assert/1
не является стандартным предикатом, хотя некоторые реализации предоставляют его. Похоже, это не относится к Jekejeke Prolog. Используйте вместо этого либо asserta/1
или assertz/1
стандартные предикаты. Первый утверждает, что предложение является первым для предиката. Последний утверждает, что предложение является последним для предиката.
Это распространенная ошибка. А именно, что существует определенное предположение, что факты можно вводить непосредственно на верхнем уровне, печатая его.
Интерпретатор выдает ошибку, так как он понимает, что вводится как запрос, а предикат в запросе еще не определен.
Но у конечного пользователя есть несколько вариантов:
1) Первый вариант использования assertz / 1 или asserta / 1:
Верхний уровень предназначен для выполнения целей. Вам нужна цель, которая инструктирует переводчика выполнить утверждение. Используйте asserta / 1 или assertz / 1:
Верхний уровень:
?- assertz(likes(foo, bar)).
Обратите внимание, что предикаты, которые уже использовались в качестве статического предиката, то есть были добавлены методом 2) или 3), больше не могут быть утверждены. Тогда используйте директиву dynamic / 1.
Встроенный assert / 1 не поддерживается, поскольку он не является частью основного стандарта ISO и обычно избыточен для assertz / 1.
2) Второй вариант - использовать файл и обратиться к нему:
Поместите факты и правила в файл. И проконсультируйтесь с помощью встроенного в consult / 1.
Файл baz.p:
likes(foo, bar).
Верхний уровень:
?- consult('baz.p').
Вместо consult / 1 вы также можете использовать sure_loaded/1 или use_module / 1.
3) Третий вариант напрямую проконсультироваться с консоли:
Введите факты и правила прямо на верхнем уровне. Завершите ввод фактов и правил нажатием клавиши "конец файла".
Верхний уровень:
?- [user].
likes(foo, bar).
^D
до свидания