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 |