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.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */