В Прологе список — это объект, который содержит конечное число других объектов. Списки можно грубо сравнить с массивами в других языках, но, в отличие от массивов, для списков нет необходимости заранее объявлять их размер.
Список, содержащий числа 1, 2 и 3, записывается так:[1, 2, 3]
Каждая составляющая списка называется элементом. Чтобы оформить списочную структуру данных, надо отделить элементы списка запятыми и заключить их в квадратные скобки.
Составные списки — это списки, в которых используется более чем один тип элементов. Для работы со списками из разнотипных элементов нужны специальные декларации. Для создания списка, который мог бы хранить различные типы элементов, в Прологе необходимо использовать функторы, потому что домен может содержать более одного типа данных в качестве аргументов для функторов.
Объявление списков
Чтобы объявить домен для списка целых, надо использовать декларацию домена, такую как:
domains
Integerlist = integer*
Символ (*) означает "список чего-либо"; таким образом, integer* означает "список целых".
|
|
Элементы списка могут быть любыми, включая другие списки. Однако все его элементы должны принадлежать одному домену. Декларация домена для элементов должна быть следующего вида:
domains
elementslist = elements*
elements =....
Здесь elements имеют единый тип (например: integer, real или symbol) или являются набором отличных друг от друга элементов, отмеченных разными функторами.
Работа со списками
В Прологе есть способ явно отделить голову от хвоста. Вместо разделения элементов запятыми, это можно сделать вертикальной чертой "|". Например:
[а, b, с] эквивалентно [а | [b, с]] и. продолжая процесс,
[а | [b, с] ] эквивалентно [а | [b] [с] ] ], что эквивалентно [а | [b | [с | [ ] ] ] ]
Можно использовать оба вида разделителей в одном и том же списке при условии, что вертикальная черта есть последний разделитель.
Печать списков
Подсчет элементов списка
Преобразование списков
Принадлежность к списку
Предположим, что у вас есть список имен John, Leonard, Eric и Franc, и вы хотите проверить, имеется ли заданное имя в этом списке. Другими словами, вам нужно выяснить отношение "принадлежность" между двумя аргументами — именем и списком имен. Это выражается предикатом
member(name,namelist). % "name" принадлежит "namelist"