Advise-me-0.1: src/Domain/Math/Power/OldViews.hs
-----------------------------------------------------------------------------
-- 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)