Prolog Language
Структуры данных
Поиск…
Списки
Списки - особый вид сложного термина . Списки определяются индуктивно:
- атом
[]
- это список, обозначающий пустой список . - если
Ls
- список, то термин'.'(L, Ls)
также является списком.
Существует специальный синтаксис для удобного обозначения списков в Prolog:
- Список
'.'(a, '.'(b, '.'(c, [])))
A'.'(a, '.'(b, '.'(c, [])))
также может быть записан как[a,b,c]
. - Термин
'.'(L, Ls)
также может быть записан как[L|Ls]
.
Эти обозначения могут быть объединены любым способом. Например, термин [a,b|Ls]
является списком, если Ls
является списком.
Создание списков
Список, состоящий из литералов, объединенных с переменной List:
?- List = [1,2,3,4].
List = [1, 2, 3, 4].
Построение списка путем принятия:
?- Tail = [2, 3, 4], List = [1|Tail].
Tail = [2, 3, 4],
List = [1, 2, 3, 4].
Создание списка неизвестных значений с использованием встроенной length/2
:
?- length(List,5).
List = [_G496, _G499, _G502, _G505, _G508].
Поскольку в Prolog все по сути является термином, списки ведут себя неоднородно:
?- List = [1, 2>1, this, term(X), 7.3, a-A].
List = [1, 2>1, this, term(X), 7.3, a-A].
Это означает, что список может также содержать другие списки, также называемые внутренними списками:
List = [[1,2],[3,[4]]].
Пары
По соглашению функтор (-)/2
часто используется для обозначения пар элементов в Prolog. Например, термин -(A, B)
обозначает пару элементов A
и B
В Prolog (-)/2
определяется как оператор инфикса . Следовательно, этот термин можно записать эквивалентно AB
.
Многие общедоступные предикаты также используют этот синтаксис для обозначения пар. Примерами этого являются keysort/2
и pairs_keys_values/3
.
Списки ассоциаций
Во всех серьезных системах Prolog доступны списки ассоциаций , позволяющие быстрее, чем линейный доступ к набору элементов. Эти списки ассоциаций обычно основаны на сбалансированных деревьях, таких как деревья AVL . Существует библиотека общедоступного домена, называемая library(assoc)
которая поставляется со многими системами Prolog и предоставляет операции O (log (N)) для вставки, выбора и изменения элементов в коллекцию.
термины
На очень высоком уровне Prolog имеет только один тип данных, называемый термином . В Prolog все данные представлены членами Prolog. Термины определяются индуктивно:
- атом - это термин. Примерами атомов являются:
x
,test
и'quotes and space'
. - переменная - это термин. Переменные начинаются с буквы верхнего регистра или подчеркивания
_
. - целые числа и числа с плавающей запятой - это термины. Примеры:
42
и42.42
. - комплексный член - это член, определяемый индуктивно следующим образом: если
T1
,T2
, ...,T_n
- члены, то F (T1
,T2
, ...,T_n
) также является членом, где F называется функтором составной термин.
Условия с именованными полями с использованием библиотеки (записи)
Библиотека [record][1]
предоставляет возможность создавать составные термины с именованными полями. Директива :- record/1 <spec>
компилируется в набор предикатов, которые инициализируют, устанавливают и получают поля в термине, определяемом <spec>
.
Например, мы можем определить структуру point
данных с именованными полями x
и y
:
:- use_module(library(record)).
:- record point(x:integer=0,
y:integer=0).
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
?- default_point(Point), point_x(Point, X), set_x_of_point(10, Point, Point1).
Point = point(0, 0),
X = 0,
Point1 = point(10, 0).
?- make_point([y(20)], Point).
Point = point(0, 20).
?- is_point(X).
false.
?- is_point(point(_, _)).
false.
?- is_point(point(1, a)).
false.
?- is_point(point(1, 1)).
true.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */