Prolog Language
Strutture dati
Ricerca…
elenchi
Le liste sono un tipo speciale di termine composto . Le liste sono definite in modo induttivo:
- l'atomo
[]
è una lista, che indica la lista vuota . - se
Ls
è una lista, allora il termine'.'(L, Ls)
è anche una lista.
C'è una sintassi speciale per denotare gli elenchi comodamente in Prolog:
- La lista
'.'(a, '.'(b, '.'(c, [])))
può anche essere scritta come[a,b,c]
. - Il termine
'.'(L, Ls)
può anche essere scritto come[L|Ls]
.
Queste annotazioni possono essere combinate in qualsiasi modo. Ad esempio, il termine [a,b|Ls]
è una lista se Ls
è una lista.
Creare liste
Una lista di letterali unificati con la variabile List:
?- List = [1,2,3,4].
List = [1, 2, 3, 4].
Costruire una lista consing:
?- Tail = [2, 3, 4], List = [1|Tail].
Tail = [2, 3, 4],
List = [1, 2, 3, 4].
Costruire un elenco di valori sconosciuti utilizzando la length/2
integrata length/2
:
?- length(List,5).
List = [_G496, _G499, _G502, _G505, _G508].
Poiché in Prolog tutto è essenzialmente un Termine, le liste si comportano in modo eterogeneo:
?- List = [1, 2>1, this, term(X), 7.3, a-A].
List = [1, 2>1, this, term(X), 7.3, a-A].
Ciò significa che un elenco può contenere anche altri elenchi, chiamati anche elenchi interni:
List = [[1,2],[3,[4]]].
Pairs
Per convenzione, il functor (-)/2
è spesso usato per denotare coppie di elementi in Prolog. Ad esempio, il termine -(A, B)
indica la coppia di elementi A
e B
In Prolog, (-)/2
è definito come operatore infisso . Pertanto, il termine può essere scritto in modo equivalente come AB
.
Molti predicati comunemente disponibili utilizzano anche questa sintassi per indicare coppie. Esempi di questo sono keysort/2
e pairs_keys_values/3
.
Liste di associazioni
In tutti i seri sistemi Prolog, sono disponibili elenchi di associazioni che consentono un accesso più rapido e lineare a una raccolta di elementi. Questi elenchi di associazioni si basano in genere su alberi bilanciati come gli alberi AVL . Esiste una libreria di dominio pubblico chiamata library(assoc)
che viene fornita con molti sistemi Prolog e che fornisce operazioni O (log (N)) per l'inserimento, il recupero e la modifica di elementi in una raccolta.
condizioni
A un livello molto alto, Prolog ha solo un singolo tipo di dati, chiamato termine . In Prolog, tutti i dati sono rappresentati dai termini di Prolog. I termini sono definiti in modo induttivo:
- un atomo è un termine. Esempi di atomi sono:
x
,test
e'quotes and space'
. - una variabile è un termine. Le variabili iniziano con una lettera maiuscola o underscore
_
. - numeri interi e numeri in virgola mobile sono termini. Esempi:
42
e42.42
. - un termine composto è un termine, definito induttivamente come segue: Se
T1
,T2
, ...,T_n
sono termini, quindi F (T1
,T2
, ...,T_n
) è anche un termine, dove F è chiamato il funtore di il termine composto.
Termini con campi denominati utilizzando la libreria (record)
La libreria [record][1]
offre la possibilità di creare termini composti con campi denominati. La direttiva :- record/1 <spec>
compila in una raccolta di predicati che inizializzano, impostano e ottengono campi nel termine definito da <spec>
.
Ad esempio, possiamo definire una struttura di dati point
con campi denominati x
e 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.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */