Prolog Language
Data structuren
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:
- De lijst
'.'(a, '.'(b, '.'(c, [])))
kan ook worden geschreven als[a,b,c]
. - 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
en42.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.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */