@@ -28,8 +28,6 @@ module HOPS.GF
28
28
, aNumPrg
29
29
, tagPrg
30
30
-- Core
31
- , Fun1 (.. )
32
- , Fun2 (.. )
33
31
, Core (.. )
34
32
, CorePrg
35
33
, core
@@ -122,7 +120,7 @@ data Expr3
122
120
| ETag Int
123
121
| EVar Name
124
122
| ELit Integer
125
- | Tr Name Expr3 -- A named transform
123
+ | EApp Name [ Expr0 ] -- A named transform
126
124
| ERats R. Rats
127
125
| Expr0 Expr0
128
126
deriving (Show , Eq )
@@ -132,34 +130,8 @@ data Cmd -- A command is
132
130
| Asgmt Name Expr0 -- an assignment
133
131
deriving (Show , Eq )
134
132
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
-
160
133
data Core
161
- = App1 ! Fun1 ! Core
162
- | App2 ! Fun2 ! Core ! Core
134
+ = App ! Name ! [Core ]
163
135
| X
164
136
| A {- # UNPACK #-} !Int
165
137
| Tag {- # UNPACK #-} !Int
@@ -170,8 +142,7 @@ data Core
170
142
deriving (Show , Eq , Ord )
171
143
172
144
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)
175
146
pretty X = " x"
176
147
pretty (A i) = B. cons ' A' (pad 6 i)
177
148
pretty (Tag i) = " TAG" <> pad 6 i
@@ -181,31 +152,31 @@ instance Pretty Core where
181
152
pretty (Let s e) = s <> " =" <> pretty e
182
153
183
154
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]
189
160
fromInteger = Lit . fromInteger
190
161
191
162
instance Fractional Core where
192
163
fromRational = Lit . fromRational
193
- (/) = App2 Div
164
+ (/) x y = App " div " [x,y]
194
165
195
166
instance Floating Core where
196
167
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]
209
180
210
181
type CorePrg = [Core ]
211
182
@@ -262,7 +233,7 @@ instance Pretty Expr3 where
262
233
pretty (ETag i) = " TAG" <> pad 6 i
263
234
pretty (EVar s) = s
264
235
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)
266
237
pretty (ERats r) = pretty r
267
238
pretty (Expr0 e) = paren $ pretty e
268
239
@@ -317,7 +288,7 @@ subsExpr2 f (Expr3 e) = Expr3 (subsExpr3 f e)
317
288
318
289
subsExpr3 :: Subs -> Expr3 -> Expr3
319
290
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 )
321
292
subsExpr3 f (Expr0 e) = Expr0 (subsExpr0 f e)
322
293
subsExpr3 _ e = e
323
294
@@ -383,25 +354,25 @@ coreCmd (Expr e) = coreExpr0 e
383
354
coreCmd (Asgmt s e) = Let s (coreExpr0 e)
384
355
385
356
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]
388
359
coreExpr0 (Expr1 e) = coreExpr1 e
389
360
390
361
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]
396
367
coreExpr1 (Expr2 e) = coreExpr2 e
397
368
398
369
coreExpr2 :: Expr2 -> Core
399
- coreExpr2 (ENeg e) = App1 Neg ( coreExpr2 e)
370
+ coreExpr2 (ENeg e) = App " neg " [ coreExpr2 e]
400
371
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]
405
376
coreExpr2 (Expr3 e) = coreExpr3 e
406
377
407
378
coreExpr3 :: Expr3 -> Core
@@ -412,26 +383,24 @@ coreExpr3 (EA i) = A i
412
383
coreExpr3 (ETag i) = Tag i
413
384
coreExpr3 (EVar s) = Var s
414
385
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 )
416
387
coreExpr3 (ERats r) = Rats (R. core r)
417
388
coreExpr3 (Expr0 e) = coreExpr0 e
418
389
419
390
varsCorePrg :: CorePrg -> [Name ]
420
391
varsCorePrg = nub . (>>= varsCore)
421
392
422
393
varsCore :: Core -> [Name ]
423
- varsCore (App1 _ e) = varsCore e
424
- varsCore (App2 _ e1 e2) = varsCore e1 ++ varsCore e2
394
+ varsCore (App _ es) = varsCore =<< es
425
395
varsCore (Var s) = [s]
426
396
varsCore (Let s e) = s : varsCore e
427
397
varsCore _ = []
428
398
429
399
anumsCorePrg :: CorePrg -> [Int ]
430
- anumsCorePrg = nub . (>>= anumsCore)
400
+ anumsCorePrg = nub . (anumsCore =<< )
431
401
432
402
anumsCore :: Core -> [Int ]
433
- anumsCore (App1 _ e) = anumsCore e
434
- anumsCore (App2 _ e1 e2) = anumsCore e1 ++ anumsCore e2
403
+ anumsCore (App _ es) = anumsCore =<< es
435
404
anumsCore (A i) = [i]
436
405
anumsCore (Let _ e) = anumsCore e
437
406
anumsCore _ = []
@@ -443,27 +412,20 @@ anumsCore _ = []
443
412
emptyEnv :: Env n
444
413
emptyEnv = Env V. empty M. empty
445
414
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
463
426
464
427
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
467
429
evalCore X = return $ polynomial (Proxy :: Proxy n ) [0 ,1 ]
468
430
evalCore (A i) = fromMaybe nil . lookupANum i <$> get
469
431
evalCore (Tag _) = return nil
@@ -533,12 +495,13 @@ expr2
533
495
534
496
expr3 :: Parser Expr3
535
497
expr3
536
- = ELit <$> decimal
498
+ = EApp <$> name <*> parens (sepBy expr0 (char ' ,' ))
499
+ <|> ELit <$> decimal
537
500
<|> const EDZ <$> string " DZ"
538
501
<|> const EIndet <$> string " Indet"
539
502
<|> EA <$> aNumInt
540
503
<|> ETag <$> tag
541
- <|> Tr <$> name <*> expr3
504
+ <|> EApp <$> name <*> (( pure . Expr1 . Expr2 . Expr3 ) <$> expr3)
542
505
<|> EVar <$> var
543
506
<|> const EX <$> string " x"
544
507
<|> ERats <$> R. rats
0 commit comments