Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
семинар 5_2.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
101.38 Кб
Скачать

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, N =< 80, write( *), N1 is N - 1, звездочки( N1).

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

Предположим, наша программа имеет дело с семьями, которые представлены в виде термов так, как это сделано в гл. 4 (рис. 4.1). Тогда, если, переменная F конкретизирована термом, изображенный на рис. 4.1, то цель write( F) вызовет вывод этого терма в стандартной форме примерно так:

семья( членсемьи( том, фокс, дата( 7, май,1950), работает( bbс, 15200)),              членсемьи( энн, фокс, дата( 9, май, 1951),неработает),                 [членсемьи( пат, фокс, дата( 5, май, 1973), неработает),                 членсемьи( джим, фокс, дата( 5, май, 1973),неработает)])

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

       вывсемью( семья ( Муж, Жена, Дети)) :- nl, write( родители), nl, nl,        вывчленсемьи( Муж), nl, вывчленсемьи( Жена), nl, nl, write( дети), nl, вывсписчлнсемьи( Дети).

        вывчленсемьи( членсемьи( Имя, Фамилия, дата( Д, М, Г), Работа) ) :-                 tab(4), write( Имя),                 tab(1), write( Фамилия),                 write( ', дата рождения'),                 write( Д), tab( 1),                 write( M), tab( 1),                 write( Г), write( ','),                 вывработу( Работа).

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

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]