Назад | Содержание| Вперёд Глава 3 СПИСКИ, ОПЕРАТОР...

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

Глава 3

СПИСКИ, ОПЕРАТОРЫ, АРИФМЕТИКА

В этой главе мы будем изучать специальныеспособы представления списков. Список- один из самых простых и полезных типов структур.Мы рассмотрим также некоторые программы длявыполнения типовых операций над списками и,кроме того, покажем, как можно просто записыватьарифметические выражения и операторы, что вомногих случаях позволит улучшить"читабельность" программ. Базовый Пролог(глава 2), расширенный этими тремя добавлениями,станет удобной основой для составленияинтересных программ.

3. 1.    Представление списков

Список - это простая структура данных,широко используемая в нечисловомпрограммировании. Список - этопоследовательность, составленная изпроизвольного числа элементов, например энн,теннис, том, лыжи. На Прологе этозаписывается так:

        [ энн, теннис,том, лыжи ]

Однако таково лишь внешнее представлениесписков. Как мы уже видели в гл. 2, все структурныеобъекты Пролога - это деревья. Списки не являютсяисключением из этого правила.

Каким образом можно представить список в видестандартного прологовского объекта? Мы должнырассмотреть два случая: пустой список и не пустойсписок. В первом случае список записывается какатом  [ ].  Во втором случае список следуетрассматривать как структуру состоящую из двухчастей:

(1)    первый элемент, называемый головойсписка;

(2)    остальная часть списка, называемая хвостом.

Например, для списка

        [ энн, теннис,том, лыжи ]

энн - это голова, а хвостом являетсясписок

        [ теннис, том,лыжи ]

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

        .( Голова,Хвост)

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

        .( энн, .(теннис, .( том, .( лыжи, [ ] ) ) ) )

На рис. 3.1 изображена соответствующаядревовидная структура. Заметим, что показанныйвыше пример содержит пустой список [ ]. Дело в том,что самый последний хвост являетсяодноэлементным списком:

        [ лыжи ]

Хвост этого списка пуст

        [ лыжи ] = .(лыжи, [ ] )

Рассмотренный пример показывает, как общийпринцип структуризации объектов данных можноприменить к спискам любой длины. Из нашегопримера также видно, что такой примитивныйспособ представления в случае большой глубинывложенности подэлементов в хвостовой частисписка может привести к довольно запутаннымвыражениям. Вот почему в Прологепредусматривается более лаконичный способизображения списков, при котором онизаписываются как последовательности элементов,заключенные в квадратные скобки. Программистможет использовать оба способа, но представлениес квадратными скобками, конечно, в большинствеслучаев пользуется предпочтением. Мы, однако,всегда будем помнить, что это всего лишькосметическое улучшение и что во внутреннемпредставлении наши списки выглядят как деревья.При выводе же они автоматически преобразуются вболее лаконичную форму представления. Так,например, возможен следующий диалог:

        ?-  Список1 = [а, b,с],

             Список2 =(a,  .(b,  .(c,[ ]) ) ).

        Список1 = [а, b, с]

        Список2 = [а, b, с]

        ?-  Увлечения1 = .(теннис, .(музыка, [ ] ) ),

             Увлечения2= [лыжи, еда],

             L = [энн,Увлечения1, том, Увлечения2].

        Увлечения1 = [теннис,музыка]

        Увлечения2 = [лыжи, еда]

        L = [энн, [теннис, музыка],том, [лыжи, еда]]

Рис. 3. 1.  Представлениесписка [энн, теннис, том, лыжи] в видедерева.

Приведенный пример также напоминает вам о том,что элементами списка могут быть любые объекты, вчастности тоже списки.

На практике часто бывает удобным трактоватьхвост списка как самостоятельный объект.Например, пусть

        L = [а, b, с]

Тогда можно написать:

        Хвост = [b, с] иL = .(а, Хвост)

Для того, чтобы выразить это при помощиквадратных скобок, в Прологе предусмотрено ещеодно расширение нотации для представлениясписка, а именно вертикальная черта, отделяющаяголову от хвоста:

        L = [а | Хвост]

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

        [а, b, с] = [а | [b,с]] = [a, b | [c]] = [a, b, c | [ ]]

Подытожим:

Список - это структура данных, которая либо пуста, либо состоит из двух частей: головы и хвоста. Хвост в свою очередь сам является списком.

Список рассматривается в Прологе как специальный частный случай двоичного дерева. Для повышения наглядности программ в Прологе предусматриваются специальные средства для списковой нотации, позволяющие представлять списки в виде

        [ Элемент1, Элемент2, ... ]

или

        [ Голова | Хвост ]

или

        [ Элемент1, Элемент2, ... | Остальные]

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









Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх