Using Automatic Memoization As a Software Engineering Tool in Real

Total Page:16

File Type:pdf, Size:1020Kb

Using Automatic Memoization As a Software Engineering Tool in Real Using Automatic Memoization as a Software Engineering To ol in RealWorld AI Systems James Mayeld Marty Hall Computer Science Department Science Applications International Corp University of Maryland Baltimore County Broken Land Parkway Suite Baltimore MD Columbia MD mayeldcsumb cedu hallcsumb cedu Tim Finin Computer Science Department University of Maryland Baltimore County Baltimore MD nincsumb cedu April Abstract Memo functions and memoization are well known concepts in AI programming They have b een dis cussed since the Sixties and are often used as examples in intro ductory programming texts However the automation of memoization as a practical software engineering to ol for AI systems has never received a detailed treatment This pap er describ es how automatic memoization can b e made viable on a large scale It p oints out advantages and uses of automatic memoization not previously describ ed describ es the com p onents of an automatic memoization facility enumerates p otential memoization failures and presents a publicly available memoization package CLAMP for the Lisp programming language Exp erience in applying these techniques in the development of a large planning system are briey discussed Track Enabling Technology Subtrack Software Engineering Words Corresp ondence Please address all corresp ondence to James Mayeld Computer Science Department University of Maryland Baltimore County Baltimore MD Voice Fax Email mayeldcsumb cedu Intro duction Memo functions and memoization are well known concepts in AI programming They have b een discussed since the Sixties and are often used as examples in intro ductory programming texts However the automation of memoization as a practical software engineering to ol for AI systems has never received a detailed treatment This pap er describ es how automatic memoization can b e made viable on a large scale It p oints out advantages and uses of automatic memoization not previously describ ed itemizes the comp onents of an automatic memoization facility enumerates p otential memoization failures and presents a publicly available memoization package CLAMPCommon Lisp Automatic Memoization Package for 1 the Lisp programming language We will also briey discuss our exp erience in applying these techniques in the development of the Signature Management System SMS a decision supp ort system that provides submarine crews with situational awareness and op erational advice in order to reduce detectability The term memoization is derived from the term memo function which was coined by David Michie It refers to the tabulation of the results of a set of calculations to avoid rep eating those calculations Auto matic memoization refers to a metho d by which an ordinary function can b e changed mechanically into one that memoizes or caches its results We place the decision ab out which functions to memoize in the hands of the user this contrasts with the approach of Mostow and Cohen which tries to automatically infer which functions should b e memoized These two approaches to automatic memoization are not incompatible although as Mostow and Cohen p oint out the latter approach is not a practical to ol Memoization is particularly apt for AI applications Rapid prototyping is a hallmark of AI programming Automatic memoization allows the programmer to write certain functions without regard to eciency while b eing assured of reasonable p erformance By allowing the programmer to avoide these eciency concerns at the outset automatic memoization facilitates the kind of exploratory programming used in the development of most AI systems The principle of memoization and examples of its use in areas as varied as logic programming functional programming and natural language parsing have b een describ ed in the literature In all of the cases that we have reviewed the use of memoization was either built into in a sp ecial purp ose 1 Throughout this pap er we use the name Lisp to refer to the language Common Lisp as describ ed in Steele computing engine eg for rulebased deduction or CFG parsing or treated in a cursory way as an example rather than taken seriously as a practical technique The automation of function memoization as a practical software engineering technique under human control has never received a detailed treatment In this pap er we rep ort on our exp erience in developing CLAMP a practical automatic memoization package for Common Lisp and its use in a largescale AI pro ject By means of illustration consider the divideddierence algorithm dd which is shown in pseudoco de in Figure This algorithm is used to determine co ecients of interp olated p olynomials The algorithm which is a standard one in numerical metho ds is taken directly from Numerical Mathematics and Computing The application itself is not particularly imp ortant it is the runtime b ehavior of the algorithm that is of interest to us here The call tree for the divided dierence algorithm dd forms a network rather than a tree thus a recursive call to dd with particular arguments may b e rep eated many times during a single computation For example a call to dd with low and high will generate one recursive call with low and high and another recursive call with low and high each of these will in turn make a recursive call with low and high Memoization of dd causes each calculation to b e p erformed only once and stored in a table thereafter each rep eated recursive call is replaced by a table lo okup of the appropriate value Figure compares the p erformance of memoized and unmemoized versions of a Lisp implementation of the divided dierence algorithm using f n cosn and the rst n natural numb ers as arguments Since a single function call on n p oints generates two recursive calls on n p oints the unmemoized version has n 2 time complexity After memoization the rst invo cation requires n time since no subsequence 2 of p oints is calculated more than once and there are n n subsequences Subsequent invo cations take nearconstant time This algorithm for divided dierence is typical of a large class of algorithms which have very elegant recursive denitions which are simply unusable for most real problems The conventional resp onse to this situation is to manually rewrite the algorithm in a dynamic programming style Of course such manual rewriting of the co de takes eort and involves the risk of intro ducing new bugs An attractive alternative is to use an automatic memoization package to convert the elegant but inecient recursive algorithm into a divideddifference algorithm ddpoints array low arrayindex high arrayindex fn function begin if low high then return fnpointslow else return ddpoints low high fn ddpoints low high fn pointshigh pointslow end Figure The divided dierence algorithm for determining co ecients of interp olated p olynomials can b e elegantly written using recursion and made ecient through the use of automatic memoization n Unmemoized Memoized Memoized rst run subsequent runs Centuries Figure This table shows the b enets of memoization on a Lisp implementation of dd The time complexity n 2 is reduced from to n for initial runs and to nearconstant time on subsequent ones useful one This is attractive of course only if such a package can address the practical problems faced in real application In the next section we describ e the some of the asp ects and uses of automatic memoization not previously describ ed in the literature Section three compares the use of automatic memoization to the alternative of rewriting co de by hand Section four describ es the general comp onents that should b e present in any automatic memoization facility Section ve presents problems inherent in the use of memoization and the various ways to address them Section six describ es our exp erience in using automatic memoization in in the development of SMSa large decision supp ort system Uses of Memoization There are four main uses of automatic memoization Two of these involve the avoidance of redundant calculation rst within a single function invo cation and second across invo cations The third use of automatic memoization is as a precalculation to ol while the fourth is as a timing and proling to ol These are not conjectured uses but ones which we found to b e eective in many situations in a large realworld AI application We discuss each of these uses in more detail in the following subsections Rep etition within a Function Call The most common use of memoization is to avoid the rep etition of subcalculations within a single function call In the divided dierence example presented ab ove there were many rep eated recursive calls within a single function invo cation This typ e of rep etition is common For example a simple recursive backtracking parser may parse the same constituent many times during a single parse thus its p erformance is p o or Norvig has shown that such an algorithm can obtain the p erformance of chart parsing or of Earleys algorithm through the application of memoization Thus we can view memoization as a technique to automatically convert a recursive algorithm into one that has the same b ehavior as a dynamic programming algorithm rather than determining the prop er order in which to construct subpieces memoization of a simple solution can typically achieve the same p erformance Again through automatic memoization one can in many cases achieve the b enets of a dynamic programming approach without rewriting the control structure or intro ducing new data structures
Recommended publications
  • Design and Evaluation of an Auto-Memoization Processor
    DESIGN AND EVALUATION OF AN AUTO-MEMOIZATION PROCESSOR Tomoaki TSUMURA Ikuma SUZUKI Yasuki IKEUCHI Nagoya Inst. of Tech. Toyohashi Univ. of Tech. Toyohashi Univ. of Tech. Gokiso, Showa, Nagoya, Japan 1-1 Hibarigaoka, Tempaku, 1-1 Hibarigaoka, Tempaku, [email protected] Toyohashi, Aichi, Japan Toyohashi, Aichi, Japan [email protected] [email protected] Hiroshi MATSUO Hiroshi NAKASHIMA Yasuhiko NAKASHIMA Nagoya Inst. of Tech. Academic Center for Grad. School of Info. Sci. Gokiso, Showa, Nagoya, Japan Computing and Media Studies Nara Inst. of Sci. and Tech. [email protected] Kyoto Univ. 8916-5 Takayama Yoshida, Sakyo, Kyoto, Japan Ikoma, Nara, Japan [email protected] [email protected] ABSTRACT for microprocessors, and it made microprocessors faster. But now, the interconnect delay is going major and the This paper describes the design and evaluation of main memory and other storage units are going relatively an auto-memoization processor. The major point of this slower. In near future, high clock rate cannot achieve good proposal is to detect the multilevel functions and loops microprocessor performance by itself. with no additional instructions controlled by the compiler. Speedup techniques based on ILP (Instruction-Level This general purpose processor detects the functions and Parallelism), such as superscalar or SIMD, have been loops, and memoizes them automatically and dynamically. counted on. However, the effect of these techniques has Hence, any load modules and binary programs can gain proved to be limited. One reason is that many programs speedup without recompilation or rewriting. have little distinct parallelism, and it is pretty difficult for We also propose a parallel execution by multiple compilers to come across latent parallelism.
    [Show full text]
  • Parallel Backtracking with Answer Memoing for Independent And-Parallelism∗
    Under consideration for publication in Theory and Practice of Logic Programming 1 Parallel Backtracking with Answer Memoing for Independent And-Parallelism∗ Pablo Chico de Guzman,´ 1 Amadeo Casas,2 Manuel Carro,1;3 and Manuel V. Hermenegildo1;3 1 School of Computer Science, Univ. Politecnica´ de Madrid, Spain. (e-mail: [email protected], fmcarro,[email protected]) 2 Samsung Research, USA. (e-mail: [email protected]) 3 IMDEA Software Institute, Spain. (e-mail: fmanuel.carro,[email protected]) Abstract Goal-level Independent and-parallelism (IAP) is exploited by scheduling for simultaneous execution two or more goals which will not interfere with each other at run time. This can be done safely even if such goals can produce multiple answers. The most successful IAP implementations to date have used recomputation of answers and sequentially ordered backtracking. While in principle simplifying the implementation, recomputation can be very inefficient if the granularity of the parallel goals is large enough and they produce several answers, while sequentially ordered backtracking limits parallelism. And, despite the expected simplification, the implementation of the classic schemes has proved to involve complex engineering, with the consequent difficulty for system maintenance and extension, while still frequently running into the well-known trapped goal and garbage slot problems. This work presents an alternative parallel backtracking model for IAP and its implementation. The model fea- tures parallel out-of-order (i.e., non-chronological) backtracking and relies on answer memoization to reuse and combine answers. We show that this approach can bring significant performance advantages. Also, it can bring some simplification to the important engineering task involved in implementing the backtracking mechanism of previous approaches.
    [Show full text]
  • Derivatives of Parsing Expression Grammars
    Derivatives of Parsing Expression Grammars Aaron Moss Cheriton School of Computer Science University of Waterloo Waterloo, Ontario, Canada [email protected] This paper introduces a new derivative parsing algorithm for recognition of parsing expression gram- mars. Derivative parsing is shown to have a polynomial worst-case time bound, an improvement on the exponential bound of the recursive descent algorithm. This work also introduces asymptotic analysis based on inputs with a constant bound on both grammar nesting depth and number of back- tracking choices; derivative and recursive descent parsing are shown to run in linear time and constant space on this useful class of inputs, with both the theoretical bounds and the reasonability of the in- put class validated empirically. This common-case constant memory usage of derivative parsing is an improvement on the linear space required by the packrat algorithm. 1 Introduction Parsing expression grammars (PEGs) are a parsing formalism introduced by Ford [6]. Any LR(k) lan- guage can be represented as a PEG [7], but there are some non-context-free languages that may also be represented as PEGs (e.g. anbncn [7]). Unlike context-free grammars (CFGs), PEGs are unambiguous, admitting no more than one parse tree for any grammar and input. PEGs are a formalization of recursive descent parsers allowing limited backtracking and infinite lookahead; a string in the language of a PEG can be recognized in exponential time and linear space using a recursive descent algorithm, or linear time and space using the memoized packrat algorithm [6]. PEGs are formally defined and these algo- rithms outlined in Section 3.
    [Show full text]
  • Lecture 4 Dynamic Programming
    1/17 Lecture 4 Dynamic Programming Last update: Jan 19, 2021 References: Algorithms, Jeff Erickson, Chapter 3. Algorithms, Gopal Pandurangan, Chapter 6. Dynamic Programming 2/17 Backtracking is incredible powerful in solving all kinds of hard prob- lems, but it can often be very slow; usually exponential. Example: Fibonacci numbers is defined as recurrence: 0 if n = 0 Fn =8 1 if n = 1 > Fn 1 + Fn 2 otherwise < ¡ ¡ > A direct translation in:to recursive program to compute Fibonacci number is RecFib(n): if n=0 return 0 if n=1 return 1 return RecFib(n-1) + RecFib(n-2) Fibonacci Number 3/17 The recursive program has horrible time complexity. How bad? Let's try to compute. Denote T(n) as the time complexity of computing RecFib(n). Based on the recursion, we have the recurrence: T(n) = T(n 1) + T(n 2) + 1; T(0) = T(1) = 1 ¡ ¡ Solving this recurrence, we get p5 + 1 T(n) = O(n); = 1.618 2 So the RecFib(n) program runs at exponential time complexity. RecFib Recursion Tree 4/17 Intuitively, why RecFib() runs exponentially slow. Problem: redun- dant computation! How about memorize the intermediate computa- tion result to avoid recomputation? Fib: Memoization 5/17 To optimize the performance of RecFib, we can memorize the inter- mediate Fn into some kind of cache, and look it up when we need it again. MemFib(n): if n = 0 n = 1 retujrjn n if F[n] is undefined F[n] MemFib(n-1)+MemFib(n-2) retur n F[n] How much does it improve upon RecFib()? Assuming accessing F[n] takes constant time, then at most n additions will be performed (we never recompute).
    [Show full text]
  • Exhaustive Recursion and Backtracking
    CS106B Handout #19 J Zelenski Feb 1, 2008 Exhaustive recursion and backtracking In some recursive functions, such as binary search or reversing a file, each recursive call makes just one recursive call. The "tree" of calls forms a linear line from the initial call down to the base case. In such cases, the performance of the overall algorithm is dependent on how deep the function stack gets, which is determined by how quickly we progress to the base case. For reverse file, the stack depth is equal to the size of the input file, since we move one closer to the empty file base case at each level. For binary search, it more quickly bottoms out by dividing the remaining input in half at each level of the recursion. Both of these can be done relatively efficiently. Now consider a recursive function such as subsets or permutation that makes not just one recursive call, but several. The tree of function calls has multiple branches at each level, which in turn have further branches, and so on down to the base case. Because of the multiplicative factors being carried down the tree, the number of calls can grow dramatically as the recursion goes deeper. Thus, these exhaustive recursion algorithms have the potential to be very expensive. Often the different recursive calls made at each level represent a decision point, where we have choices such as what letter to choose next or what turn to make when reading a map. Might there be situations where we can save some time by focusing on the most promising options, without committing to exploring them all? In some contexts, we have no choice but to exhaustively examine all possibilities, such as when trying to find some globally optimal result, But what if we are interested in finding any solution, whichever one that works out first? At each decision point, we can choose one of the available options, and sally forth, hoping it works out.
    [Show full text]
  • Dynamic Programming Via Static Incrementalization 1 Introduction
    Dynamic Programming via Static Incrementalization Yanhong A. Liu and Scott D. Stoller Abstract Dynamic programming is an imp ortant algorithm design technique. It is used for solving problems whose solutions involve recursively solving subproblems that share subsubproblems. While a straightforward recursive program solves common subsubproblems rep eatedly and of- ten takes exp onential time, a dynamic programming algorithm solves every subsubproblem just once, saves the result, reuses it when the subsubproblem is encountered again, and takes p oly- nomial time. This pap er describ es a systematic metho d for transforming programs written as straightforward recursions into programs that use dynamic programming. The metho d extends the original program to cache all p ossibly computed values, incrementalizes the extended pro- gram with resp ect to an input increment to use and maintain all cached results, prunes out cached results that are not used in the incremental computation, and uses the resulting in- cremental program to form an optimized new program. Incrementalization statically exploits semantics of b oth control structures and data structures and maintains as invariants equalities characterizing cached results. The principle underlying incrementalization is general for achiev- ing drastic program sp eedups. Compared with previous metho ds that p erform memoization or tabulation, the metho d based on incrementalization is more powerful and systematic. It has b een implemented and applied to numerous problems and succeeded on all of them. 1 Intro duction Dynamic programming is an imp ortant technique for designing ecient algorithms [2, 44 , 13 ]. It is used for problems whose solutions involve recursively solving subproblems that overlap.
    [Show full text]
  • Backtrack Parsing Context-Free Grammar Context-Free Grammar
    Context-free Grammar Problems with Regular Context-free Grammar Language and Is English a regular language? Bad question! We do not even know what English is! Two eggs and bacon make(s) a big breakfast Backtrack Parsing Can you slide me the salt? He didn't ought to do that But—No! Martin Kay I put the wine you brought in the fridge I put the wine you brought for Sandy in the fridge Should we bring the wine you put in the fridge out Stanford University now? and University of the Saarland You said you thought nobody had the right to claim that they were above the law Martin Kay Context-free Grammar 1 Martin Kay Context-free Grammar 2 Problems with Regular Problems with Regular Language Language You said you thought nobody had the right to claim [You said you thought [nobody had the right [to claim that they were above the law that [they were above the law]]]] Martin Kay Context-free Grammar 3 Martin Kay Context-free Grammar 4 Problems with Regular Context-free Grammar Language Nonterminal symbols ~ grammatical categories Is English mophology a regular language? Bad question! We do not even know what English Terminal Symbols ~ words morphology is! They sell collectables of all sorts Productions ~ (unordered) (rewriting) rules This concerns unredecontaminatability Distinguished Symbol This really is an untiable knot. But—Probably! (Not sure about Swahili, though) Not all that important • Terminals and nonterminals are disjoint • Distinguished symbol Martin Kay Context-free Grammar 5 Martin Kay Context-free Grammar 6 Context-free Grammar Context-free
    [Show full text]
  • Intercepting Functions for Memoization Arjun Suresh
    Intercepting functions for memoization Arjun Suresh To cite this version: Arjun Suresh. Intercepting functions for memoization. Programming Languages [cs.PL]. Université Rennes 1, 2016. English. NNT : 2016REN1S106. tel-01410539v2 HAL Id: tel-01410539 https://tel.archives-ouvertes.fr/tel-01410539v2 Submitted on 11 May 2017 HAL is a multi-disciplinary open access L’archive ouverte pluridisciplinaire HAL, est archive for the deposit and dissemination of sci- destinée au dépôt et à la diffusion de documents entific research documents, whether they are pub- scientifiques de niveau recherche, publiés ou non, lished or not. The documents may come from émanant des établissements d’enseignement et de teaching and research institutions in France or recherche français ou étrangers, des laboratoires abroad, or from public or private research centers. publics ou privés. ANNEE´ 2016 THESE` / UNIVERSITE´ DE RENNES 1 sous le sceau de l’Universite´ Bretagne Loire En Cotutelle Internationale avec pour le grade de DOCTEUR DE L’UNIVERSITE´ DE RENNES 1 Mention : Informatique Ecole´ doctorale Matisse present´ ee´ par Arjun SURESH prepar´ ee´ a` l’unite´ de recherche INRIA Institut National de Recherche en Informatique et Automatique Universite´ de Rennes 1 These` soutenue a` Rennes Intercepting le 10 Mai, 2016 devant le jury compose´ de : Functions Fabrice RASTELLO Charge´ de recherche Inria / Rapporteur Jean-Michel MULLER for Directeur de recherche CNRS / Rapporteur Sandrine BLAZY Memoization Professeur a` l’Universite´ de Rennes 1 / Examinateur Vincent LOECHNER Maˆıtre de conferences,´ Universite´ Louis Pasteur, Stras- bourg / Examinateur Erven ROHOU Directeur de recherche INRIA / Directeur de these` Andre´ SEZNEC Directeur de recherche INRIA / Co-directeur de these` If you save now you might benefit later.
    [Show full text]
  • Backtracking / Branch-And-Bound
    Backtracking / Branch-and-Bound Optimisation problems are problems that have several valid solutions; the challenge is to find an optimal solution. How optimal is defined, depends on the particular problem. Examples of optimisation problems are: Traveling Salesman Problem (TSP). We are given a set of n cities, with the distances between all cities. A traveling salesman, who is currently staying in one of the cities, wants to visit all other cities and then return to his starting point, and he is wondering how to do this. Any tour of all cities would be a valid solution to his problem, but our traveling salesman does not want to waste time: he wants to find a tour that visits all cities and has the smallest possible length of all such tours. So in this case, optimal means: having the smallest possible length. 1-Dimensional Clustering. We are given a sorted list x1; : : : ; xn of n numbers, and an integer k between 1 and n. The problem is to divide the numbers into k subsets of consecutive numbers (clusters) in the best possible way. A valid solution is now a division into k clusters, and an optimal solution is one that has the nicest clusters. We will define this problem more precisely later. Set Partition. We are given a set V of n objects, each having a certain cost, and we want to divide these objects among two people in the fairest possible way. In other words, we are looking for a subdivision of V into two subsets V1 and V2 such that X X cost(v) − cost(v) v2V1 v2V2 is as small as possible.
    [Show full text]
  • Staged Parser Combinators for Efficient Data Processing
    Staged Parser Combinators for Efficient Data Processing Manohar Jonnalagedda∗ Thierry Coppeyz Sandro Stucki∗ Tiark Rompf y∗ Martin Odersky∗ ∗LAMP zDATA, EPFL {first.last}@epfl.ch yOracle Labs: {first.last}@oracle.com Abstract use the language’s abstraction capabilities to enable compo- Parsers are ubiquitous in computing, and many applications sition. As a result, a parser written with such a library can depend on their performance for decoding data efficiently. look like formal grammar descriptions, and is also readily Parser combinators are an intuitive tool for writing parsers: executable: by construction, it is well-structured, and eas- tight integration with the host language enables grammar ily maintainable. Moreover, since combinators are just func- specifications to be interleaved with processing of parse re- tions in the host language, it is easy to combine them into sults. Unfortunately, parser combinators are typically slow larger, more powerful combinators. due to the high overhead of the host language abstraction However, parser combinators suffer from extremely poor mechanisms that enable composition. performance (see Section 5) inherent to their implementa- We present a technique for eliminating such overhead. We tion. There is a heavy penalty to be paid for the expres- use staging, a form of runtime code generation, to dissoci- sivity that they allow. A grammar description is, despite its ate input parsing from parser composition, and eliminate in- declarative appearance, operationally interleaved with input termediate data structures and computations associated with handling, such that parts of the grammar description are re- parser composition at staging time. A key challenge is to built over and over again while input is processed.
    [Show full text]
  • Module 5: Backtracking
    Module-5 : Backtracking Contents 1. Backtracking: 3. 0/1Knapsack problem 1.1. General method 3.1. LC Branch and Bound solution 1.2. N-Queens problem 3.2. FIFO Branch and Bound solution 1.3. Sum of subsets problem 4. NP-Complete and NP-Hard problems 1.4. Graph coloring 4.1. Basic concepts 1.5. Hamiltonian cycles 4.2. Non-deterministic algorithms 2. Branch and Bound: 4.3. P, NP, NP-Complete, and NP-Hard 2.1. Assignment Problem, classes 2.2. Travelling Sales Person problem Module 5: Backtracking 1. Backtracking Some problems can be solved, by exhaustive search. The exhaustive-search technique suggests generating all candidate solutions and then identifying the one (or the ones) with a desired property. Backtracking is a more intelligent variation of this approach. The principal idea is to construct solutions one component at a time and evaluate such partially constructed candidates as follows. If a partially constructed solution can be developed further without violating the problem’s constraints, it is done by taking the first remaining legitimate option for the next component. If there is no legitimate option for the next component, no alternatives for any remaining component need to be considered. In this case, the algorithm backtracks to replace the last component of the partially constructed solution with its next option. It is convenient to implement this kind of processing by constructing a tree of choices being made, called the state-space tree. Its root represents an initial state before the search for a solution begins. The nodes of the first level in the tree represent the choices made for the first component of a solution; the nodes of the second level represent the choices for the second component, and soon.
    [Show full text]
  • Using Automatic Memoization As a Software Engineering Tool in Real-World AI Systems
    Using Automatic Memoization as a Software Engineering Tool in Real-World AI Systems James Mayfield Tim Finin Marty Hall Computer Science Department Eisenhower Research Cent er , JHU / AP L University of Maryland Baltimore County Johns Hopkins Rd. Baltimore, MD 21228-5398 USA Laurel, MD 20723 USA Abstract The principle of memoization and examples of its Memo functions and memoization are well-known use in areas as varied as lo?; profammi2 v6, 6, 21, concepts in AI programming. They have been dis- functional programming 41 an natur anguage cussed since the Sixties and are ofien used as ezamples parsing [ll]have been described in the literature. In in introductory programming texts. However, the au- all of the case^ that we have reviewed, the use of tomation of memoization as a practical sofiware en- memoization was either built into in a special purpose gineering tool for AI systems has not received a de- computing engine (e.g., for rule-based deduction, or tailed treatment. This paper describes how automatic CFG parsing), or treated in a cursory way as an ex- memoization can be made viable on a large scale. It ample rather than taken seriously as a practical tech- points out advantages and uses of automatic memo- nique. The automation of function memoization as ization not previously described, identifies the com- a practical software engineering technique under hu- ponents of an automatic memoization facility, enu- man control has never received a detailed treatment. merates potential memoization failures, and presents In this paper, we report on our experience in develop- a publicly available memoization package (CLAMP) ing CLAMP, a practical automatic memoization pack- for the Lisp programming language.
    [Show full text]