Читаем Prolog полностью

                write( Д), tab( 1),


                write( M), tab( 1),


                write( Г), write( ','),


                вывработу( Работа).

        вывсписчлсемьи( [ ]).

        вывсписчлсемьи( [Р | L]) :-


                вывчленсемьи( Р), nl,


                вывсписчлсемьи( L),


        вывработу( неработает) :-


                write( неработает).

        вывработу( работает Место, Оклад) ) :-


                write(' работает '), write( Место),


                write( ', оклад '), write( Оклад).

Рис. 6. 3.  Программа, обеспечивающая вывод в формате, представленном на рис. 6.2.


6. 2. 4.    Обработка произвольного файла термов

Типичная последовательность целей для обработки файла F от начала до конца будет выглядеть примерно так:

        . . . , see( F), обработкафайла, sеe( user), . . .

Здесь обработкафайла - процедура, которая читает и обрабатывает последовательно каждый терм файла F один за другим до тех пор, пока не встретится конец файла. Приведем типичную схему для процедуры

        обработкафайла:


                обработкафайла :-


                        read( Терм),


                        обработка( Терм).

        обработка( end_of_file) :-   !.


                                    % Все сделано

        обработка( Терм) :-


                обраб( Терм),


                                    % Обработать текущий элемент


                обработкафайла.


                                    % Обработать оставшуюся часть файла

Здесь обраб( Терм) представляет процедуру обработки отдельного терма. В качестве примера такой обработки рассмотрим процедуру, которая выдает на терминал каждый терм вместе с его порядковым номером. Назовем эту процедуру показфайла. У нее должен быть дополнительный аргумент для подсчета прочитанных термов:

        показфайла( N) :-


                read( Терм),


                показ( Терм, N).

        показ( Терм, N) :-  !


                write( N), tab( 2), write( Терм),


                Nl is N + 1,


                показфайла( Nl).

Вот другой пример программы обработки файлов, построенной по подобной схеме. Пусть есть файл с именем файл1, термы которого имеют форму

        изделие( НомерИзд, Описание, Цена, ИмяПоставщика)

Каждый терм описывает одну строку каталога изделий. Нужно построить новый файл. содержащий только те изделия, которые выпускаются каким-то конкретным поставщиком. Поскольку поставщик в этом новом файле у всех изделий будет одинаков, его имя нужно записать только один раз в самом начале и убрать из всех остальных термов. Процедура будет называться

        создатьфайл( Поставщик)

Например, если исходный каталог хранится в файле файл1, а мы хотим создать специальный каталог в файле файл2, содержащий всю информацию о том, что поставляет Гаррисон, тогда мы применим процедуру создатьфайл следующим образом:

        ?-  seе( файл1), tеll( файл2), создатьфайл( гаррисон),


                  see( user), tell( user).

Процедуру создатьфайл можно определить так:

        создатьфайл( Поставщик) :-


                write( Поставщик), write( '.'), nl,


                создатьостальное( Поставщик).

        создатьостальное( Поставщик) :-


                read( Изделие),


                обработать( Изделие, Поставщик).

        обработать( end_ot_file) :-  !.

        обработать( Изделие( Ном, Опис, Цена, Поставщик),


                                Поставщик) :-  !,


                write( Изделие( Ном, Опис, Цена) ),


                write( '.'), nl,


                создатьостальное( Поставщик).

            обработать ( _, Поставщик) :-


                создатьостальное( Поставщик).

Обратите внимание на то, что обработать вписывает точки между термами, чтобы впоследствии файл мог быть прочитан процедурой read.

Упражнения

6. 1.    Пусть f  -   файл термов. Определите процедуру

        найтитерм( Терм)

которая выводит на терминал новый терм из f, сопоставимый с Терм'ом.

Посмотреть ответ

6. 2.    Пусть f  -   файл термов. Напишите процедуру

        найтивсетермы( Терм)

которая выводит на экран все термы из f, сопоставимые с Tepм'ом. Обеспечьте при этом, чтобы во время поиска Терм не конкретизировался (это могло бы помешать ему сопоставиться с другими термами дальше по файлу).

Посмотреть ответ


Назад | Содержание | Вперёд

Назад | Содержание | Вперёд

6. 3.    Обработка символов

Символ записывается в текущий выходной поток при помощи цели

        put( С)

где С - символ, который нужно вывести, в кодировке ASCII (число от 0 до 127), например, вопрос

Перейти на страницу:

Похожие книги

Слово о полку Игореве
Слово о полку Игореве

Исследование выдающегося историка Древней Руси А. А. Зимина содержит оригинальную, отличную от общепризнанной, концепцию происхождения и времени создания «Слова о полку Игореве». В книге содержится ценный материал о соотношении текста «Слова» с русскими летописями, историческими повестями XV–XVI вв., неординарные решения ряда проблем «слововедения», а также обстоятельный обзор оценок «Слова» в русской и зарубежной науке XIX–XX вв.Не ознакомившись в полной мере с аргументацией А. А. Зимина, несомненно самого основательного из числа «скептиков», мы не можем продолжать изучение «Слова», в частности проблем его атрибуции и времени создания.Книга рассчитана не только на специалистов по древнерусской литературе, но и на всех, интересующихся спорными проблемами возникновения «Слова».

Александр Александрович Зимин

Литературоведение / Научная литература / Древнерусская литература / Прочая старинная литература / Прочая научная литература / Древние книги