@@ -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
4039varExprGen = 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
4853export
4954exprGen : (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
137143namespace 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
345352namespace 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
408415namespace 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' }))
0 commit comments