Prolog Language
Data struktur
Sök…
listor
Listor är en speciell typ av sammansatt term . Listor definieras induktivt:
- atomen
[]
är en lista som anger den tomma listan . - Om
Ls
är en lista är termen'.'(L, Ls)
också en lista.
Det finns en speciell syntax för att enkelt ange listor i Prolog:
- Listan
'.'(a, '.'(b, '.'(c, [])))
kan också skrivas som[a,b,c]
. - Termen
'.'(L, Ls)
kan också skrivas som[L|Ls]
.
Dessa notationer kan kombineras på alla sätt. Till exempel är termen [a,b|Ls]
en lista iff Ls
är en lista.
Skapa listor
En lista bestående av bokstäver som är förenade med variabeln Lista:
?- List = [1,2,3,4].
List = [1, 2, 3, 4].
Bygg en lista genom att gå med på:
?- Tail = [2, 3, 4], List = [1|Tail].
Tail = [2, 3, 4],
List = [1, 2, 3, 4].
Bygga en lista med okända värden med den inbyggda length/2
:
?- length(List,5).
List = [_G496, _G499, _G502, _G505, _G508].
Eftersom i Prolog allt är i huvudsak en term, uppför listor heterogena:
?- List = [1, 2>1, this, term(X), 7.3, a-A].
List = [1, 2>1, this, term(X), 7.3, a-A].
Detta innebär att en lista också kan innehålla andra listor, även kallade inre listor:
List = [[1,2],[3,[4]]].
par
I konvention används ofta funktorn (-)/2
för att beteckna elementpar i Prolog. Till exempel betecknar termen -(A, B)
paret elementen A
och B
I Prolog definieras (-)/2
som en infix-operatör . Därför kan termen skrivas på samma sätt som AB
.
Många vanligt tillgängliga predikat använder också denna syntax för att beteckna par. Exempel på detta är keysort/2
och pairs_keys_values/3
.
Föreningslistor
I alla seriösa Prolog-system finns associeringslistor tillgängliga för att möjliggöra snabbare än linjär åtkomst till en samling element. Dessa associeringslistor är vanligtvis baserade på balanserade träd som AVL-träd . Det finns ett offentligt bibliotek som heter library(assoc)
som levereras med många Prolog-system och tillhandahåller O (log (N)) -operationer för att infoga, hämta och ändra element i en samling.
Villkor
På en mycket hög nivå har Prolog bara en enda datatyp, kallad term . I Prolog representeras all data av Prolog-termer. Villkor definieras induktivt:
- en atom är en term. Exempel på atomer är:
x
,test
och'quotes and space'
. - en variabel är en term. Variabler börjar med en stor bokstav eller understruk
_
. - heltal och flytande punktnummer är termer. Exempel:
42
och42.42
. - en sammansatt term är en term, definierad induktivt enligt följande: Om
T1
,T2
, ...,T_n
är termer, är F (T1
,T2
, ...,T_n
) också en term, där F kallas funktorn för den sammansatta termen.
Villkor med namngivna fält med bibliotek (post)
Biblioteket [record][1]
ger möjlighet att skapa sammansatta termer med namngivna fält. Direktivet :- record/1 <spec>
sammanställs till en samling predikat som initialiserar, ställer in och får fält i termen som definieras av <spec>
.
Till exempel, kan vi definiera en point
datastruktur med namngivna fälten x
och 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.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */