Paradigms of Artificial Intelligence Programming (1992)
github.com
github.com
Old AI is today's bleeding edge computer engineering. There is an enourmous amount of free lunches for computer engineers and software startups in the old school artificial intelligence.
* modern SAT solver performance is impressive. They can solve huge problems.
* Writing a complex systems configurator with Prolog or Datalog can be like magic.
* Expert systems. There has never been so much use for them than today. Whenever you see expensive systems utilizing complex mess of "business logic" and expensive consultants, you should know there is a better way.
(I use SAT-solvers to partially initialize neural network parameters).
- The Pragmatic Programmer -
This changed my life when I started programming 20 years ago. Most of the practices are now common, but it was almost radical back then.
- Designing Data Intensive Applications
This is so well written, so elegantly fundamental. It's an absolute pleasure, even if I don't really refer to it in practice.
- Structure and Interpretation of Computer Programs
In many ways, the MIT version of PAIP. Its elegance complements the pragmatism of PAIP well.
- The unicorn project
My number 5 book varies often, because I haven't found many books that reach the writing quality of the other 4. This is a business novel, but it really solidified a lot of concepts for me: lean, queues, theory of constraints, what devops is about, working as a programmer in a business.
* Concepts, Techniques and Models of Computer Programming: https://www.info.ucl.ac.be/~pvr/book.html
* The Art of Prolog: https://www.dropbox.com/s/2umr9ouz0jdelio/1407.pdf?dl=1
* Probabilistic Models of Cognition: https://probmods.org
Something that merges logic, types and proofs, perhaps yet to be written. Some good preliminary material:
* Program = Proof: https://www.lix.polytechnique.fr/Labo/Samuel.Mimram/teaching...
* Concrete Semantics: http://concrete-semantics.org
* The Hitchhiker’s Guide to Logical Verification: https://raw.githubusercontent.com/blanchette/logical_verific...
* Programming Language Foundations in Agda: https://plfa.github.io
* Logic and Computation Intertwined: https://cs.uwaterloo.ca/~plragde/flaneries/LACI/
* Software Foundations: https://softwarefoundations.cis.upenn.edu/
Prolog is one of those things that has alluded me all this time. Mostly I don't think I've had an application for it, and, bluntly, at least for me, I need to have a "real" application to solve to best learn something. Seeing the "animal" program repeated over and over and over again was never any help.
In hindsight, maybe it would have been appropriate in an email messaging application I did long ago. It's message routing workflow was not inscrutable, but certainly difficult (and it didn't help that the route could split, sending the message to more than one place with their own workflows -- that was fun).
I've done a bunch with rule engines (and the message routing was done with an ad hoc one), but less so with inferencing.
Maybe this book will give me some insight to explore further. It's always one of those things that sort of nags the back of my brain that I don't quite grok it.
The Craft of Prolog is also very much worth looking into.
A related approach is ASP, which combines SAT with logic programming. These are the two canonical books:
* Answer Set Programming: https://www.cs.utexas.edu/users/vl/teaching/378/ASP.pdf
* Answer Set Solving in Practice: https://potassco.org/book
In certain cases, you know what the neural network should do, for certain inputs, and you have a quite clear idea how each component of the network would solve this, and this should be doable, and with a bit of work you could also construct the parameters by hand, such that it works at least for non-noisy constructed toy input data.
Actually, I think for more complex tasks, having such intuition would anyway be a good idea.
Now, you could use a SAT solver such that it does the work mostly for you. You formulate some constructed inputs/outputs, maybe some other constraints, and let it solve for the parameters. This would be a good parameter starting point for real world data. And if the SAT solver fails to find any solution, maybe your neural network is actually not powerful enough.
A great opportunity for the reader to expand them.
I've seen for example the Scheme implementation from PAIP expanded and integrated into a CMS.
There is some talk on this thread about good old fashioned symbolic AI. I have mixed feelings about this. I am currently working for an all-in Common Lisp + GOFAI company, but most of my best successes in my career involved neural networks, and later deep learning.
I think we need a new hybrid approach but it is above my skill level to know what that would be. I keep hoping to see some new research and new paradigms.
Homotopy type theory tells us that semantic information from a symbolic logic can also be represented by the topology of diagrams. But this is a two way relationship: the topological structure of diagrams also corresponds to some synthetic type theory.
The conjecture is that the topology of, eg, word2vec point clouds will correspond to some synthetic type theory describing the data — and this is bolstered by recent advancements in ML: Facebook translating by aligning embedding geometries, data covering models, etc.
I’m personally working on the problem of translating types into diagrams stored as matrices, in the hope that building one direction will give insights into the other. (Again, because equivalence relationships are symmetric.)
https://en.wikipedia.org/wiki/Diagram_(category_theory)
And for some context, a brief talk by Michael Shulman.
The kind of symbolic AI described in this book went through several cycles of hype and disappointment to the point where many think it is obsolete. People often do it connect recent breakthroughs in SAT and SMT solvers with this history and for that matter production rules engines are dramatically better than they were in the 1980s but they’ve never made a breakthrough into general purpose use.
Rule-based expert systems (as opposed to SAT, etc) based on Symbolic AI also have the issue that for non-trivial problems, coding the rules themselves usually requires programming expertise in addition to the domain knowledge required to capture the business logic. Things have improved a lot since the 80s, but applications remain fairly niche.
Almost any financial institution has a copy of IBM iLOG in there somewhere implementing policy in terms of production rules.
Some of the most interesting systems today combine ideas from machine learning with ideas from AI search. For instance there are many game playing programs like AlphaGo that use
https://en.wikipedia.org/wiki/Monte_Carlo_tree_search
which runs a large number of games to the end rather than searching the next few moves exhaustively. Using a machine learning model to play the game for the playouts but sampling a large number of moves with A.I. search turns out to be a winning strategy.
My AI prof joked, I think, that it was "things that don't work yet" - clearly only a humanlike AI could do OCR... until it started working, etc.
But I actually think your hypothetically proposed definition fits the history even better.
That said, seems most of what is important in today's code is the ability to drive a gpu. Don't know why that couldn't be done from a lisp.
At least my take on it is: what if you simulate a domain (physics being the most tractable) then can you train using differentials of the model itself and not just differentiating the internal neuron estimators?
Lots of open questions... like what's the driving force that asks for an effect that calls for differentiating the model? We kind of expect the training process to just recreate everything internally.
Now it has me thinking about "coprocessors"... a lot of the domain-specific math is given to the NN as input features, but what if the NN could select inputs to those algorithm? That would give the NN the ability to speculate. Of course you'd need to also differentiate those algorithms.
Now that I'm thinking about it, I guess this is just another activation function, just one that is domain-specific. Are there approaches that use eclectic activation functions? Like in each layer 1-10 is one activation function, 11-20 is another, and then you finish off with tanh or relu or some other genetic activation function.
https://en.wikipedia.org/wiki/Macsyma
Similar to the way Python today is a high level language used for numerical computing today. Lisp is certainly more than capable of this role, but the fallout from the AI winter killed Lisp's reputation and popularity, leading to other languages filling those niches.
http://norvig.com/Lisp-retro.html
The next to last section in this, What Lessons are in PAIP? comprises 52 numbered sentences of advice, cross-referenced to fuller explanations in the book. Many (most?) of them apply to any programming or software engineering, not specifically AI or Lisp.
Do I need to learn eMacs to get close to a “modern lisp” programming environment?
there’s portacle which combines emacs with a lisp environment
I started working through the book, but did not feel like using Common Lisp. Instead I used GNU Guile. I am not very far in the book yet, but so far I was able to translate between Common Lisp and Scheme easily.
So for me the way to set things up was to install GNU Guile. I did that via GNU Guix package manager. However, GNU Guix can also install SBCL, so that you could use Common Lisp as the book does. SBCL is also in many distros' repositories.
you might find some variances later on. also elisp doesn’t have as nice a debugging environment as SLIME so I’d honestly recommend just setting up common lisp
Are you referring to the IF expression or something different?
It's something like:
(defmacro elisp-if (expr then &rest elses)
`(cond (,expr ,then) (t ,@elses)))
Whereas the regular if is like: (defmacro cl-if (expr then &optional else)
`(cond (,expr ,then) (t ,else)))
In a book that uses Common Lisp, you shouldn't see an if-form that isn't Elisp-compatible.What I do not like about CL is probably one of the "wars" fought in computer programming: I do not like, that I have to use funcall, instead of simply wrapping with parens. I do not like, that variables and functions are in separate namespaces. However, if going through the book using Scheme gets too complicated, these are not things I cannot get over.
EDIT: I probably also do not like the less emphasis on pure functions in CL. I think while solving some exercises I already did some things, so that I could solve without mutating global state. But it's been a while since I last continued working through the book, so I am not so sure. I get that sometimes a simple side-effect can be practical, but this is my free time occupation and I get joy from doing things in clean ways. Nevertheless, Common Lisp is one of the languages, which I wish I could actually work in (like on the job, not in my free time), when I compare it to things like Python, JavaScript and so on. At least it is in the family of languages I enjoy using.
It's a distribution of emacs together with a Lisp compiler, emacs add-ons like SLIME, etc.
check out susam's guide
For Vim: https://susam.net/blog/lisp-in-vim.html
For Emacs: https://github.com/susam/emacs4cl
The SBCL implementation is very good, consider getting a binary directly from their site if your distro's version is out of date http://www.sbcl.org/
I disagree with a sibling comment that this book expects you to be comfortable with Lisp; the first chapter is literally an introduction, and the next two chapters cover most of the basics a working programmer should expect to cover quickly with chapter 3 being a handy reference to look back on for a lot of things. If you're new to programming or find the intro too fast, sure, look at other resources, but it's not too bad to just dive in. The main supplement is to figure out, with your editor of choice, how to send blocks of Lisp code to the Lisp prompt so that you can type and edit with an editor and not have to do everything directly on the prompt line.
https://web.archive.org/web/19990117034445/http://www-pu.inf...
p.s.
Actually applying Perlis's epigrams to epigrams, we inevitably reach the conclusion that epigrams stifle thought yet #125 still holds:
#121 permits meta-epigrams.
proposed: Epigrams optimize expression.
#21: optimization hinders evolution
q.e.d. epigrams stifle evolution of thought.
[Alan Perlis: https://en.wikipedia.org/wiki/Alan_Perlis]
"You think you know when you learn, are more sure when you can write, even more when you can teach, but certain when you can program. —Alan Perlis "
So I was curious as to who is Alan Perlis. Sorry, assumed others had also accessed the pdf :{}
http://norvig.com/Lisp-retro.html
The last section, "What did PAIP Accomplish?" summarizes his view on PAIPs legacy.
It's even no-cost. The book is available for free in digital forms.