El tipo de las fórmulas proposicionales se puede definir por
data FProp = Const Bool | Var Char | Neg FProp | Conj FProp FProp | Impl FProp FProp deriving Show |
de modo que la fórmula A → ⊥ ∧ ¬B
se representa por
Impl (Var 'A') (Conj (Const False) (Neg (Var 'B'))) |
Definir la función
variables :: FProp -> [Char] |
tal que variables p
es la lista de las variables de la fórmula p
. Por ejemplo,
λ> variables (Impl (Var 'A') (Conj (Const False) (Neg (Var 'B')))) "AB" λ> variables (Impl (Var 'A') (Conj (Var 'A') (Neg (Var 'B')))) "AAB" |
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
data FProp = Const Bool | Var Char | Neg FProp | Conj FProp FProp | Impl FProp FProp deriving Show variables :: FProp -> [Char] variables (Const _) = [] variables (Var x) = [x] variables (Neg p) = variables p variables (Conj p q) = variables p ++ variables q variables (Impl p q) = variables p ++ variables q |
from dataclasses import dataclass @dataclass class FProp: pass @dataclass class Const(FProp): x: bool @dataclass class Var(FProp): x: str @dataclass class Neg(FProp): x: FProp @dataclass class Conj(FProp): x: FProp y: FProp @dataclass class Impl(FProp): x: FProp y: FProp def variables(f: FProp) -> list[str]: match f: case Const(_): return [] case Var(x): return [x] case Neg(p): return variables(p) case Conj(p, q): return variables(p) + variables(q) case Impl(p, q): return variables(p) + variables(q) assert False |