Термины, которые вы вводите на верхнем уровне, обрабатываются как запросы, а
термины, которые появляются в файле, который загружен в Пролог, обрабатываются как
набор правил и фактов. Если текст читается, как показано ниже, это правило.
carnivore(X) :- animal(X), eats_meat(X).
Попытка ввести это на верхнем уровне приводит к ошибке ниже. Зачем?
Потому что правило это термин :-( Голова, Тело), а потому что уровень выше
интерпретирует термины как запросы. Там нет предиката с именем: -
и два аргумента.
?- 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
Разве это не глупо? Ну нет. Предположим, у нас есть термин
eats_meat (барабанный бой). Если это появляется в файле, это говорит о том, что
этот раплан ест мясо. Если он появляется на верхнем уровне, он просит Пролог
попытаться доказать, ест ли раплан мясо.
Если текст гласит
:- use_module(library(clpfd)).
Это директива. Директивы похожи на запросы, но вместо
прося toplevel сделать что-то, они просят компилятор сделать
что-то. Подобно правилам и фактам, такие термины содержатся в файлах.