Термины, которые вы вводите на верхнем уровне, обрабатываются как запросы, а термины, которые появляются в файле, загружаемом в Prolog, обрабатываются как набор правил и фактов. Если текст выглядит так, как показано ниже, это правило.
carnivore(X) :- animal(X), eats_meat(X).
Попытка ввести это на верхнем уровне приводит к ошибке ниже. Почему? Поскольку правило является термином :-(Head, Body), и поскольку верхний уровень интерпретирует термины как запросы. Нет предиката с именем :- и двумя аргументами.
?- carnivore(X) :- animal(X), eats_meat(X). ERROR: Undefined
procedure: (:-)/2 ERROR: Rules must be loaded from a file ERROR:
See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
Разве это не глупо? Ну нет. Предположим, у нас есть термин ест_мясо (ратаплан). Если это появляется в файле, это говорит о том, что ратаплан ест мясо. Если он появляется на верхнем уровне, он просит Пролога попытаться доказать, ест ли ратаплан мясо.
Если текст читается
:- use_module(library(clpfd)).
Это директива. Директивы похожи на запросы, но вместо того, чтобы просить верхний уровень что-то сделать, они просят что-то сделать компилятор. Подобно правилам и фактам, такие термины принадлежат файлам.