--- 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 `` 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 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);`.