diff options
author | 2018-09-17 14:12:53 -0400 | |
---|---|---|
committer | 2018-09-17 14:12:53 -0400 | |
commit | cafdecd7c086897dec79a429ec76bc3249a43555 (patch) | |
tree | b50467230bbe0a1172cfe384419d6b5ee21efbea /src/Experiments/NewPipeline/Rewriter.v | |
parent | 7c41e71c4c3f292c33ff10b869e91f98091f4ca6 (diff) |
Split out rewrite_with_rule as a separate definition
Diffstat (limited to 'src/Experiments/NewPipeline/Rewriter.v')
-rw-r--r-- | src/Experiments/NewPipeline/Rewriter.v | 82 |
1 files changed, 44 insertions, 38 deletions
diff --git a/src/Experiments/NewPipeline/Rewriter.v b/src/Experiments/NewPipeline/Rewriter.v index 313dd62e7..e6982a8a2 100644 --- a/src/Experiments/NewPipeline/Rewriter.v +++ b/src/Experiments/NewPipeline/Rewriter.v @@ -505,44 +505,50 @@ Module Compilers. Definition ERROR_BAD_REWRITE_RULE {t} (pat : pattern) (value : expr t) : expr t := value. Global Opaque ERROR_BAD_REWRITE_RULE. - Definition eval_rewrite_rules - (do_again : forall t : base.type, @expr.expr base.type ident value t -> UnderLets (expr t)) - (maybe_do_again - := fun (should_do_again : bool) (t : base.type) - => if should_do_again return ((@expr.expr base.type ident (if should_do_again then value else var) t) -> UnderLets (expr t)) - then do_again t - else UnderLets.Base) - (d : decision_tree) - (rew : rewrite_rulesT) - (e : rawexpr) - : UnderLets (expr (type_of_rawexpr e)) - := let defaulte := expr_of_rawexpr e in - (eval_decision_tree - (e::nil) d - (fun k ctx - => match ctx return option (UnderLets (expr (type_of_rawexpr e))) with - | e'::nil - => (pf <- nth_error rew k; - let 'existT p f := pf in - bind_data_cps - e' p _ - (fun v - => v <- v; - f v _ - (fun fv - => fv <- fv; - let 'existT should_do_again fv := fv in - Some - (fv <-- fv; - fv <-- maybe_do_again should_do_again _ fv; - type.try_transport_cps - base.try_make_transport_cps _ _ _ fv _ - (fun fv' - => UnderLets.Base - (fv' ;;; (ERROR_BAD_REWRITE_RULE p defaulte))))%under_lets)))%option - | _ => None - end);;; - (UnderLets.Base defaulte))%option. + Section eval_rewrite_rules. + Context (do_again : forall t : base.type, @expr.expr base.type ident value t -> UnderLets (expr t)). + + Let maybe_do_again + := fun (should_do_again : bool) (t : base.type) + => if should_do_again return ((@expr.expr base.type ident (if should_do_again then value else var) t) -> UnderLets (expr t)) + then do_again t + else UnderLets.Base. + + Definition rewrite_with_rule {t} (defaulte : expr t) e' (pf : rewrite_ruleT) + := let 'existT p f := pf in + bind_data_cps + e' p _ + (fun v + => v <- v; + f v _ + (fun fv + => fv <- fv; + let 'existT should_do_again fv := fv in + Some + (fv <-- fv; + fv <-- maybe_do_again should_do_again _ fv; + type.try_transport_cps + base.try_make_transport_cps _ _ _ fv _ + (fun fv' + => UnderLets.Base + (fv' ;;; (ERROR_BAD_REWRITE_RULE p defaulte))))%under_lets))%option. + + Definition eval_rewrite_rules + (d : decision_tree) + (rew : rewrite_rulesT) + (e : rawexpr) + : UnderLets (expr (type_of_rawexpr e)) + := let defaulte := expr_of_rawexpr e in + (eval_decision_tree + (e::nil) d + (fun k ctx + => match ctx return option (UnderLets (expr (type_of_rawexpr e))) with + | e'::nil + => (pf <- nth_error rew k; rewrite_with_rule defaulte e' pf)%option + | _ => None + end);;; + (UnderLets.Base defaulte))%option. + End eval_rewrite_rules. Local Notation enumerate ls := (List.combine (List.seq 0 (List.length ls)) ls). |