Поиск…


Списки

Списки - особый вид сложного термина . Списки определяются индуктивно:

  • атом [] - это список, обозначающий пустой список .
  • если Ls - список, то термин '.'(L, Ls) также является списком.

Существует специальный синтаксис для удобного обозначения списков в Prolog:

  1. Список '.'(a, '.'(b, '.'(c, []))) A '.'(a, '.'(b, '.'(c, []))) также может быть записан как [a,b,c] .
  2. Термин '.'(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.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow