¿Cómo averiguar el contexto de una expresión matemática?

Cuando evalúa expresiones matemáticas normales, es bastante fácil hacer que un analizador cree un árbol que represente la expresión (eso es lo que hacen la mayoría de los analizadores: crear un AST).

Es bastante trivial utilizar al menos un cierto paralelismo para evaluar ese árbol: debe caminar el árbol hacia arriba desde las hojas hasta la raíz, y cada subárbol puede evaluarse en paralelo con otros subárboles en el mismo nivel. Por ejemplo, una expresión como (A+B)/(CD) convierte en un árbol como este:


Entonces, en este caso, podemos evaluar A+B en paralelo con CD .

En el caso de una asignación, solo necesita otro nodo para cubrir la asignación, para obtener algo como: X = (A+B)/(CD) .


Ahora, en su caso, tiene un paso más: su resultado es básicamente un conjunto y está asignando los resultados de dos subárboles a ese conjunto:


Hacer que esto suceda en paralelo es bastante trivial: se hace exactamente igual que cualquier otra expresión. Aunque normalmente no se incluye en (por ejemplo) la mayoría de los lenguajes de programación, la conciencia de que `raíz cuadrada de X` básicamente significa” más o menos la raíz cuadrada de X “parece una transformación bastante trivial (y, por supuesto, lo mismo con cualquier raíz).

La vida se vuelve más compleja si estás pensando en términos de subprocesos (o algo similar) para ejecutar el código en paralelo. Si solo intenta girar un hilo para cada subárbol para ejecutar todo en paralelo, es casi seguro que funcionará mal; Para muchos de estos subárboles, la sobrecarga de iniciar un hilo será (mucho) mayor que el tiempo para evaluar el árbol en sí.