tsguide.refl.fr/content/docs/playing/interaction.md

143 lines
4.6 KiB
Markdown

---
title: "Interaction"
weight: 2
---
# 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')
```
`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);`.