Этот предикат открывает файл X, если он еще не открыт, и определяет, что текущим входным потоком данных становится файл X. Если X неконкретизирована или X конкретизирована именем несуществующего файла, то фиксируется ошибка.
seeing(X)
Это целевое утверждение согласуется с базой данных, если имя текущего входного потока данных (файла) сопоставимо с X, и не согласуется в противном случае.
seen
Этот предикат закрывает текущий входной поток данных (файл) и определяет, что текущим входным потоком данных становится клавиатура терминала (user).
tell(X)
Этот предикат открывает файл X, если он еще не открыт, и определяет, что текущим выходным потоком данных, в который производится запись, является указанный файл. Если X неконкретизирована, то возникает ошибка. Если tell используется для. переключения выходного потока на еще неоткрытый файл и файл с именем, определяемым X не существует, то файл с таким именем создается. Иначе, если файл, определяемый X, уже существует, то предшествующее содержимое файла уничтожается.
telling
(X)Это целевое утверждение согласуется с базой данных, если X сопоставимо с именем текущего выходного потока данных, иначе оно не согласуется.
told
Этот предикат закрывает текущий выходной поток данных (файл) и записывает маркер конца файла в соответствующий файл. Текущим выходным потоком данных становится дисплей терминала (user).
6.11. Вычисление арифметических выражений
Арифметические возможности языка Пролог первоначально обсуждались в разд. 2.5. Здесь мы подытожим наши знания об использовании предиката 'is' и о том, какие имеются функторы для формирований арифметических выражений.
X is Y
Y должен быть конкретизирован структурой, которую можно интерпретировать как арифметическое выражение (см. разд. 2.4). Сначала вычисляется выражение, которым конкретизирован Y, и получается целое число, называемое результатом. Результат сопоставляется с X, и is считается согласованным или несогласованным в зависимости от исхода сопоставления. Ниже описываются функторы, которые могут быть использованы для построения структуры, расположенной справа от предиката is.
X + Y
Оператор сложения. При вычислении, инициированном предикатом is, результатом является арифметическая сумма его аргументов. Аргументы должны быть конкретизированы структурами, которые можно вычислить и получить в качестве результатов целые числа.
X – Y
Оператор вычитания. При вычислении, инициированном предикатом is, результатом является арифметическая разность его аргументов. Аргументы должны быть конкретизированы структурами, которые можно вычислить и получить в качестве результатов целые числа.
X * Y
Оператор умножения. При вычислении, инициированном предикатом is, его результатом является арифметическое произведение его аргументов. Аргументы должны быть конкретизированы структурами, которые можно вычислить и получить в качестве результатов целые числа.
X / Y
Оператор целочисленного деления. При вычислении, инициированном предикатом is, его результатом является целая часть частного от деления его аргументов. Аргументы должны быть конкретизированы структурами, которые можно вычислить и получить в качестве результатов целые числа.
X mod Y
Остаток от деления целых чисел (сравнение по модулю). При вычислении, инициированном предикатом is, его результатом является целочисленный остаток, получаемый при делении X на Y. Аргументы должны быть конкретизированы структурами, которые можно вычислить и получить в качестве результатов целые числа.
Конкретные реализации Пролога могут включать и некоторые другие арифметические операции, такие, как возведение в степень. Примеры, приведенные в этой книге, используют лишь операции, перечисленные здесь.
В Прологе имеются шесть предикатов для сравнения целых чисел. Эти предикаты первоначально были представлены в разд. 2.5, когда мы обсуждали арифметические возможности языка. Каждый такой предикат записывается как инфиксный оператор, имеющий два аргумента.
X = Y
Предикат проверки на равенство, описанный в разд. 6.8, считается согласованным и в случае, когда его аргументами являются равные целые числа.
X = Y
Предикат проверки на несовпадение из разд. 6.8 также применим для целых чисел. Он выполняется, когда его аргументами являются различные числа.
X ‹ Y
Предикат меньше выполняется, если целое число, соответствующее левому аргументу, меньше, чем число, соответствующее правому аргументу. Оба аргумента должны быть конкретизированы.
X › Y
Предикат больше выполняется, когда целое число, соответствующее левому аргументу, больше, чем целое число, соответствующее правому аргументу. Оба аргумента должны быть конкретизированы, иначе возникает ошибка.
X ›= Y
Предикат больше или равно выполняется, когда целое число, соответствующее левому аргументу, больше или равно целому числу, соответствующему правому аргументу. Оба аргумента должны быть конкретизированы.
X =‹ Y
Предикат меньше или равно выполняется, когда левый аргумент меньше или равен правому аргументу. Оба аргумента должны быть конкретизированы. Заметим, что этот предикат записан как '=‹' а не '‹=' так что символ '‹=' является свободным и может быть использован в качестве оператора, который выглядит как стрелка.
6.13. Наблюдение за выполнением программы на Прологе
В этом разделе описаны встроенные предикаты, которые позволяют наблюдать за выполнением вашей программы. Здесь мы лишь опишем эти встроенные предикаты, а более подробное обсуждение отладки и трассировки программ содержится в гл. 8.
trace
Эффект выполнения предиката trace заключается в установлении режима полной трассировки. Это значит, что после выполнения trace вы получите возможность наблюдать за каждым из четырех основных типов событий[9], которые происходят с каждым порождаемым вашей программой целевым утверждением.
notrace
Эффект выполнения предиката notrace заключается в отмене режима полной трассировки. Однако сохраняется трассировка, вызываемая наличием контрольных точек (предикат spy).
spy Р
Предикат spy используется, когда необходимо обратить особое внимание на выполнение целевых утверждений, содержащих конкретные предикаты. Это можно сделать, установив на них контрольные точки. Предикат spy определен как префиксный оператор, и поэтому нет необходимости заключать в скобки его аргумент. Аргументом предиката может быть:
• Атом. В этом случае контрольная точка устанавливается на все предикаты с именем, соответствующим атому, независимо от того, сколько аргументов они имеют. Так, если бы мы имели утверждения для сорт, имеющие как два, так и три аргумента, то целевое утверждение spy сорт вызвало бы установку контрольных точек на оба множества утверждений.
• Структура вида Имя/Размерность, где Имя - это атом, а Размерность - целое число. Эта запись определяет предикат с функтором Имя, число аргументов которого равно Размерность. Так spy сорт/2 вызвало бы установку контрольных точек на целевые утверждения предиката сорт с двумя аргументами.
• Список. В этом случае список должен заканчиваться пустым списком '[]', а каждый элемент списка сам должен быть допустимым аргументом для предиката spy. Пролог установит контрольные точки во всех местах, указанных в списке. Так spy[copт/2, присоединить/3] вызвал бы установку контрольных точек на предикат сорт с двумя аргументами и на предикат присоединить с тремя аргументами.
debugging
Встроенный предикат debugging позволяет увидеть, какие контрольные точки установлены на текущий момент. В качестве подобного эффекта выполнения целевого утверждения debugging печатается список всех контрольных точек.
nodebug
Целевое утверждение nodebug вызывает устранение всех контрольных точек, установленных на текущий момент.
nospy
Подобно spy, nospy является префиксным оператором. Предикат nospy является более селективным, чем nodebug, так как вы можете точно указать, какие контрольные точки должны быть удалены. Это достигается путем указания аргумента, задаваемого в точности в такой же форме, как и для предиката spy. Так, целевое утверждение nospy[обр/2, присоединить/3] приведет к тому, что будут удалены все контрольные точки с предиката обр с двумя аргументами и с присоединить с тремя аргументами.