Prolog Language
Structures de données
Recherche…
Des listes
Les listes sont un type particulier de terme composé . Les listes sont définies par induction:
- l'atome
[]
est une liste indiquant la liste vide . - si
Ls
est une liste, alors le terme'.'(L, Ls)
est également une liste.
Il existe une syntaxe spéciale pour dénoter les listes de manière pratique dans Prolog:
- La liste
'.'(a, '.'(b, '.'(c, [])))
peut aussi être écrite comme[a,b,c]
. - Le terme
'.'(L, Ls)
peut aussi être écrit comme[L|Ls]
.
Ces notations peuvent être combinées de n'importe quelle manière. Par exemple, le terme [a,b|Ls]
est une liste si Ls
est une liste.
Créer des listes
Une liste de littéraux unifiés avec la variable List:
?- List = [1,2,3,4].
List = [1, 2, 3, 4].
Construire une liste en consommant:
?- Tail = [2, 3, 4], List = [1|Tail].
Tail = [2, 3, 4],
List = [1, 2, 3, 4].
Construire une liste de valeurs inconnues à l'aide de la length/2
intégrée length/2
:
?- length(List,5).
List = [_G496, _G499, _G502, _G505, _G508].
Puisque dans Prolog tout est essentiellement un terme, les listes se comportent de manière hétérogène:
?- List = [1, 2>1, this, term(X), 7.3, a-A].
List = [1, 2>1, this, term(X), 7.3, a-A].
Cela signifie qu'une liste peut également contenir d'autres listes, également appelées listes internes:
List = [[1,2],[3,[4]]].
Paires
Par convention, le foncteur (-)/2
est souvent utilisé pour désigner des paires d'éléments dans Prolog. Par exemple, le terme -(A, B)
désigne la paire d'éléments A
et B
Dans Prolog, (-)/2
est défini comme un opérateur infixe . Par conséquent, le terme peut être écrit de manière équivalente à AB
.
De nombreux prédicats couramment utilisés utilisent également cette syntaxe pour désigner des paires. Des exemples de ceci sont keysort/2
et pairs_keys_values/3
.
Listes d'association
Dans tous les systèmes Prolog sérieux, les listes d'associations sont disponibles pour permettre un accès plus rapide que linéaire à une collection d'éléments. Ces listes d'association sont généralement basées sur des arbres équilibrés tels que des arbres AVL . Une bibliothèque de domaine public appelée library(assoc)
avec de nombreux systèmes Prolog et fournit des opérations O (log (N)) pour insérer, récupérer et modifier des éléments dans une collection.
termes
À un très haut niveau, Prolog ne possède qu'un seul type de données, appelé terme . Dans Prolog, toutes les données sont représentées par des termes Prolog. Les termes sont définis par induction:
- un atome est un terme. Des exemples d'atomes sont:
x
,test
et'quotes and space'
. - une variable est un terme. Les variables commencent par une lettre majuscule ou un trait de soulignement
_
. - les entiers et les nombres à virgule flottante sont des termes. Exemples:
42
et42.42
. - un terme composé est un terme défini inductivement comme suit: Si
T1
,T2
, ...,T_n
sont des termes, alors F (T1
,T2
, ...,T_n
) est aussi un terme, où F est appelé le foncteur de le terme composé.
Termes avec champs nommés utilisant la bibliothèque (enregistrement)
La bibliothèque [record][1]
permet de créer des termes composés avec des champs nommés. La directive :- record/1 <spec>
compile en une collection de prédicats qui initialisent, définissent et obtiennent des champs dans le terme défini par <spec>
.
Par exemple, nous pouvons définir une structure de données point
avec les champs nommés x
et 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.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */