Skip to content

Commit 715be54

Browse files
SuprDewdakc
authored andcommitted
Support transforms with multiple arguments (#10)
1 parent ac488f3 commit 715be54

File tree

4 files changed

+134
-124
lines changed

4 files changed

+134
-124
lines changed

HOPS/GF.hs

Lines changed: 54 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ module HOPS.GF
2828
, aNumPrg
2929
, tagPrg
3030
-- Core
31-
, Fun1 (..)
32-
, Fun2 (..)
3331
, Core (..)
3432
, CorePrg
3533
, core
@@ -122,7 +120,7 @@ data Expr3
122120
| ETag Int
123121
| EVar Name
124122
| ELit Integer
125-
| Tr Name Expr3 -- A named transform
123+
| EApp Name [Expr0] -- A named transform
126124
| ERats R.Rats
127125
| Expr0 Expr0
128126
deriving (Show, Eq)
@@ -132,34 +130,8 @@ data Cmd -- A command is
132130
| Asgmt Name Expr0 -- an assignment
133131
deriving (Show, Eq)
134132

135-
data Fun1 = Neg | Fac | Tr1 Name deriving (Show, Eq, Ord)
136-
137-
instance Pretty Fun1 where
138-
pretty Neg = "-"
139-
pretty Fac = "!"
140-
pretty (Tr1 s) = s
141-
142-
data Fun2
143-
= Add | Sub
144-
| Mul | Div
145-
| BDP | Pow | Comp | Coef | PtMul | PtDiv
146-
deriving (Show, Eq, Ord)
147-
148-
instance Pretty Fun2 where
149-
pretty Add = "+"
150-
pretty Sub = "-"
151-
pretty Mul = "*"
152-
pretty Div = "/"
153-
pretty BDP = "<>"
154-
pretty Pow = "^"
155-
pretty Comp = "@"
156-
pretty Coef = "?"
157-
pretty PtMul = ".*"
158-
pretty PtDiv = "./"
159-
160133
data Core
161-
= App1 !Fun1 !Core
162-
| App2 !Fun2 !Core !Core
134+
= App !Name ![Core]
163135
| X
164136
| A {-# UNPACK #-} !Int
165137
| Tag {-# UNPACK #-} !Int
@@ -170,8 +142,7 @@ data Core
170142
deriving (Show, Eq, Ord)
171143

172144
instance Pretty Core where
173-
pretty (App1 f e) = pretty f <> paren (pretty e)
174-
pretty (App2 op e1 e2) = paren (pretty e1 <> pretty op <> pretty e2)
145+
pretty (App f es) = f <> paren (foldl' (<>) "" $ intersperse "," $ map pretty es)
175146
pretty X = "x"
176147
pretty (A i) = B.cons 'A' (pad 6 i)
177148
pretty (Tag i) = "TAG" <> pad 6 i
@@ -181,31 +152,31 @@ instance Pretty Core where
181152
pretty (Let s e) = s <> "=" <> pretty e
182153

183154
instance Num Core where
184-
(+) = App2 Add
185-
(-) = App2 Sub
186-
(*) = App2 Mul
187-
abs = App1 (Tr1 "abs")
188-
signum = App1 (Tr1 "sgn")
155+
(+) x y = App "add" [x,y]
156+
(-) x y = App "sub" [x,y]
157+
(*) x y = App "mul" [x,y]
158+
abs x = App "abs" [x]
159+
signum x = App "sgn" [x]
189160
fromInteger = Lit . fromInteger
190161

191162
instance Fractional Core where
192163
fromRational = Lit . fromRational
193-
(/) = App2 Div
164+
(/) x y = App "div" [x,y]
194165

195166
instance Floating Core where
196167
pi = Lit pi
197-
exp = App1 (Tr1 "exp")
198-
log = App1 (Tr1 "log")
199-
sin = App1 (Tr1 "sin")
200-
cos = App1 (Tr1 "cos")
201-
asin = App1 (Tr1 "arcsin")
202-
acos = App1 (Tr1 "arccos")
203-
atan = App1 (Tr1 "arctan")
204-
sinh = App1 (Tr1 "sinh")
205-
cosh = App1 (Tr1 "cosh")
206-
asinh = App1 (Tr1 "arsinh")
207-
acosh = App1 (Tr1 "arcosh")
208-
atanh = App1 (Tr1 "artanh")
168+
exp x = App "exp" [x]
169+
log x = App "log" [x]
170+
sin x = App "sin" [x]
171+
cos x = App "cos" [x]
172+
asin x = App "arcsin" [x]
173+
acos x = App "arccos" [x]
174+
atan x = App "arctan" [x]
175+
sinh x = App "sinh" [x]
176+
cosh x = App "cosh" [x]
177+
asinh x = App "arsinh" [x]
178+
acosh x = App "arcosh" [x]
179+
atanh x = App "artanh" [x]
209180

210181
type CorePrg = [Core]
211182

@@ -262,7 +233,7 @@ instance Pretty Expr3 where
262233
pretty (ETag i) = "TAG" <> pad 6 i
263234
pretty (EVar s) = s
264235
pretty (ELit t) = pretty t
265-
pretty (Tr s e) = s <> pretty e
236+
pretty (EApp s es) = s <> paren (foldl' (<>) "" $ intersperse "," $ map pretty es)
266237
pretty (ERats r) = pretty r
267238
pretty (Expr0 e) = paren $ pretty e
268239

@@ -317,7 +288,7 @@ subsExpr2 f (Expr3 e) = Expr3 (subsExpr3 f e)
317288

318289
subsExpr3 :: Subs -> Expr3 -> Expr3
319290
subsExpr3 f (EVar s) = EVar (f s)
320-
subsExpr3 f (Tr s e) = Tr s (subsExpr3 f e)
291+
subsExpr3 f (EApp s es) = EApp s (map (subsExpr0 f) es)
321292
subsExpr3 f (Expr0 e) = Expr0 (subsExpr0 f e)
322293
subsExpr3 _ e = e
323294

@@ -383,25 +354,25 @@ coreCmd (Expr e) = coreExpr0 e
383354
coreCmd (Asgmt s e) = Let s (coreExpr0 e)
384355

385356
coreExpr0 :: Expr0 -> Core
386-
coreExpr0 (EAdd e1 e2) = App2 Add (coreExpr0 e1) (coreExpr0 e2)
387-
coreExpr0 (ESub e1 e2) = App2 Sub (coreExpr0 e1) (coreExpr0 e2)
357+
coreExpr0 (EAdd e1 e2) = App "add" [coreExpr0 e1, coreExpr0 e2]
358+
coreExpr0 (ESub e1 e2) = App "sub" [coreExpr0 e1, coreExpr0 e2]
388359
coreExpr0 (Expr1 e) = coreExpr1 e
389360

390361
coreExpr1 :: Expr1 -> Core
391-
coreExpr1 (EMul e1 e2) = App2 Mul (coreExpr1 e1) (coreExpr1 e2)
392-
coreExpr1 (EDiv e1 e2) = App2 Div (coreExpr1 e1) (coreExpr1 e2)
393-
coreExpr1 (EBDP e1 e2) = App2 BDP (coreExpr1 e1) (coreExpr1 e2)
394-
coreExpr1 (EPtMul e1 e2) = App2 PtMul (coreExpr1 e1) (coreExpr1 e2)
395-
coreExpr1 (EPtDiv e1 e2) = App2 PtDiv (coreExpr1 e1) (coreExpr1 e2)
362+
coreExpr1 (EMul e1 e2) = App "mul" [coreExpr1 e1, coreExpr1 e2]
363+
coreExpr1 (EDiv e1 e2) = App "div" [coreExpr1 e1, coreExpr1 e2]
364+
coreExpr1 (EBDP e1 e2) = App "bdp" [coreExpr1 e1, coreExpr1 e2]
365+
coreExpr1 (EPtMul e1 e2) = App "ptmul" [coreExpr1 e1, coreExpr1 e2]
366+
coreExpr1 (EPtDiv e1 e2) = App "ptdiv" [coreExpr1 e1, coreExpr1 e2]
396367
coreExpr1 (Expr2 e) = coreExpr2 e
397368

398369
coreExpr2 :: Expr2 -> Core
399-
coreExpr2 (ENeg e) = App1 Neg (coreExpr2 e)
370+
coreExpr2 (ENeg e) = App "neg" [coreExpr2 e]
400371
coreExpr2 (EPos e) = coreExpr2 e
401-
coreExpr2 (EFac e) = App1 Fac (coreExpr3 e)
402-
coreExpr2 (EPow e1 e2) = App2 Pow (coreExpr3 e1) (coreExpr3 e2)
403-
coreExpr2 (EComp e1 e2) = App2 Comp (coreExpr3 e1) (coreExpr3 e2)
404-
coreExpr2 (ECoef e1 e2) = App2 Coef (coreExpr3 e1) (coreExpr3 e2)
372+
coreExpr2 (EFac e) = App "fac" [coreExpr3 e]
373+
coreExpr2 (EPow e1 e2) = App "pow" [coreExpr3 e1, coreExpr3 e2]
374+
coreExpr2 (EComp e1 e2) = App "comp" [coreExpr3 e1, coreExpr3 e2]
375+
coreExpr2 (ECoef e1 e2) = App "coef" [coreExpr3 e1, coreExpr3 e2]
405376
coreExpr2 (Expr3 e) = coreExpr3 e
406377

407378
coreExpr3 :: Expr3 -> Core
@@ -412,26 +383,24 @@ coreExpr3 (EA i) = A i
412383
coreExpr3 (ETag i) = Tag i
413384
coreExpr3 (EVar s) = Var s
414385
coreExpr3 (ELit t) = Lit $ fromInteger t
415-
coreExpr3 (Tr s e) = App1 (Tr1 s) (coreExpr3 e)
386+
coreExpr3 (EApp s es) = App s (map coreExpr0 es)
416387
coreExpr3 (ERats r) = Rats (R.core r)
417388
coreExpr3 (Expr0 e) = coreExpr0 e
418389

419390
varsCorePrg :: CorePrg -> [Name]
420391
varsCorePrg = nub . (>>= varsCore)
421392

422393
varsCore :: Core -> [Name]
423-
varsCore (App1 _ e) = varsCore e
424-
varsCore (App2 _ e1 e2) = varsCore e1 ++ varsCore e2
394+
varsCore (App _ es) = varsCore =<< es
425395
varsCore (Var s) = [s]
426396
varsCore (Let s e) = s : varsCore e
427397
varsCore _ = []
428398

429399
anumsCorePrg :: CorePrg -> [Int]
430-
anumsCorePrg = nub . (>>= anumsCore)
400+
anumsCorePrg = nub . (anumsCore =<<)
431401

432402
anumsCore :: Core -> [Int]
433-
anumsCore (App1 _ e) = anumsCore e
434-
anumsCore (App2 _ e1 e2) = anumsCore e1 ++ anumsCore e2
403+
anumsCore (App _ es) = anumsCore =<< es
435404
anumsCore (A i) = [i]
436405
anumsCore (Let _ e) = anumsCore e
437406
anumsCore _ = []
@@ -443,27 +412,20 @@ anumsCore _ = []
443412
emptyEnv :: Env n
444413
emptyEnv = Env V.empty M.empty
445414

446-
evalFun1 :: KnownNat n => Fun1 -> Env n -> Series n -> Series n
447-
evalFun1 Neg _ = negate
448-
evalFun1 Fac _ = fac
449-
evalFun1 (Tr1 t) env =
450-
fromMaybe (fromMaybe nil (lookupVar t env) `o`) (lookupTransform t)
451-
452-
evalFun2 :: KnownNat n => Fun2 -> Series n -> Series n -> Series n
453-
evalFun2 Add = (+)
454-
evalFun2 Sub = (-)
455-
evalFun2 Mul = (*)
456-
evalFun2 Div = (/)
457-
evalFun2 BDP = blackDiamond
458-
evalFun2 PtMul = (.*)
459-
evalFun2 PtDiv = (./)
460-
evalFun2 Pow = (**)
461-
evalFun2 Comp = o
462-
evalFun2 Coef = (?)
415+
evalName :: KnownNat n => Name -> Env n -> [Series n] -> Series n
416+
evalName t env ss =
417+
case lookupTransform t of
418+
Nothing -> case ss of
419+
[s] -> fromMaybe nil (lookupVar t env) `o` s
420+
_ -> nil
421+
Just (Transform1 f) -> case ss of
422+
[s] -> f s
423+
_ -> nil
424+
Just (TransformAny f) -> f ss
425+
Just (TransformK k f) -> if length ss == k then f ss else nil
463426

464427
evalCore :: KnownNat n => Core -> State (Env n) (Series n)
465-
evalCore (App1 f e) = evalFun1 f <$> get <*> evalCore e
466-
evalCore (App2 f e1 e2) = evalFun2 f <$> evalCore e1 <*> evalCore e2
428+
evalCore (App f es) = evalName f <$> get <*> mapM evalCore es
467429
evalCore X = return $ polynomial (Proxy :: Proxy n) [0,1]
468430
evalCore (A i) = fromMaybe nil . lookupANum i <$> get
469431
evalCore (Tag _) = return nil
@@ -533,12 +495,13 @@ expr2
533495

534496
expr3 :: Parser Expr3
535497
expr3
536-
= ELit <$> decimal
498+
= EApp <$> name <*> parens (sepBy expr0 (char ','))
499+
<|> ELit <$> decimal
537500
<|> const EDZ <$> string "DZ"
538501
<|> const EIndet <$> string "Indet"
539502
<|> EA <$> aNumInt
540503
<|> ETag <$> tag
541-
<|> Tr <$> name <*> expr3
504+
<|> EApp <$> name <*> ((pure . Expr1 . Expr2 . Expr3) <$> expr3)
542505
<|> EVar <$> var
543506
<|> const EX <$> string "x"
544507
<|> ERats <$> R.rats

0 commit comments

Comments
 (0)