Skip to content
Snippets Groups Projects
Fold.hs 1.64 KiB
Newer Older
  • Learn to ignore specific revisions
  • module LogicIR.Fold where
    
    import LogicIR.Expr
    
    -- Fold algrbra for numeral expressions
    type NExprAlgebra r = (Int -> r, -- NConst
                           String -> r, -- NVar
                           NUnop -> r -> r, -- NUnop
                           r -> NBinop -> r -> r, -- NBinop
                           String -> r -> r -- NArray
                          )
    
    -- Fold for numeral expressions
    foldNExpr :: NExprAlgebra r -> NExpr -> r
    foldNExpr (const, var, unop, binop, array) = fold where
        fold e = case e of
                      NConst n -> const n
                      NVar n -> var n
                      NUnop o e -> unop o (fold e)
                      NBinop a o b -> binop (fold a) o (fold b)
                      NArray n e -> array n (fold e)
    
    -- Fold algebra for logical expressions
    type LExprAlgebra r = (Bool -> r, -- LConst
                           String -> r, -- LVar
                           r -> r, -- LNot
                           r -> LBinop -> r -> r, -- LBinop
                           NExpr -> COp -> NExpr -> r, -- LComp
                           QOp -> [String] -> r -> r, -- LQuant
                           String -> NExpr -> r -- LArray
                          )
    
    -- Fold for logical expressions
    foldLExpr :: LExprAlgebra r -> LExpr -> r
    foldLExpr (const, var, not, binop, comp, quant, array) = fold where
        fold e = case e of
                      LConst c -> const c
                      LVar n -> var n
                      LNot e -> not (fold e)
                      LBinop a o b -> binop (fold a) o (fold b)
                      LComp a o b -> comp a o b
                      LQuant o vs e -> quant o vs (fold e)
                      LArray n e -> array n e