Чтение онлайн

на главную - закладки

Жанры

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

Братко Иван

Шрифт:

вывсемью( F)

с помощью которой это достигается, приведена на рис. 6.3.

вывсемью( семья ( Муж, Жена, Дети) :-

 nl, write( родители), nl, nl,

 вывчленсемьи( Муж), nl,

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

 write( дети), nl, nl,

 вывчленсемьи( Дети).

вывчленсемьи( членсемьи( Имя, Фамилия, дата( Д,
М, Г), Работа) ) :-

 tab(4), write( Имя),

 tab(1), write( Фамилия),

 write( ', дата рождения'),

 write( Д), tab( 1),

 write( M), tab( 1),

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

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

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

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

 вывчленсемьи( P), 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(
Терм),

 N1 is N + 1,

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

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

файл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м
'ом. Обеспечьте при этом, чтобы во время поиска
Терм
не конкретизировался (это могло бы помешать ему сопоставиться с другими термами дальше по файлу).

Поделиться:
Популярные книги

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Его огонь горит для меня. Том 2

Муратова Ульяна
2. Мир Карастели
Фантастика:
юмористическая фантастика
5.40
рейтинг книги
Его огонь горит для меня. Том 2

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Наследник

Кулаков Алексей Иванович
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
8.69
рейтинг книги
Наследник

Совершенно несекретно

Иванов Дмитрий
15. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Совершенно несекретно

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Единственная для темного эльфа 3

Мазарин Ан
3. Мир Верея. Драконья невеста
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Единственная для темного эльфа 3

Жандарм

Семин Никита
1. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
4.11
рейтинг книги
Жандарм

Долгий путь домой

Русич Антон
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Долгий путь домой

Прогрессор поневоле

Распопов Дмитрий Викторович
2. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прогрессор поневоле

Наследие Маозари 6

Панежин Евгений
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 6

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита