Skip to content

Commit f52565a

Browse files
committed
[ example ] Drasticly simplify expressions generation in pil-reg
1 parent d263bc1 commit f52565a

12 files changed

Lines changed: 378 additions & 216 deletions

File tree

examples/pil-reg/src/Example/Pil/Gens.idr

Lines changed: 46 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -35,26 +35,31 @@ lookupGen vars = elements $ mapLk vars where
3535

3636
--- Expressions ---
3737

38-
export
39-
varExprGen : {a : Type'} -> {vars : Variables} -> {regs : Registers rc} -> Gen0 $ Expression vars regs a
38+
varExprGen : {ops : Ops} -> {a : Type'} -> {vars : Variables} -> {regs : Registers rc} -> Gen0 $ Expression ops vars regs a
4039
varExprGen = do Element (n ** _) prf <- lookupGen vars `suchThat_invertedEq` a $ \(_ ** lk) => reveal lk
4140
pure $ rewrite prf in V n
4241

4342
||| Generator of non-recursive expressions (thus those that can be used with zero recursion bound).
44-
nonRec_exprGen : {a : Type'} -> {vars : Variables} -> {regs : Registers rc} -> Gen0 (idrTypeOf a) -> Gen0 $ Expression vars regs a
45-
nonRec_exprGen g = oneOf $ [| C' g |] :: alternativesOf varExprGen
46-
-- TODO to add the register access expression
43+
nonRec_exprGen : Gen0 Int => Gen0 String =>
44+
{ops : Ops} -> {a : Type'} -> {vars : Variables} -> {regs : Registers rc} -> Gen0 $ Expression ops vars regs a
45+
nonRec_exprGen = do
46+
let g = case a of
47+
Bool' => elements {em=MaybeEmpty} [True, False]
48+
Int' => %search
49+
String' => %search
50+
oneOf $ [| C' g |] :: alternativesOf varExprGen
51+
-- TODO to add the register access expression
4752

4853
export
4954
exprGen : (fuel : Fuel) ->
55+
Gen0 Int => Gen0 String =>
56+
{ops : Ops} ->
5057
{a : Type'} ->
51-
({b : Type'} -> Gen0 $ idrTypeOf b) ->
5258
{vars : Variables} ->
5359
{regs : Registers rc} ->
54-
((subGen : {x : Type'} -> Gen0 $ Expression vars regs x) -> {b : Type'} -> Gen0 $ Expression vars regs b) ->
55-
Gen0 (Expression vars regs a)
56-
exprGen Dry g _ = nonRec_exprGen g
57-
exprGen (More f) g rec = oneOf $ alternativesOf (nonRec_exprGen g) ++ alternativesOf (rec $ exprGen f g rec)
60+
Gen0 (Expression ops vars regs a)
61+
exprGen Dry = nonRec_exprGen
62+
exprGen (More f) = oneOf $ alternativesOf nonRec_exprGen ++ alternativesOf (exprGen f)
5863

5964
--- General methodology of writing autogenerated-like generators ---
6065

@@ -131,7 +136,8 @@ SpecGen res =
131136
(fuel : Fuel) ->
132137
Gen0 Type' =>
133138
Gen0 Name =>
134-
({ty : Type'} -> {vars : Variables} -> {rc : Nat} -> {regs : Registers rc} -> Gen0 (Expression vars regs ty)) =>
139+
Gen0 String =>
140+
Gen0 Int =>
135141
res
136142

137143
namespace Equal_registers
@@ -193,8 +199,9 @@ namespace Statements_given_preV_preR_postV_postR
193199

194200
public export
195201
0 Statement_no_Gen : Type
196-
Statement_no_Gen = SpecGen $ {rc : Nat} -> (preV : Variables) -> (preR : Registers rc) -> (postV : Variables) -> (postR : Registers rc) ->
197-
Gen0 (Statement preV preR postV postR)
202+
Statement_no_Gen = SpecGen $ {ops : _} -> {rc : Nat} ->
203+
(preV : Variables) -> (preR : Registers rc) -> (postV : Variables) -> (postR : Registers rc) ->
204+
Gen0 (Statement ops preV preR postV postR)
198205

199206
nop_gen : Statement_no_Gen
200207
dot_gen : Statement_no_Gen
@@ -231,8 +238,8 @@ namespace Statements_given_preV_preR_postR
231238

232239
public export
233240
0 Statement_postV_Gen : Type
234-
Statement_postV_Gen = SpecGen $ {rc : Nat} -> (preV : Variables) -> (preR : Registers rc) -> (postR : Registers rc) ->
235-
Gen0 (postV ** Statement preV preR postV postR)
241+
Statement_postV_Gen = SpecGen $ {ops : _} -> {rc : Nat} -> (preV : Variables) -> (preR : Registers rc) -> (postR : Registers rc) ->
242+
Gen0 (postV ** Statement ops preV preR postV postR)
236243

237244
nop_gen : Statement_postV_Gen
238245
dot_gen : Statement_postV_Gen
@@ -269,8 +276,8 @@ namespace Statements_given_preV_preR
269276

270277
public export
271278
0 Statement_postV_postR_Gen : Type
272-
Statement_postV_postR_Gen = SpecGen $ {rc : Nat} -> (preV : Variables) -> (preR : Registers rc) ->
273-
Gen0 (postV ** postR ** Statement preV preR postV postR)
279+
Statement_postV_postR_Gen = SpecGen $ {ops : _} -> {rc : Nat} -> (preV : Variables) -> (preR : Registers rc) ->
280+
Gen0 (postV ** postR ** Statement ops preV preR postV postR)
274281

275282
nop_gen : Statement_postV_postR_Gen
276283
dot_gen : Statement_postV_postR_Gen
@@ -309,11 +316,11 @@ namespace Statements_given_preV_preR -- implementations
309316

310317
dot_gen _ preV preR = pure (_ ** _ ** !external_gen. !external_gen)
311318

312-
v_ass_gen _ preV preR = do
319+
v_ass_gen f preV preR = do
313320
(n ** lk) <- lookupGen preV
314-
pure (_ ** _ ** n #= !external_gen)
321+
pure (_ ** _ ** n #= !(exprGen f))
315322

316-
r_ass_gen _ preV preR = pure (_ ** _ ** !external_gen %= !(external_gen {ty = Expression _ _ !external_gen}))
323+
r_ass_gen f preV preR = pure (_ ** _ ** !external_gen %= !(exprGen f {a = !external_gen}))
317324

318325
for_gen f preV preR = do
319326
(insideV ** insideR ** init) <- statement_gen f preV preR
@@ -324,12 +331,12 @@ namespace Statements_given_preV_preR -- implementations
324331
(bodyR ** _) <- eq_registers_gen f insideR
325332
(_ ** body) <- statement_gen f insideV insideR bodyR
326333
--
327-
pure (_ ** _ ** for init !external_gen upd body)
334+
pure (_ ** _ ** for init !(exprGen f) upd body)
328335

329336
if_gen f preV preR = do
330337
(_ ** _ ** th) <- statement_gen f preV preR
331338
(_ ** _ ** el) <- statement_gen f preV preR
332-
pure (_ ** _ ** if__ !external_gen th el)
339+
pure (_ ** _ ** if__ !(exprGen f) th el)
333340

334341
seq_gen f preV preR = do
335342
(midV ** midR ** l) <- statement_gen f preV preR
@@ -340,7 +347,7 @@ namespace Statements_given_preV_preR -- implementations
340347
(_ ** _ ** s) <- statement_gen f preV preR
341348
pure (_ ** _ ** block s)
342349

343-
print_gen _ preV preR = pure (_ ** _ ** print !(external_gen {ty=Expression _ _ String'}))
350+
print_gen f preV preR = pure (_ ** _ ** print !(exprGen f {a=String'}))
344351

345352
namespace Statements_given_preV_preR_postV_postR -- implementations
346353

@@ -355,15 +362,15 @@ namespace Statements_given_preV_preR_postV_postR -- implementations
355362
(_, No _) => empty
356363
(Yes Refl, Yes Refl) => pure $ ty. n
357364

358-
v_ass_gen _ preV preR postV postR = case (decEq postV preV, decEq postR preR) of
365+
v_ass_gen f preV preR postV postR = case (decEq postV preV, decEq postR preR) of
359366
(No _, _) => empty
360367
(_, No _) => empty
361368
(Yes Refl, Yes Refl) => do
362369
(n ** lk) <- lookupGen preV
363-
pure $ n #= !external_gen
370+
pure $ n #= !(exprGen f)
364371

365-
r_ass_gen _ preV preR postV (rs `With` (reg, Just ty)) = case (decEq postV preV, decEq rs preR) of
366-
(Yes Refl, Yes Refl) => pure $ reg %= !external_gen
372+
r_ass_gen f preV preR postV (rs `With` (reg, Just ty)) = case (decEq postV preV, decEq rs preR) of
373+
(Yes Refl, Yes Refl) => pure $ reg %= !(exprGen f)
367374
(No _, _) => empty
368375
(_, No _) => empty
369376
r_ass_gen _ preV preR postV _ = empty
@@ -379,13 +386,13 @@ namespace Statements_given_preV_preR_postV_postR -- implementations
379386
(bodyR ** _) <- eq_registers_gen f postR
380387
(_ ** body) <- statement_gen f insideV postR bodyR
381388
--
382-
pure $ for init !external_gen upd body
389+
pure $ for init !(exprGen f) upd body
383390

384391
if_gen f preV preR postV (Merge thR elR) = case decEq postV preV of
385392
Yes Refl => do
386393
(_ ** th) <- statement_gen f preV preR thR
387394
(_ ** el) <- statement_gen f preV preR elR
388-
pure $ if__ !external_gen th el
395+
pure $ if__ !(exprGen f) th el
389396
No _ => empty
390397
if_gen f preV preR postV _ = empty
391398

@@ -400,10 +407,10 @@ namespace Statements_given_preV_preR_postV_postR -- implementations
400407
(_ ** stmt) <- statement_gen f preV preR postR
401408
pure $ block stmt
402409

403-
print_gen _ preV preR postV postR = case (decEq postV preV, decEq postR preR) of
410+
print_gen f preV preR postV postR = case (decEq postV preV, decEq postR preR) of
404411
(No _, _) => empty
405412
(_, No _) => empty
406-
(Yes Refl, Yes Refl) => pure $ print !(external_gen {ty=Expression _ _ String'})
413+
(Yes Refl, Yes Refl) => pure $ print !(exprGen f {a=String'})
407414

408415
namespace Statements_given_preV_preR_postR -- implementations
409416

@@ -415,14 +422,14 @@ namespace Statements_given_preV_preR_postR -- implementations
415422
No _ => empty
416423
Yes Refl => pure (_ ** !external_gen. !external_gen)
417424

418-
v_ass_gen _ preV preR postR = case decEq postR preR of
425+
v_ass_gen f preV preR postR = case decEq postR preR of
419426
No _ => empty
420427
Yes Refl => do
421428
(n ** lk) <- lookupGen preV
422-
pure (_ ** n #= !external_gen)
429+
pure (_ ** n #= !(exprGen f))
423430

424-
r_ass_gen _ preV preR (rs `With` (reg, Just ty)) = case decEq rs preR of
425-
Yes Refl => pure $ (_ ** reg %= !external_gen)
431+
r_ass_gen f preV preR (rs `With` (reg, Just ty)) = case decEq rs preR of
432+
Yes Refl => pure $ (_ ** reg %= !(exprGen f))
426433
No _ => empty
427434
r_ass_gen _ preV preR _ = empty
428435

@@ -435,12 +442,12 @@ namespace Statements_given_preV_preR_postR -- implementations
435442
(bodyR ** _) <- eq_registers_gen f postR
436443
(_ ** body) <- statement_gen f insideV postR bodyR
437444
--
438-
pure (_ ** for init !external_gen upd body)
445+
pure (_ ** for init !(exprGen f) upd body)
439446

440447
if_gen f preV preR (Merge thR elR) = do
441448
(_ ** th) <- statement_gen f preV preR thR
442449
(_ ** el) <- statement_gen f preV preR elR
443-
pure (_ ** if__ !external_gen th el)
450+
pure (_ ** if__ !(exprGen f) th el)
444451
if_gen f preV preR _ = empty
445452

446453
seq_gen f preV preR postR = do
@@ -452,6 +459,6 @@ namespace Statements_given_preV_preR_postR -- implementations
452459
(_ ** stmt) <- statement_gen f preV preR postR
453460
pure $ (_ ** block stmt)
454461

455-
print_gen _ preV preR postR = case decEq postR preR of
462+
print_gen f preV preR postR = case decEq postR preR of
456463
No _ => empty
457-
Yes Refl => pure $ (_ ** print !(external_gen {ty=Expression _ _ String'}))
464+
Yes Refl => pure $ (_ ** print !(exprGen f {a=String'}))

examples/pil-reg/src/Example/Pil/Lang.idr

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,19 @@ import public Data.List.Lookup
55

66
import public Example.Pil.Lang.Expression
77
import public Example.Pil.Lang.Statement
8+
9+
public export
10+
SomeOps : Ops
11+
SomeOps = MkOps
12+
{unary = [ (Int', "inc", Int')
13+
, (String', "as_str", Int')
14+
, (Bool', "!", Bool')
15+
]}
16+
{binary = [ (Int', "+", Int', Int')
17+
, (Int', "*", Int', Int')
18+
, (String', "concat", String', String')
19+
, (Bool', "&&", Bool', Bool')
20+
, (Bool', "||", Bool', Bool')
21+
, (Bool', "<", Int', Int')
22+
, (Bool', "<=", Int', Int')
23+
]}

examples/pil-reg/src/Example/Pil/Lang/Expression.idr

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,44 @@ import public Example.Pil.Lang.Aspects.Registers
99
%default total
1010

1111
public export
12-
data Expression : (vars : Variables) -> (regs : Registers rc) -> (res : Type') -> Type where
12+
record Ops where
13+
constructor MkOps
14+
unary : List (Type', String, Type')
15+
binary : List (Type', String, Type', Type')
16+
17+
public export
18+
data Expression : Ops -> (vars : Variables) -> (regs : Registers rc) -> (res : Type') -> Type where
1319
-- Constant expression
14-
C' : {ty : Type'} -> (x : idrTypeOf ty) -> Expression vars regs ty
20+
C' : {ty : Type'} -> (x : idrTypeOf ty) -> Expression ops vars regs ty
1521

1622
-- Value of the variable
17-
V : (n : Name) -> (0 lk : Lookup n vars) => Expression vars regs lk.reveal
23+
V : (n : Name) -> (0 lk : Lookup n vars) => Expression ops vars regs lk.reveal
1824

1925
-- Value of the register
20-
R : (r : Fin rc) -> (0 _ : IsJust $ index r regs) => Expression vars regs $ fromJust $ index r regs
26+
R : (r : Fin rc) -> (0 _ : IsJust $ index r regs) => Expression ops vars regs $ fromJust $ index r regs
2127

2228
-- Unary operation over the result of another expression
23-
U : {default "?func" opName : String} ->
24-
(f : idrTypeOf a -> idrTypeOf b) ->
25-
Expression vars regs a -> Expression vars regs b
29+
U : (lk : Lookup res ops.unary) =>
30+
Expression ops vars regs (snd lk.reveal) -> Expression ops vars regs res
2631

2732
-- Binary operation over the results of two another expressions
28-
B : {default "??" opName : String} ->
29-
(f : idrTypeOf a -> idrTypeOf b -> idrTypeOf c) ->
30-
Expression vars regs a -> Expression vars regs b -> Expression vars regs c
33+
B : (lk : Lookup res ops.binary) =>
34+
Expression ops vars regs (fst $ snd lk.reveal) -> Expression ops vars regs (snd $ snd lk.reveal) -> Expression ops vars regs res
3135

3236
namespace Int
3337

3438
public export %inline
35-
C : Int -> Expression vars regs Int'
39+
C : Int -> Expression ops vars regs Int'
3640
C x = C' x
3741

3842
namespace Bool
3943

4044
public export %inline
41-
C : Bool -> Expression vars regs Bool'
45+
C : Bool -> Expression ops vars regs Bool'
4246
C x = C' x
4347

4448
namespace String
4549

4650
public export %inline
47-
C : String -> Expression vars regs String'
51+
C : String -> Expression ops vars regs String'
4852
C x = C' x

examples/pil-reg/src/Example/Pil/Lang/ShowC.idr

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,21 @@ makeFuncName : String -> String
1717
makeFuncName = pack . map (\k => if isAlphaNum k then k else '_') . unpack
1818

1919
export
20-
Show (Expression vars regs a) where
20+
Show (Expression ops vars regs a) where
2121
show (C' {ty=Bool'} x) = show x
2222
show (C' {ty=Int'} x) = show x
2323
show (C' {ty=String'} x) = show x
2424
show (V n) = show n
2525
show (R r) = "[[" ++ show (finToNat r) ++ "]]"
26-
show (U {opName} _ e) = opName ++ "(" ++ show e ++ ")"
27-
show (B {opName} _ l r) = if looksLikeInfixOperator opName
26+
show (U @{lk} e) = let opName = fst lk.reveal in opName ++ "(" ++ show e ++ ")"
27+
show (B @{lk} l r) = let opName = fst lk.reveal in
28+
if looksLikeInfixOperator opName
2829
then wr l ++ " " ++ opName ++ " " ++ wr r
2930
else makeFuncName opName ++ "(" ++ show l ++ ", " ++ show r ++ ")"
3031
where
31-
wr : Expression vars regs x -> String
32-
wr e@(B _ _ _) = "(" ++ show e ++ ")"
33-
wr e = show e
32+
wr : Expression ops vars regs x -> String
33+
wr e@(B _ _) = "(" ++ show e ++ ")"
34+
wr e = show e
3435

3536
--- Statements ---
3637

@@ -39,7 +40,7 @@ Show Type' where
3940
show Int' = "int"
4041
show String' = "char *"
4142

42-
isNopDeeply : Statement preV preR postV postR -> Bool
43+
isNopDeeply : Statement ops preV preR postV postR -> Bool
4344
isNopDeeply Nop = True
4445
isNopDeeply (x >> y) = isNopDeeply x && isNopDeeply y
4546
isNopDeeply _ = False
@@ -48,7 +49,7 @@ isNopDeeply _ = False
4849
n : Nat -> Nat
4950
n = (+ 2)
5051

51-
showInd : (indent : Nat) -> Statement preV preR postV postR -> String
52+
showInd : (indent : Nat) -> Statement ops preV preR postV postR -> String
5253
showInd i Nop = ""
5354
showInd i (ty . n) = indent i $ show ty ++ " " ++ show n ++ ";"
5455
showInd i (n #= v) = indent i $ show n ++ " = " ++ show v ++ ";"
@@ -82,5 +83,5 @@ showInd i (Block x) = indent i "{\n" ++ showInd (n i) x ++ "\n" ++ indent i "}"
8283
showInd i (Print x) = indent i $ "puts(" ++ show x ++ ");"
8384

8485
export
85-
Show (Statement preV preR postV postR) where
86+
Show (Statement ops preV preR postV postR) where
8687
show = showInd 0

0 commit comments

Comments
 (0)