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

              write( 'Следующее число, пожалуйста:'),

              read( X),

              обработать( X).

        о6работать( стоп) :-   !.

        обработать( N) :-

              С is N * N * N,

              write( 'Куб'),  write( N),  write( 'равен').

              write( С), nl,

              куб.

Разговор с новой версией мог бы быть, например, таким:

        ?-  куб.

        Следующее число, пожалуйста: 5.

        Куб 5 равен 125

        Следующее число, пожалуйста: 12.

        Куб 12 равен 1728

        Следующее число, пожалуйста: стоп.

        yes

В некоторых реализациях для того, чтобы приглашение появилось на экране перед чтением, необходимо выдать дополнительный запрос (такой, скажем, как ttyflush) после записи.

В последующих разделах мы увидим некоторые типичные примеры операций, в которых участвуют чтение и запись.

6. 2. 2.    Вывод списков

Кроме стандартного прологовского формата для списков существуют несколько других естественных форм их внешнего представления, которые в некоторых ситуациях являются более предпочтительными. Следующая процедура

        вывспис( L)

выводит список L так, что каждый его элемент занимает отдельную строку:

        вывспис( [ ]).

        вывспис( [X | L) :-

                write( X), n1.

                вывспис( L).

Если у нас есть список списков, то одной из естественных форм его выводе является такая, при которой все элементы каждого списка записываются на отдельной строке. Для этого мы определим процедуру вывспис2. Вот пример ее использования:

        ?-  вывспис2( [ [а, b, с], [d, e, f], [g, h, i] ] ).

        а   b   с

        d   e   f

        g   h   i

Процедура, выполняющая эту работу, такова:

        вывспис2( [ ]).

        вывспис2( [L | LL] ) :-

                строка( L), n1,

                вывспис1( LL).

        строка( [ ]).

        строка( [X | L] ) :-

                write( X), tab( 1),

                строка( L).

Список целых чисел иногда удобно представить в виде диаграммы. Следующая процедура диагр выводит список в такой форме (предполагается, что числа списка заключены между 0 и 80). Пример ее использования:

        ?- диагр( [3, 4, 6, 5] ).

        ***

        ****

        ******

        *****

        Процедуру диагр можно определить так:

                диагр( [N | L]) :-

                    звездочки( N), n1,

                    диагр( L).

                звеэдочки( N) :-

                    N > 0,

                    write( *),

                    Nl is N - 1,

                    звездочки( Nl).

                звездочки( N) :-

                    N =< 80.

6. 2. 3.    Формирование термов

Предположим, наша программа имеет дело с семьями, которые представлены в виде термов так, как это сделано в гл. 4 (рис. 4.1). Тогда, если, перемен-

        родители

                том фокс, датарожд 7 май 1950, работает bbс,

                                                                        оклад 15200

                энн фокс, датарожд 9 май 1951, неработает

        дети

                пат фокс, датарожд 5 май 1973, неработает

                джим фокс, датарожд 5 май 1973, неработает

Рис. 6. 2.  Улучшенный формат вывода термов, представляющих семью.

ная F конкретизирована термом, изображенный на рис. 4.1, то цель

        write( F)

вызовет вывод этого терма в стандартной форме примерно так:

        семья( членсемьи( том, фокс, дата( 7, май,1950),

                         работает( bbс, 15200)),

                членсемьи( энн, фокс, дата( 9, май, 1951),

                         неработает),

                [членсемьи( пат, фокс, дата( 5, май, 1973),

                         неработает),

                членсемьи( джим, фокс, дата( 5, май, 1973),

                         неработает)])

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

        вывсемью( F)

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

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

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

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

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

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

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

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

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

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

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

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

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

12 великих трагедий
12 великих трагедий

Книга «12 великих трагедий» – уникальное издание, позволяющее ознакомиться с самыми знаковыми произведениями в истории мировой драматургии, вышедшими из-под пера выдающихся мастеров жанра.Многие пьесы, включенные в книгу, посвящены реальным историческим персонажам и событиям, однако они творчески переосмыслены и обогащены благодаря оригинальным авторским интерпретациям.Книга включает произведения, созданные со времен греческой античности до начала прошлого века, поэтому внимательные читатели не только насладятся сюжетом пьес, но и увидят основные этапы эволюции драматического и сценаристского искусства.

Александр Николаевич Островский , Иоганн Вольфганг фон Гёте , Оскар Уайльд , Педро Кальдерон , Фридрих Иоганн Кристоф Шиллер

Драматургия / Проза / Зарубежная классическая проза / Европейская старинная литература / Прочая старинная литература / Древние книги
Волчья тропа
Волчья тропа

Мир после ядерной катастрофы. Человечество выжило, но высокие технологии остались в прошлом – цивилизация откатилась назад, во времена Дикого Запада.Своенравная, строптивая Элка была совсем маленькой, когда страшная буря унесла ее в лес. Суровый охотник, приютивший у себя девочку, научил ее всему, что умел сам, – ставить капканы, мастерить ловушки для белок, стрелять из ружья и разделывать дичь.А потом она выросла и узнала страшную тайну, разбившую вдребезги привычную жизнь. И теперь ей остается только одно – бежать далеко на север, на золотые прииски, куда когда-то в поисках счастья ушли ее родители.Это будет долгий, смертельно опасный и трудный путь. Путь во мраке. Путь по Волчьей тропе… Путь, где единственным защитником и другом будет таинственный волк с черной отметиной…

Алексей Семенов , Бет Льюис , Даха Тараторина , Евгения Ляшко , Сергей Васильевич Самаров

Фантастика / Приключения / Боевик / Славянское фэнтези / Прочая старинная литература