/** * A collection of strategies that keeps traversing a term until * no more applications of some strategy to the nodes can be * found. */ module strategy/traversal/fixpoint imports strategy/iteration strategy/traversal/simple strategy/general/memo strategies // reduce(s) = repeat(rec x(s + one(x))) reduce(s) = repeat(rec x(some(x) + s)) outermost(s) = repeat(oncetd(s)) innermost'(s) = repeat(oncebu(s)) innermost(s) = bottomup(try(s; innermost(s))) innermost-old(s) = rec x(all(x); (s; x <+ id)) pseudo-innermost3(s) = rec x(all(x); rec y(try(s; all(all(all(y); y); y); y))) innermost-memo(s) = rec x(memo(all(x); (s; x <+ id))) /** * innermost-tagged(s) reduces the subject term by applying s to * innermost redices first. Terms in normal form are tagged (using * attributes) to prevent renormalization. */ innermost-tagged(s : a -> a) = // : a -> a where(new => tag); rec x(?_{tag} <+ (all(x); (s; x <+ !<id>{tag}))); bottomup(?<id>{tag})