Это распространенная ошибка. А именно, что есть некое допущение, что факты можно заносить в верхний уровень напрямую, набрав его.
Интерпретатор выдает ошибку, так как понимает, что вводится как запрос, а предикат в запросе еще не определен.
Но у конечного пользователя есть несколько вариантов:
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