Szukaj…


Listy

Listy są szczególnym rodzajem terminu złożonego . Listy są definiowane indukcyjnie:

  • atom [] to lista oznaczająca pustą listę .
  • jeśli Ls jest listą, to termin '.'(L, Ls) jest również listą.

Istnieje specjalna składnia do oznaczania list wygodnie w Prologu:

  1. Listę '.'(a, '.'(b, '.'(c, []))) można również zapisać jako [a,b,c] .
  2. Termin '.'(L, Ls) można również zapisać jako [L|Ls] .

Notacje te można łączyć w dowolny sposób. Na przykład termin [a,b|Ls] jest listą, jeśli Ls jest listą.

Tworzenie list

Lista składająca się z literałów ujednoliconych ze zmienną List:

?- List = [1,2,3,4].
List = [1, 2, 3, 4].

Budowanie listy według:

?- Tail = [2, 3, 4], List = [1|Tail].
Tail = [2, 3, 4],
List = [1, 2, 3, 4].

Budowanie listy nieznanych wartości za pomocą wbudowanej length/2 :

?- length(List,5).
List = [_G496, _G499, _G502, _G505, _G508].

Ponieważ w Prologu wszystko jest zasadniczo terminem, listy zachowują się heterogenicznie:

?- List = [1, 2>1, this, term(X), 7.3, a-A].
List = [1, 2>1, this, term(X), 7.3, a-A].

Oznacza to, że lista może również zawierać inne listy, zwane również listami wewnętrznymi:

List = [[1,2],[3,[4]]].

Pary

Zgodnie z konwencją funktor (-)/2 jest często używany do oznaczania par elementów w Prologu. Na przykład termin -(A, B) oznacza parę elementów A i B W Prologu (-)/2 jest zdefiniowany jako operator infix . Dlatego termin ten można zapisać równoważnie jako AB .

Wiele powszechnie dostępnych predykatów również używa tej składni do oznaczania par. Przykładami tego są keysort/2 i pairs_keys_values/3 .

Listy stowarzyszeń

We wszystkich poważnych systemach Prolog dostępne są listy powiązań, które umożliwiają szybszy niż liniowy dostęp do zbioru elementów. Te listy powiązań są zazwyczaj oparte na zrównoważonych drzewach, takich jak drzewa AVL . Istnieje biblioteka domeny publicznej o nazwie library(assoc) która jest dostarczana z wieloma systemami Prolog i zapewnia operacje O (log (N)) do wstawiania, pobierania i zmieniania elementów do kolekcji.

Warunki

Na bardzo wysokim poziomie Prolog ma tylko jeden typ danych, zwany terminem . W Prolog wszystkie dane są reprezentowane przez warunki Prolog. Warunki są definiowane indukcyjnie:

  • atom jest terminem. Przykładami atomów są: x , test oraz 'quotes and space' .
  • zmienna jest terminem. Zmienne zaczynają się od dużej litery lub podkreślenia _ .
  • liczby całkowite i liczby zmiennoprzecinkowe są terminami. Przykłady: 42 i 42.42 .
  • termin złożony jest terminem zdefiniowanym indukcyjnie w następujący sposób: Jeśli T1 , T2 , ..., T_n są warunkami, to F ( T1 , T2 , ..., T_n ) jest również terminem, w którym F jest nazywany funktorem termin złożony.

Terminy z nazwanymi polami przy użyciu biblioteki (rekord)

Biblioteka [record][1] umożliwia tworzenie terminów złożonych z nazwanymi polami. Dyrektywa :- record/1 <spec> kompiluje się do zbioru predykatów, które inicjują, ustawiają i pobierają pola w terminie zdefiniowanym przez <spec> .

Na przykład możemy zdefiniować point strukturę danych o nazwanych polach x i 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow