Невозможно создать факт в Jekejeke Prolog

Я использую учебник Seven Languages ​​In Seven Weeks Prolog и пытаюсь выполнить несколько примеров, используя Android Jekejeke Runtime. Например, если я добавлю

likes(wallace, grommit).

из учебника, я получаю.

Error: Undefined, private or package local predicate likes/2

Я попытался использовать утверждение, как описано в Как создать факт в SWI- Пролог?, но тогда он говорит, что assert не определено, а не нравится.

Предположительно, я упускаю что-то основное о том, как работает среда выполнения, или ее диалект prolog.it.


person matt freake    schedule 09.02.2015    source источник
comment
Джекек прав. См. этот ответ почему.   -  person false    schedule 10.02.2015


Ответы (2)


assert/1 не является стандартным предикатом, хотя несколько реализаций предоставляют его. Похоже, это не относится к Jekejeke Prolog. Вместо этого используйте стандартные предикаты asserta/1 или assertz/1. Первый утверждает предложение как первое для предиката. Последний утверждает предложение как последнее для сказуемого.

person Paulo Moura    schedule 09.02.2015
comment
И мне нужно их использовать для утверждения факта? Учебное пособие по семи языкам до сих пор пропустило это, если вы это сделаете. - person matt freake; 09.02.2015
comment
Зависит от того, что именно вы имеете в виду, чтобы утверждать факт. Определения предикатов обычно определяются в исходном файле, который вы компилируете и загружаете. Предикаты assert используются при добавлении предложений для динамических предикатов во время выполнения. - person Paulo Moura; 09.02.2015
comment
Спасибо - думаю, это имеет смысл. - person matt freake; 09.02.2015

Это распространенная ошибка. А именно, что есть некое допущение, что факты можно заносить в верхний уровень напрямую, набрав его.

Интерпретатор выдает ошибку, так как понимает, что вводится как запрос, а предикат в запросе еще не определен.

Но у конечного пользователя есть несколько вариантов:

1) В первом варианте используйте assertz/1 или asserta/1:
Верхний уровень предназначен для выполнения целей. Вам нужна цель, которая инструктирует интерпретатор выполнить утверждение. Используйте asserta/1 или assertz/1:

Высший уровень:

?- assertz(likes(foo, bar)).

Обратите внимание, что предикаты, которые уже использовались как статические предикаты, то есть были добавлены методом 2) или 3), больше не могут быть утверждены. Тогда используйте директиву dynamic/1.

Встроенный assert/1 не поддерживается, так как он не является частью основного стандарта ISO и обычно избыточен для assertz/1.

2) Второй вариант: используйте файл и консультируйтесь с ним:
Поместите факты и правила в файл. И консультируйтесь с ним через встроенную консультацию/1.

Файл baz.p:

likes(foo, bar).

Высший уровень:

?- consult('baz.p').

Вместо консультироваться/1 вы также можете использовать sure_loaded/1 или use_module/1.

3) Третий вариант напрямую обращаться из консоли:
Введите факты и правила непосредственно на верхнем уровне. Завершите ввод фактов и правил нажатием клавиши конца файла.

Высший уровень:

?- [user].
likes(foo, bar).
^D

Пока

person Mostowski Collapse    schedule 06.10.2015
comment
См. также de.wikipedia.org/wiki/ - person Mostowski Collapse; 06.10.2015