Lazi

Calcul multi-valeurss

Contexte

Pour réfléchir à la manière dont notre univers est calculé, il est nécessaire d'avoir une représentation des calculs multi-valeurss car cela semble être le cas pour notre univers. C'est à dire que l'on fait un calcul qui en fait est le multiplexage de plusieurs calculs. Pour cela certains arguments sont des listes de valeurs supperposées.

Question

Comment représenter un calcul multi-valeurs ?

Étude

Un nouveau type de sous-formule : multiFormulaT

On ajoute un type de sous-formule qui contient une liste de formules et représente les valeurs possibles.

Liens entre les multiFormulaT

Si on fait un calcul où x est un multiFormulaT, et que l'on calcul "f x x", si a et b sont des valeurs possibles différentes de x, on pourrait être amenés à calculer les cas particuliers f a b alors que ça n'a pas lieux d'être.
D'autre part il y a aussi le cas où l'on veut traduire une formule multi-valeurse en un ensemble de formules non multi-valeurses.

Solution par distribution

L'idée est que l'on peut avoir besoin de dupliquer un multiFormulaT quand les deux versions ne sont pas les mêmes. Donc la règle distribute reste identique et peut s'appliquer aux formules contenant un multiFormulaT.
On ne duplique pas un multiFormulaT que l'on veut utiliser dans différent endroits, plutôt on le déplace plus à la base de la formule, par la règle :
[multiFormulaT|x1,...,xn] y → [multiFormulaT|x1 y,...,xn y]

On a aussi beson de la règle :
y [multiFormulaT|x1,...,xn] → [multiFormulaT|y x1,...,y xn]

Avec les deux règles précédentes, il est inutile d'avoir une règle pour le if quand la condition est une multiFormulaT.

On peut se demander si cette solution ne rend pas inuile le calcul multi-valeurs car pour avoir une duplication on est obligé de repousser le multiFormulaT à la base. La duplication peut avoir lieu souvent car on peut avoir souvent un traitement du type "if (f x) (g x) (y x)" où x est une multiFormulaT.
Normalmenet on a besoin de dédoubler que temporairement dans un traitement local.
D'autre part, il peut être possible de rendre les calculs plus efficaces en ajoutant des règles (par exemple en utilisant les références. Cela n'est pas utile d'y réfléchir ici car on cherche juste une représentation, et non des optimisations.

Solution par distribution (essai 1, abandonné)

Pour résoudre ce problème, on peut utiliser la règle suivante : quand on copie un multiFormulaT (distribute) alors on distribue les valeurs. Mais il faut le faire aussi si la formule contient à l'intérieur un multiFormulaT. Donc la règle est que distribute x y z n'est pas calculé si z contient un multiFormulaT et que
x [multiFormulaT| y1,y2,...,yn] = [multiFormulaT|x y1,x y2,...,x yn] etc

On pourrait avoir deux distributes :

  • quand on duplique une même multi-valeurs, et là on doit déjà distribuer la multi-valeur. Pour cela il faudrait un nouveau mot clé "duplicate"
  • quand on duplique mais que ce n'est pas la même multi-valeurs, et donc on peut utiliser le distribute habituel.

Réponse

On ajoute un type de sous-formule "multiFormulaT" qui représente une liste de valeurs.
On ajoute des règles pour déplacer plus à la base dans la formule la mutiFormulaT, ce qui répond au besoin de pouvoir dédoubler les multi-valeurs. Voir la solution pour plus de détail.