Esto se conoce como higher-order abstract syntax.
Primera solución: Usa la lambda de Haskell. Un tipo de datos podría ser:
data Prop
= Not Prop
| And Prop Prop
| Or Prop Prop
| Impl Prop Prop
| Equiv Prop Prop
| Equals Obj Obj
| ForAll (Obj -> Prop)
| Exists (Obj -> Prop)
deriving (Eq, Ord)
data Obj
= Num Integer
| Add Obj Obj
| Mul Obj Obj
deriving (Eq, Ord)
Se puede escribir una fórmula como:
ForAll (\x -> Exists (\y -> Equals (Add x y) (Mul x y))))
Esto se describe en detalle en el artículo de The Monad Reader. Muy recomendable.
Segunda solución:
utilizar cadenas como
data Prop
= Not Prop
| And Prop Prop
| Or Prop Prop
| Impl Prop Prop
| Equiv Prop Prop
| Equals Obj Obj
| ForAll String Prop
| Exists String Prop
deriving (Eq, Ord)
data Obj
= Num Integer
| Var String
| Add Obj Obj
| Mul Obj Obj
deriving (Eq, Ord)
A continuación, puede escribir una fórmula como
ForAll "x" (Exists "y" (Equals (Add (Var "x") (Var "y")))
(Mul (Var "x") (Var "y"))))))
La ventaja es que se puede mostrar la fórmula fácilmente (es difícil para mostrar una función Obj -> Prop
). La desventaja es que debe escribir el cambio de nombres en colisión (~ conversión alfa) y sustitución (~ conversión beta). En ambas soluciones, se puede utilizar GADT en lugar de dos tipos de datos:
data FOL a where
True :: FOL Bool
False :: FOL Bool
Not :: FOL Bool -> FOL Bool
And :: FOL Bool -> FOL Bool -> FOL Bool
...
-- first solution
Exists :: (FOL Integer -> FOL Bool) -> FOL Bool
ForAll :: (FOL Integer -> FOL Bool) -> FOL Bool
-- second solution
Exists :: String -> FOL Bool -> FOL Bool
ForAll :: String -> FOL Bool -> FOL Bool
Var :: String -> FOL Integer
-- operations in the universe
Num :: Integer -> FOL Integer
Add :: FOL Integer -> FOL Integer -> FOL Integer
...
tercera solución: Use números para representar al que se dirige la variable, donde los medios más bajos profundos. Por ejemplo, en ForAll (Existe (Igual (Num 0) (Num 1))), la primera variable se vinculará a Exists, y la segunda a ForAll. Esto se conoce como numerales de Bruijn. Ver I am not a number - I am a free variable.
supongo que tengo un poco de lectura para hacer .. gracias! Volveré aquí después de terminar los artículos. – wen
Acaba de sorprender, pero sigue siendo la conversión alfa, incluso si ocurre en el momento de la sustitución. – finrod
Creo que el término "sintaxis abstracta de orden superior" se aplica solo a la primera solución. Su respuesta parece decir que el problema en sí (o las tres soluciones) se conoce como HOAS. –