Невозможно создать 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

до свидания

Другие вопросы по тегам