----------------------------------------------------------------------------- -- Copyright 2019, Advise-Me project team. This file is distributed under -- the terms of the Apache License 2.0. For more information, see the files -- "LICENSE.txt" and "NOTICE.txt", which are included in the distribution. ----------------------------------------------------------------------------- -- | -- Maintainer : bastiaan.heeren@ou.nl -- Stability : provisional -- Portability : portable (depends on ghc) -- ----------------------------------------------------------------------------- module Domain.Math.Power.OldViews ( powerFactorView, powerFactorViewForWith, powerFactorViewWith ) where import Control.Monad import Domain.Math.Expr hiding ( (^) ) import Ideas.Common.Rewriting import Ideas.Common.View powerFactorView :: View Expr (String, Expr, Int) powerFactorView = powerFactorViewWith identity powerFactorViewWith :: Num a => View Expr a -> View Expr (String, a, Int) powerFactorViewWith v = makeView f g where f expr = do pv <- selectVar expr (e, n) <- match (powerFactorViewForWith pv v) expr return (pv, e, n) g (pv, e, n) = build (powerFactorViewForWith pv v) (e, n) powerFactorViewForWith :: Num a => String -> View Expr a -> View Expr (a, Int) powerFactorViewForWith pv v = makeView f g where f expr = case expr of Var s | pv == s -> Just (1, 1) Negate e -> do (a, b) <- f e return (negate a, b) e1 :*: e2 -> do (a1, b1) <- f e1 (a2, b2) <- f e2 return (a1*a2, b1+b2) Sym s [e1, Nat n] | isPowerSymbol s -> do (a1, b1) <- f e1 a <- match v (build v a1 ^ toInteger n) return (a, b1 * fromInteger n) _ -> do guard (withoutVar pv expr) a <- match v expr return (a, 0) g (a, b) = build v a .*. (Var pv .^. fromIntegral b)