/** * The memo operator makes a strategy * into a memoizing strategy that looks up the term to be transformed * in a memo table and only computes the transformation if the * term is not found. */ module strategy/general/memo imports lang/dynamic-rules strategies memo-scope(s) = {| Memo: s |} /** * <memo(tbl, s)> t first looks up the term t in the memo table. If * present the association in the table is produced, else the result * of <s> t is computed and stored in the table. */ memo(s) : t -> t' where ( <Memo> t => t' ) <+ ( <s> t => t'; rules(Memo: t -> t') )