языка, скажем, для организации диалога между системой и пользователем на английском языке. В таких случаях файлы следует рассматривать как последовательности символов, которые не укладываются в синтаксис термов.
Назад | Содержание | Вперёд
Назад | Содержание | Вперёд
6. 2. Обработка файлов термов
6. 2. 1.
Встроенный предикат read используется для чтения термов из текущего входного потока. Цель
read( X)
вызывает чтение следующего терма Т и сопоставление его с X. Если Х - переменная, то в результате Х конкретизируется и становится равным Т. Если сопоставление терпит неудачу, цель read( X) тоже терпит неудачу. Предикат read - детерминированный в том смысле, что в случае неуспеха не происходит возврата для ввода следующего терма. После каждого терма во входном файле должна стоять точка или пробел, или символ возврата каретки.
Если read( X) вычисляется в тот момент, когда достигнут конец текущего входного файла, тогда Х конкретизируется атомом end_of_file (конец файла).
Встроенный предикат write выводит терм. Поэтому цель
write( X)
выведет терм Х в текущий выходной файл. Х будет выведен в той же стандартной форме, в какой обычно пролог-система изображает на экране или распечатке значения переменных. Полезной особенностью Пролога является то, что процедура write 'знает', как изображать любой терм, как бы сложен он не был.
Существуют дополнительные встроенные предикаты для форматирования вывода. Они вставляют пробелы в дополнительные строки в выходной поток. Цель
tab( N)
выводит N пробелов. Предикат nl (без аргументов) приводит к переходу на новую строку.
Следующие примеры иллюстрируют использование этих процедур.
Предположим, у нас есть процедура для вычисления кубов чисел:
куб( N, С) :-
С is N * N * N.
Предположим далее, что мы хотим применить ее для вычисления кубов элементов некоторой последовательности чисел. Это можно сделать с помощью последовательности вопросов:
?- куб( 2, X).
Х = 8
?- ку6( 5, Y).
Y = 125
?- куб( 12, Z).
Z = 1728
Для получения каждого результата нам придется набирать соответствующую цель. Давайте теперь изменим эту программу так, чтобы процедура куб сама читала соответствующие данные. Теперь программа будет сама читать данные и выводить их кубы до тех пор, пока не будет прочитан атом стоп:
куб :-
read( X),
обработать( X).
обработать( стоп) :- !.