Sì, sto postando un'altra risposta. E potrebbe ancora non essere esattamente quello che stai cercando. Ma penso che potrebbe essere comunque utile. È a Haskell.
data LExpr = Lambda Char LExpr
| Atom Char
| App LExpr LExpr
instance Show LExpr where
show (Atom c) = [c]
show (App l r) = "(" ++ show l ++ " " ++ show r ++ ")"
show (Lambda c expr) = "(λ" ++ [c] ++ ". " ++ show expr ++ ")"
Quindi qui ho preparato un tipo di dati algebrici di base per esprimere il calcolo lambda. Ho aggiunto un'istanza Show semplice, ma efficace.
ghci> App (Lambda 'a' (Atom 'a')) (Atom 'b')
((λa. a) b)
Per divertimento, ho gettato in un metodo semplice reduce
, con aiutante replace
. Attenzione: non attentamente pensato o testato. Non usare per scopi industriali. Impossibile gestire determinate espressioni sgradevoli.: P
reduce (App (Lambda c target) expr) = reduce $ replace c (reduce expr) target
reduce v = v
replace c expr [email protected](Atom v)
| v == c = expr
| otherwise = av
replace c expr [email protected](App l r)
= App (replace c expr l) (replace c expr r)
replace c expr [email protected](Lambda v e)
| v == c = lv
| otherwise = (Lambda v (replace c expr e))
Sembra funzionare, anche se in realtà sono solo io ad essere sviato. (it
in ghci si riferisce all'ultimo valore valutato al prompt)
ghci> reduce it
b
Così ora per la parte divertente, rotate
. Quindi immagino di poter staccare il primo strato, e se è un Lambda, grande, salverò l'identificatore e continuerò a perforare fino a quando non colpirò un non-Lambda. Poi inserirò la Lambda e l'identificatore proprio nell'ultimo punto. Se non era un Lambda in primo luogo, allora non fare nulla.
rotate (Lambda c e) = drill e
where drill (Lambda c' e') = Lambda c' (drill e') -- keep drilling
drill e' = Lambda c e' -- hit a non-Lambda, put c back
rotate e = e
Perdona i nomi di variabili non fantasiose. L'invio di questo attraverso ghci mostra buoni segnali:
ghci> Lambda 'a' (Atom 'a')
(λa. a)
ghci> rotate it
(λa. a)
ghci> Lambda 'a' (Lambda 'b' (App (Atom 'a') (Atom 'b')))
(λa. (λb. (a b)))
ghci> rotate it
(λb. (λa. (a b)))
ghci> Lambda 'a' (Lambda 'b' (Lambda 'c' (App (App (Atom 'a') (Atom 'b')) (Atom 'c'))))
(λa. (λb. (λc. ((a b) c))))
ghci> rotate it
(λb. (λc. (λa. ((a b) c))))
Possiamo usare prepomorfismi zygoistomorfi? – Alvivi
@alvivi: Accidenti a te! Ora sono troppo curioso di quelle zygo-cose per andare a dormire senza averne mai sentito parlare. –
@alvivi - pensavo che ti piacerebbe sapere: il mio correttore ortografico suggeriva * pleomorfismo simplesiomorfico * per * prepomorfismi zygohistomorfici *. – Malvolio