Работа со списками в языке Пролог

В Прологе список — это объект, который содержит конечное число других объектов. Списки можно грубо сравнить с массивами в других языках, но, в отличие от масси­вов, для списков нет необходимости заранее объявлять их размер.

Список, содержащий числа 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"


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: