|
НАЗАД
Голова и хвост списка могут быть переменными, например,
[H|LT], здесь Н¾терм, а LT¾переменная, имеющая значение списка.
Переменные в Прологе не типизированы, и поэтому в процессе доказательства вопроса они могут конкретизироваться значениями любого типа. Естественно, что интерпретатор не контролирует соблюдение типов аргументов предикатов, это должен делать программист.
Рассмотрим следующий пример. Для списка [ энн, теннис, том, лыжи ]
энн - это голова, а хвостом является список [ теннис, том, лыжи ]
В общем случае, головой может быть что угодно (любой прологовский объект, например, дерево или переменная); хвост же должен быть списком. Как уже говорилось, голова соединяется с хвостом при помощи специального функтора - точки:
.( Голова, Хвост)
Поскольку Хвост - это список, он либо пуст, либо имеет свои собственную голову и хвост. Таким образом, выбранного способа представления списков достаточно для представления списков любой длины. Наш список представляется следующим образом:
.( энн, .( теннис, .( том, .( лыжи, []))))
Рассмотренный пример показывает, как общий принцип структуризации объектов данных можно применить к спискам любой длины. Из нашего примера также видно, что такой примитивный способ представления в случае большой глубины вложенности подэлементов в хвостовой части списка может привести к довольно запутанным выражениям. Вот почему в Прологе предусматривается более лаконичный способ изображения списков, при котором они записываются как последовательности элементов, заключенные в квадратные скобки. Программист может использовать оба способа, но представление с квадратными скобками, конечно, в большинстве случаев пользуется предпочтением. Мы, однако, всегда будем помнить, что это всего лишь косметическое улучшение и что во внутреннем представлении наши списки выглядят как деревья. При выводе же они автоматически преобразуются в более лаконичную форму представления. Так, например, возможен следующий диалог:
?- Список1 = [а,b,с],Список2 = (а, .(b, .(с,[]) ) ).
Список1= [a,b,c]
Список2 = [а,b,с]
?- Увлечения1=.(теннис,.(музыка,[])),Увлечения2=[лыжи,еда],
L = [энн,Увлечения1,том,Увлечения2].
Увлечения1 = [теннис, музыка]
Увлечения2 = [лыжи, еда]
L = [энн, [теннис, музыка], том, [лыжи, еда]]
Приведенный пример также напоминает нам о том, что элементами списка могут быть любые объекты, в частности тоже списки. На практике часто бывает удобным трактовать хвост списка как самостоятельный объект. Например, пустьL = [а,Ь,с]
Тогда можно написать:
Хвост = [b,c] и L = .(а,Хвост)
Для того, чтобы выразить это при помощи квадратных скобок, в Прологе предусмотрено еще одно расширение нотации для представления списка, а именно вертикальная черта, отделяющая голову от хвоста:
|