Typage
Le typage dans Stellogen illustre des principes majeurs de syntaxe transcendantale où les types sont définis comme des ensembles de tests eux-mêmes définis avec des constellations. La vérification de type implique le passage de tous les tests associés à un type.
Les types sont donnés par une galaxie où chaque champ représentent un test à faire passer :
t = galaxy
test1 = @-f(X) ok; -g(X).
test2 = @-g(X) ok; -f(X).
end
On peut aussi faire précéder la définition par spec
pour indiquer qu'il
s'agit d'une spécification :
spec t = galaxy
test1 = @-f(X) ok; -g(X).
test2 = @-g(X) ok; -f(X).
end
Une galaxie/constellation testée doit donc être confrontée à tous les tests
définis par la galaxie ci-dessous pour être de type t
.
Un type avec un unique test peut être défini par une simple constellation.
Il nous reste cependant à définir ce que signifient :
- être confronté à un test;
- passer un test avec succès.
Conformément à la correspondance de Curry-Howard, les types peuvent être vus comme des formules ou spécifications. On pourrait aussi étendre cela à la proposition de Thomas Seiller de voir les algorithmes comme des spécifications plus sophistiquées.
Checkers
Il faut définir des checkers qui sont des galaxies "juges" définissant :
- un champ
interaction
contenant un identificateur#tested
et#tested
. Ce champ explique comment faire interagir un testé et un test; - un champ
expect
indiquant quel est le résultat attendu par l'interaction.
Par exemple :
checker = galaxy
interaction = #tested #test.
expect = ok.
end
Typage par test
On peut ensuite faire précéder les définitions par une déclaration de type :
c :: t [checker].
c = +f(0) +g(0).
La constellation c
passe bel et bien les tests test1
et test2
de t
.
Il n'y a donc aucun problème. On dit donc que c
est de type t
ou que c
est une preuve de la formule t
.
Cependant, si nous avions une constellation qui ne passait pas les tests, comme :
c :: t [checker].
c = +f(0).
Nous aurions eu un message d'erreur nous indiquant qu'un test n'est pas passé.
Voici un type avec un unique test pour une représentation naïve des entiers naturels :
spec nat =
-nat(0) ok;
-nat(s(N)) +nat(N).
0 :: nat [checker].
0 = +nat(0).
1 :: nat [checker].
1 = +nat(s(0)).
On peut aussi omettre de préciser le checker. Dans ce cas, le checker par défaut est :
checker = galaxy
interaction = #tested #test.
expect = ok.
end
Cela nous permet d'écrire :
0 :: nat.
0 = +nat(0).
1 :: nat.
1 = +nat(s(0)).
Pluralité des types
Il est possible d'associer plusieurs types à une constellation:
- soit en définissant plusieurs déclaration de types;
- soit en écrivant des séquences de types (séparés par des virgules) si le même checker est utilisé.
Par exemple:
nat2 = -nat(X) ok.
2 :: nat [checker].
2 :: nat2.
2 = +nat(s(s(0))).
3 :: nat, nat2.
3 = +nat(s(s(s(0)))).
```
## Interfaces
Il est possible de définir des interfaces décrivant une liste d'identifiants
devant être d'un certain type.
```
nat_pair = interface
n :: nat [checker].
m :: nat [checker].
end
```
On peut ensuite demander à ce qu'une galaxie respecte cette interface.
```
g_pair :: nat_pair.
g_pair = galaxy
n = +nat(0).
m = +nat(0).
end
```