Zoeken…


lijsten

Lijsten zijn een speciaal soort samengestelde term . Lijsten worden inductief gedefinieerd:

  • het atoom [] is een lijst die de lege lijst aangeeft.
  • als Ls een lijst is, dan is de term '.'(L, Ls) ook een lijst.

Er is een speciale syntaxis om lijsten handig aan te duiden in Prolog:

  1. De lijst '.'(a, '.'(b, '.'(c, []))) kan ook worden geschreven als [a,b,c] .
  2. De term '.'(L, Ls) kan ook worden geschreven als [L|Ls] .

Deze notaties kunnen op elke manier worden gecombineerd. De term [a,b|Ls] is bijvoorbeeld een lijst als F Ls een lijst is.

Lijsten maken

Een lijst die bestaat uit literalen verenigd met de variabele Lijst:

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

Een lijst samenstellen op basis van consing:

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

Een lijst met onbekende waarden samenstellen met de ingebouwde length/2 :

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

Aangezien in Prolog alles in essentie een term is, gedragen lijsten zich heterogeen:

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

Dit betekent dat een lijst ook andere lijsten kan bevatten, ook wel binnenlijsten genoemd:

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

pairs

Volgens afspraak wordt de functor (-)/2 vaak gebruikt om paren van elementen in Prolog aan te duiden. De term -(A, B) geeft bijvoorbeeld het paar elementen A en B . In Prolog wordt (-)/2 gedefinieerd als een infix-operator . Daarom kan de term equivalent worden geschreven als AB .

Veel algemeen beschikbare predikaten gebruiken deze syntaxis ook om paren aan te duiden. Voorbeelden hiervan zijn keysort/2 en pairs_keys_values/3 .

Associatielijsten

In alle serieuze Prolog-systemen zijn associatielijsten beschikbaar om sneller dan lineaire toegang tot een verzameling elementen mogelijk te maken. Deze associatielijsten zijn meestal gebaseerd op gebalanceerde bomen zoals AVL-bomen . Er is een bibliotheek in het publieke domein met de naam library(assoc) die bij veel Prolog-systemen wordt geleverd en O (log (N)) -bewerkingen biedt voor het invoegen, ophalen en wijzigen van elementen in een verzameling.

Voorwaarden

Op een zeer hoog niveau heeft Prolog slechts één gegevenstype, term genoemd . In Prolog worden alle gegevens weergegeven door Prolog-termen. Termen worden inductief gedefinieerd:

  • een atoom is een term. Voorbeelden van atomen zijn: x , test en 'quotes and space' .
  • een variabele is een term. Variabelen beginnen met een hoofdletter of een onderstrepingsteken _ .
  • gehele getallen en getallen met drijvende komma zijn termen. Voorbeelden: 42 en 42.42 .
  • een samengestelde term is een term, inductief als volgt gedefinieerd: Als T1 , T2 , ..., T_n termen zijn, dan is F ( T1 , T2 , ..., T_n ) ook een term, waarbij F de functor wordt genoemd van de samengestelde term.

Termen met benoemde velden met behulp van bibliotheek (record)

De bibliotheek [record][1] biedt de mogelijkheid om samengestelde termen met benoemde velden te maken. De instructie :- record/1 <spec> samengesteld uit een verzameling predicaten die velden initialiseren, instellen en ophalen in de term gedefinieerd door <spec> .

We kunnen bijvoorbeeld een point definiëren met de benoemde velden x en 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow