packages feed

horname 0.1.1.0 → 0.1.2.0

raw patch · 3 files changed

+35/−2 lines, 3 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Horname.Internal.SMT: antiSymmetricOp :: Text -> Bool
+ Horname.Internal.SMT: simplify' :: SExpr -> SExpr

Files

horname.cabal view
@@ -1,5 +1,5 @@ name:                horname-version:             0.1.1.0+version:             0.1.2.0 synopsis:            Rename function definitions returned by SMT solvers description:         Please see README.md homepage:            https://github.com/cocreature/horname#readme
src/Horname/Internal/SMT.hs view
@@ -5,6 +5,7 @@  import           Data.Data import           Data.List (foldl', find)+import qualified Data.List as List import           Data.Map (Map) import qualified Data.Map as Map import           Data.Maybe@@ -106,6 +107,7 @@ sumExprs [e] = e sumExprs args = List (StringLit "+" : args) +-- first pass of simplifications simplify :: SExpr -> SExpr -- (* (- 1) x) → x simplify (List [StringLit "*", List [StringLit "-", IntLit i], expr]) =@@ -147,6 +149,32 @@ simplify (List [StringLit "not", List (StringLit "or":args)]) =   List (StringLit "and" : map negateExpr args) simplify e = e++antiSymmetricOp :: Text -> Bool+antiSymmetricOp n = n `elem` ["<=",">="]+-- second pass of simplifications+simplify' :: SExpr -> SExpr+-- transform two inequalities to an equality+simplify' (List (StringLit "and":args)) =+  List (StringLit "and" : other ++ mergeInequalities inequality)+  where+    (inequality, other) =+      List.partition+        (\case+           List [StringLit op, _, _] -> antiSymmetricOp op+           _ -> False)+        args+    mergeInequalities :: [SExpr] -> [SExpr]+    mergeInequalities [] = []+    mergeInequalities (e@(List [StringLit op, expr1, expr2]):rest) =+      let reversedE = List [StringLit op, expr2, expr1]+      in if reversedE `elem` rest+           then List [StringLit "=", expr1, expr2] :+                mergeInequalities (filter (not . (`elem` [e, reversedE])) rest)+           else e : mergeInequalities rest+    mergeInequalities (e:es) = e : mergeInequalities es+simplify' e = e+  negateExpr :: SExpr -> SExpr negateExpr (List [StringLit "not", expr]) = expr
src/Horname/Internal/SMT/Parser.hs view
@@ -78,7 +78,12 @@   expr <- parseSExpr   space   _ <- char ')'-  pure (DefineFun name args retSort (transform simplify $ inlineLets expr))+  pure+    (DefineFun+       name+       args+       retSort+       (transform simplify' . transform simplify $ inlineLets expr))  parseDefineFuns :: Parser [DefineFun] parseDefineFuns = many (try parseDefineFun)