---
title: "Exécution" 
weight: 30
---

# Rayons compatibles 

Dans la théorie de l'unification, on dit que deux termes
(qu'on peut voir comme des rayons sans polarités) sont *unifiables* lorsqu'il
existe une substitution des variables de telle sorte à les rendre égaux.
Par exemple, `f(X)` et `f(h(Y))` sont unifiables avec la substitution
`{X:=h(Y)}` remplaçant `X` par `h(Y)`.

Les substitutions d'intérêt sont les plus générales. Nous aurions pu considérer
la substitution `{X:=h(c(a)); Y:={c(a)}`, tout aussi valide mais inutilement
précise.

Dans la même idée, ici, nous disons que deux rayons sont *compatibles* lorsque
leur terme sous-jacent (obtenu par oubli des polarités) sont unifiables mais
nous voulons aussi que des symboles de fonctions de polarités opposées se
rencontrent (au lieu de considérer des symboles identiques):

- `+f(X)` and `-f(h(a))` are matchable with `{X:=h(a)}`;
- `f(X)` and `f(h(a))` are not matchable;
- `+f(X)` and `+f(h(a))` are not matchable;
- `+f(+h(X))` and `-f(-h(a))` are matchable with `{X:=a}`;
- `+f(+h(X))` and `-f(-h(+a))` are matchable with `{X:=+a}`;

# Fusion

Les étoiles interagissent au travers d'une opération appelée *fusion*, en
utilisant le principe de la règle de résolution de Robinson. On définit un
opérateur `<i,j>` connectant le `i`ème rayon d'une étoile au `j`ème rayon d'une
autre étoile.

La fusion est définie ainsi pour deux rayons compatibles `r` et `r'`:
```
r r1 ... rk <0,0> r' r1' ... rk' == theta(r1) ... theta(rk) theta(r1') ... theta(rk')
```

où `theta` est la substitution la plus générale induite par `r` et `r'`.

Remarquez que:
- `r` et `r'` sont annihilées pendant l'interaction;
- leurs deux étoiles fusionnent;
- la substitution obtenue par résolution du conflit entre `r` et `r'` est
propagée aux rayons adjacents.

Exemple :
```
X +f(X) <1,0> -f(a) == a
```

{{< hint info >}}
Cette opération de fusion correspond à la règle de compure pour la logique
du premier ordre. Cependant, la différence ici est que nous sommes dans un
cadre "alogique" (nos symboles ne portent aucun sens logique).
{{< /hint >}}

# Exécution

Il faut poser un focus sur les étoiles initiales sur lesquelles nous voulons
démarrer le calcul :
```
X1, f(X1);
+a(X2 Y2);
@-h(f(X3 Y3)) +a(+f(X4) h(-f(X4)));
```

{{< hint info >}}
Le focus est optionnel. Lorsqu'il est omis, une étoile est sélectionnée pour
nous.
{{< /hint >}}

Passons à la théorie de l'exécution !

Une *configuration interactive* est une expression `R |- I` où:
- `R` est une constellation statique nommée *constellation de référence*. Elle
est constituée des étoiles non marquées par `@` et elle nous servira de stock
infini d'étoiles à tirer comme on pioche dans des bacs à LEGO pour faire des
constructions;
- `I` est une constellation dynamique nommée *espace d'interaction*. Elle
est constituée de l'ensemble des étoiles marquées avec `@` et se comporte comme
un espace de travail où des constructions sont réalisées par fusion d'étoiles.

Le LSC exécute les constellations en prenant pour partenaire des copies
d'étoiles dans `R` pour les projeter et fusionner sur chaque rayon de `I` comme
suit :
1. selectionner un rayon `ri` d'une étoile `s` de `I`;
2. chercher toutes les connexions possibles avec des rayons `rj` d'étoiles `s'`
   de `R`;
3. dupliquer `s` dans `I` pour chaque `rj` trouvé;
4. remplacer chaque copie de `s` par la fusion `s <i,j> s'`;
5. répeter jusqu'à qu'il n'y a plus aucune interaction possible dans `I`.

Le résultat de l'exécution contient toutes les étoiles non polarisées qui
restent dans `I`. Ces étoiles non polarisées que nous ignorons correspondent
en fait à des calculs bloqués ou non terminés.

# Exemple

Considérons l'exécution de la constellation suivante :
```
+7(l:X) +7(r:X); 3(X) +8(l:X); @+8(r:X) 6(X);
-7(X) -8(X);
```

On sépare la constellation en constellation de référence et en espace
d'interaction. On préfixe par `>>` les rayons sélectionnés. Nous avons donc
les étapes suivantes :
```
+7(l:X) +7(r:X); 3(X) +8(l:X); -7(X) >>-8(X) |- >>+8(r:X) 6(X); 
```

```
+7(l:X) +7(r:X); 3(X) +8(l:X); -7(X) -8(X) |- -7(r:X) 6(X); 
```

```
+7(l:X) >>+7(r:X); 3(X) +8(l:X); -7(X) -8(X) |- >>-7(r:X) 6(X); 
```

```
+7(l:X) +7(r:X); 3(X) +8(l:X); -7(X) -8(X) |- +7(l:X) 6(X); 
```

```
+7(l:X) +7(r:X); 3(X) +8(l:X); >>-7(X) -8(X) |- >>+7(l:X) 6(X); 
```

```
+7(l:X) +7(r:X); 3(X) +8(l:X); -7(X) -8(X) |- -8(l:X) 6(X); 
```

```
+7(l:X) +7(r:X); 3(X) >>+8(l:X); -7(X) -8(X) |- >>-8(l:X) 6(X); 
```

```
+7(l:X) +7(r:X); 3(X) +8(l:X); -7(X) -8(X) |- 3(X) 6(X); 
```

Le résultat du calcul est une constellation contenant l'étoile `3(X) 6(X);`.