At OSCON, Ovid cited the four paradigms like this:
* Procedural
* Object-oriented
* Functional
* Logical
I've also seen this list in several other places. However, I think this mixes up its concepts a bit. There are really two orthogonal properties acting here: the abstraction style and the control style.
The abstraction style refers to how you break up the logic of your program. It falls into two categories:
* Procedural
* Object-oriented
The difference is what you put in name. In the procedural style, you put mappings (functions) or actions (procedures) into names. In the object-oriented style, you put things (objects) and messages (methods) into names.
The control style describes how the control flows through the program. It falls into three categories:
* Imperative
* Functional
* Logical
In the imperative style, you are instructing the program to do things, to manipulate the state of the world. In the functional style, you are instructing the program to compute things, to evaluate a very complicated mathematical function. In the logical style, you are instructing the program to find objects that satisfy a complex condition.
Here's a table of common languages:
Abstraction | Procedural | OO Control +---------------+------------ Imperative | C | C++, Java Functional | Scheme, ML | OCaml, Haskell, Lisp (under CLOS) Logical | Prolog | Curry