Séquences
Cas algébrique
Séquences fixes
+seq(a b c d).
On peut récupérer le premier élément avec :
head = +head(-seq(X1 X2 X3 X4) X1).
query = -head(+seq(1 2 3 4) R) R.
print (query head).
Pile de constantes
+list(a(b(c(e)))).
On peut ajouter ou retirer un élément en tête avec :
l = +list(a(b(c(e)))).
print process
l.
'push
-list(X) +tmp(new(X)).
-tmp(X) +list(X).
'pop
-list(new(X)) +list(X).
end
Remarque. On ne peut pas raisonner sur un symbole de fonction quelconque. On ne peut donc seulement empiler et dépiler des symboles spécifiques. Pour résoudre ce problème, il faut utiliser les symboles de fonction comme constructeurs et non valeurs.
Listes générales
On peut imaginer de nombreuses représentations équivalentes en utilisant les symboles de fonction pour concaténer les éléments ensemble.
+list(a:b:c:d:e).
+list(cons(a, cons(b, cons(c, cons(d, e))))).
+cons(a, +cons(b, +cons(c, +cons(d, e)))).
On peut ajouter et retirer des éléments de la manière suivante :
l = +list(a:b:c:d:e).
print process
l.
'push
-list(X) +tmp(new:X).
-tmp(X) +list(X).
'pop
-list(C:X) +list(X).
end
En suivant les principes de programmation logique on peut vérifier si une liste est vide :
empty? = +empty?(e).
print empty? @-empty?(e) ok.
print empty? @-empty?(1:e) ok.
Concaténer deux listes :
append =
+append(e L L);
-append(T L R) +append(H:T L H:R).
print append @-append(a:b:e c:d:e R) R.
Inverser une liste :
rev =
+revacc(e ACC ACC);
-revacc(T H:ACC R) +revacc(H:T ACC R);
-revacc(L e R) +rev(L R).
print rev @-rev(a:b:c:d:e R) R.
Appliquer une fonction sur tous les éléments d'une liste :
map =
+map(X e e);
-funcall(F H FH) -map(F T R) +map(F H:T FH:R).
print
map
+funcall(f X f(X));
@-map(f a:b:c:d:e R) R.
Cas interactif
Ensembles
c = +e1(a); +e2(b); e3(c).
Chaînes
c =
@-e(1 X) +e(2 a);
-e(2 X) +e(3 b);
-e(3 X) +e(4 c);
-e(4 X) +e(5 d).
Listes chaînées
c =
@+e(1 e);
-e(1 X) +e(2 a:X);
-e(2 X) +e(3 b:X);
-e(3 X) +e(4 c:X);
-e(4 X) +e(5 d:X).