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

Определение

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

Эта структура либо пуста, либо состоит из двух частей – головы и хвоста.

Хвост в свою очередь является списком.

Голова – обычная переменная. Выделив из списка голову, можно ее обрабатывать как и любую другую переменную. Все элементы списка обладают общим свойством: в Прологе это свойство трактуется как отношение, определяющее связь между элементами списка или между списком в целом и элементом, внешним по отношению к списку. Все элементы списка заключаются в [] и отделяются друг от друга запятыми:

[ann, peter, jim, tom] , [2,5.7.8]

В Прологе список – это последовательность, состоящая из любого количества элементов. Известно, что все структурированные объекты Пролога – это деревья. Списки не являются исключением из этого правила:

[3,7,10]

/ \

3 [7,10]

/ \

7 [10]

/ \

10 []

Рис.6.1.Двоичное дерево списка

Замечание

Конечно, объединить объекты в один можно различными способами. Если число объектов заранее известно,

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

Список помогает сделать программу компактной, эффектив-

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

Это базовые структуры функциональных языков. С помощью списков можно представить практически любые сложные структуры.

Порядок расположения элементов является отличительной чертой списка: те же элементы, упорядоченные иным способом, представляют собой уже совсем другой список. Порядок важен в процессе сопоставления. Объекты cписка называются элементами списка. Единственное ограничение на их число – объем оперативной памяти.

Все элементы списка принадлежат одному и тому же типу доменов. (Исключением являются списки структур. Структура может принадлежать альтернативному домену, и тогда элементы списка могут иметь разный тип).

Как представить список в виде стандартного объекта Пролога?

Список – это рекурсивный составной объект, поэтому

мы рассматриваем два случая – пустой список и непустой список.

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

Одноэлементный список [a]- не то же самое, что элемент, который в него входит, так как [a] –на самом деле – это составная структура данных:

list

/ \

a []

Список в Прологе рассматривается как частный случай двоичного дерева.

При построении списков необходимо наличие константного символа, чтобы рекурсия не была бесконечной. Таким символом является символ [], обозначающий пустой список.

Требуется также функтор арности два [X|Y],где X и Y-компоненты терма, имеющие специальные названия: X – голова(car),а Y-хвост (cdr) списка.

Определение списка

list([]).

list([Head|Tail]):-

list(Tail).

Например, список [a,b,c] – это терм [H|T] при подстановке H=a и T=[b,c].

list([a,b,c])

|

list([b,c])

|

list([c])

|

list([])

Рис 6.2.Дерево вывода при проверке списка

Таблица 6.1. Примеры разделения списка на голову и хвост

список

голова

хвост

[[1,2],[2,3,4],[]]

[1,2]

[[2,3,4],[]]

[]

Не определен

Не определен

[3]

3

[]

Таблица 6.2.Примеры сопоставления двух списков:

Список 1

Список 2

Присвоение переменным

[X,Y,Z]

[2,3,4]

X=2,Y=3,Z=4

[5]

[X|Y]

X=5,Y=[]

[1,2,3,4]

[X,Y|Z]

X=1,Y=2,Z=[3,4]

[1,2]

[3|X]

fail

Использование списков отразится в программе на трех ее разделах:

1 domains

<описание домена списка>

2 predicates

<описание работающего со списком предиката>

3 clauses

<задание самого списка>