This is an open-source repository for the book Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp by Peter Norvig (1992), and the code contained therein. The copyright has reverted to the author, who has shared it here under MIT license. On the list of most influential books for programmers. As seen on TV. See also: errata, comments, retrospective.
The book is available in these formats:
- pdf: see releases for a scanned version
- text: PAIP.txt (from OCR'ing the scanned pdf, containing many errors)
- epub: see releases for a cleaned up version downloaded from Safari (much cleaner than the scanned versions)
- and
chapter?.md
markdown files:
- Paradigms of Artificial Intelligence Programming
- Part I: Introduction to Common Lisp
- Part II: Early AI Programs
- Part III: Tools and Techniques
- Part IV: Advanced AI Programs
- Part V: The Rest of Lisp
The Lisp code files are listed here:
CH | Filename | Description |
---|---|---|
- | examples.lisp | A list of example inputs taken from the book |
- | tutor.lisp | An interpreter for running the examples |
- | auxfns.lisp | Auxiliary functions; load this before anything else |
1 | intro.lisp | A few simple definitions |
2 | simple.lisp | Random sentence generator (two versions) |
3 | overview.lisp | 14 versions of LENGTH and other examples |
4 | gps1.lisp | Simple version of General Problem Solver |
4 | gps.lisp | Final version of General Problem Solver |
5 | eliza1.lisp | Basic version of Eliza program |
5 | eliza.lisp | Eliza with more rules; different reader |
6 | patmatch.lisp | Pattern Matching Utility |
6 | eliza-pm.lisp | Version of Eliza using utilities |
6 | search.lisp | Search Utility |
6 | gps-srch.lisp | Version of GPS using the search utility |
7 | student.lisp | The Student Program |
8 | macsyma.lisp | The Macsyma Program |
8 | macsymar.lisp | Simplification and integration rules for Macsyma |
9-10 | auxfns.lisp | Auxiliary functions |
11 | unify.lisp | Unification functions |
11 | prolog1.lisp | First version of Prolog interpreter |
11 | prolog.lisp | Final version of Prolog interpreter |
12 | prologc1.lisp | First version of Prolog compiler |
12 | prologc2.lisp | Second version of Prolog compiler |
12 | prologc.lisp | Final version of Prolog compiler |
12 | prologcp.lisp | Primitives for Prolog compiler |
13 | clos.lisp | Some object-oriented and CLOS code |
14 | krep1.lisp | Knowledge Representation code: first version |
14 | krep2.lisp | Knowledge Representation code with conjunctions |
14 | krep.lisp | Final KR code: worlds and attached functions |
15 | cmacsyma.lisp | Efficient Macsyma with canonical form |
16 | mycin.lisp | The Emycin expert system shell |
16 | mycin-r.lisp | Some rules for a medical application of emycin |
17 | waltz.lisp | A Line-Labeling program using the Waltz algorithm |
18 | othello.lisp | The Othello playing program and some strategies |
18 | othello2.lisp | Additional strategies for Othello |
18 | edge-tab.lisp | Edge table for Iago strategy |
19 | syntax1.lisp | Syntactic Parser |
19 | syntax2.lisp | Syntactic Parser with semantics |
19 | syntax3.lisp | Syntactic Parser with semantics and preferences |
20 | unifgram.lisp | Unification Parser |
21 | grammar.lisp | Comprehensive grammar of English |
21 | lexicon.lisp | Sample Lexicon of English |
22 | interp1.lisp | Scheme interpreter, including version with macros |
22 | interp2.lisp | A tail recursive Scheme interpreter |
22 | interp3.lisp | A Scheme interpreter that handles call/cc |
23 | compile1.lisp | Simple Scheme compiler |
23 | compile2.lisp | Compiler with tail recursion and primitives |
23 | compile3.lisp | Compiler with peephole optimizer |
23 | compopt.lisp | Peephole optimizers for compile3.lisp |
There is no single "application" to run. Rather, there is a collection of source code files, duplicating the code in the book. You can read and/or run whatever you like. Lisp is an interactive language, and you will need to interact with the code to get benefit from it. Some hints:
- You will need a Common Lisp interpreter/compiler/environment. Here's a discussion of the options.
- You will always need
(load "auxfns.lisp")
. - You will need
(requires "
file")
, for the various instances of file that you want to use. (Ifrequires
does not work properly on your system you may have to alter its definition, inauxfns.lisp
. - The function
do-examples
, which takes as an argument either:all
or a chapter number or a list of chapter numbers, can be used to see examples of the use of various functions. For example,(do-examples 1)
shows the examples from chapter 1. Access this by doing(requires "examples")
.
- I wrote a retrospective on the book in 2002.
- There is a nice Python version of the code, by Daniel Connelly at Georgia Tech, supervised by Ashok Goel.