Программирование на языке ПРОЛОГ для искуственного интеллекта

       

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


Типичная последовательность целей для обработки файла 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.


Содержание раздела