Valor de una expresión aritmética con variables
Las expresiones aritméticas con variables pueden representarse usando el siguiente tipo de datos
1 2 3 4 |
data Expr = C Int | V Char | S Expr Expr | P Expr Expr |
Por ejemplo, la expresión 2·(a+5)
se representa por
1 |
P (C 2) (S (V 'a') (C 5)) |
Definir la función
1 |
valor :: Expr -> [(Char,Int)] -> Int |
tal que valor x e
es el valor de la expresión x
en el entorno e
(es decir, el valor de la expresión donde las variables de x
se sustituyen por los valores según se indican en el entorno e
). Por ejemplo,
1 2 |
λ> valor (P (C 2) (S (V 'a') (V 'b'))) [('a',2),('b',5)] 14 |
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
1 2 3 4 5 6 7 8 9 10 |
data Expr = C Int | V Char | S Expr Expr | P Expr Expr valor :: Expr -> [(Char,Int)] -> Int valor (C x) _ = x valor (V x) e = head [y | (z,y) <- e, z == x] valor (S x y) e = valor x e + valor y e valor (P x y) e = valor x e * valor y e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
from dataclasses import dataclass @dataclass class Expr: pass @dataclass class C(Expr): x: int @dataclass class V(Expr): x: str @dataclass class S(Expr): x: Expr y: Expr @dataclass class P(Expr): x: Expr y: Expr def valor(e: Expr, xs: list[tuple[str, int]]) -> int: match e: case C(a): return a case V(x): return [y for (z, y) in xs if z == x][0] case S(e1, e2): return valor(e1, xs) + valor(e2, xs) case P(e1, e2): return valor(e1, xs) * valor(e2, xs) assert False |
La función valor toma como argumentos una expresión Expr y un entorno [(Char,Int)], y devuelve un entero. La expresión Expr se construye mediante una suma de constructores, cada uno de los cuales representa una operación aritmética diferente.
Un posible implementación de la función valor podría ser:
La función utiliza una estructura case of para determinar cual constructor ha sido usado al construir la expresión y actúa en consecuencia.
En el primer caso, (C n), se devuelve directamente el valor del entero contenido en el constructor.
En el segundo caso, (V x), se busca en el entorno la asociación correspondiente a la variable y se devuelve su valor.
En el tercer caso, (S e1 e2), se evalúan ambas expresiones y se suman sus valores.
En el cuarto caso, (P e1 e2), se evalúan ambas expresiones y se multiplican sus valores.