Программирование на языке Пролог для искусственного интеллекта | страница 46
В общем случае, головой может быть что угодно (любой прологовский объект, например, дерево или переменная); хвост же должен быть списком. Голова соединяется с хвостом при помощи специального функтора. Выбор этого функтора зависит от конкретной реализации Пролога; мы будем считать, что это точка:
>.( Голова, Хвост)
Поскольку >Хвост
— это список, он либо пуст, либо имеет свои собственную голову и хвост. Таким образом, выбранного способа представления списков достаточно для представления списков любой длины. Наш список представляется следующим образом:
>.( энн, .( теннис, .( том, .( лыжи, [] ) ) ) )
На рис. 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, с]
и