You have now taken CSE150, providing familiarity
with Lisp and neural networks. Prolog is
considered a central AI language by many,
especially in Japan and Europe. Java has
many obvious similarities with Lisp (interpretation,
garbage collection). Peter Norvig has compared
Python with Lisp from his perspective as an AI
programmer (
http://www.norvig.com/python-lisp.html
What special needs does AI have of a programming
language? What language do you think best accomplishes these objectives?
Traditional software engineering practice recommends software design specifications which are progressively refined, top-down, until every procedure module stub has been implemented. AI programmers, on the other hand, are often asked to hack towards a solution, with preliminary results helping to shape subsequent coding. Sometimes this is called rapid prototyping, but I like to think of it as "circumscribing ignorance," moving from what you know how to do towards what you don't.
Many of you mentioned the fact that the programmer's time and effort becomes an important criterion in AI applications. [bkramer] [crocha] [h5lee] [jdammeie] [ssamat]
The interactive relationship provided by interpretted languages like Lisp and Python help to provide very "convenient debuggers." [jdammeie]
Prolog is obviously one of the most common languages mentioned in the context of AI, and one that many (15) of you also mentioned. The fact that it provides depth-first search with backtracking as a primitive functionality is one key advantage. [beghbali]
These same facilities support the pattern matching capabilities that are also often central in AI. [chaisson] [fychan] [goofy] [jsheppar] [mchaisso]
Another interesting aspect of Prolog is how it semantics can seen as having both a procedural and a declarative interpretation. Several of you suggested that AI often is more interested in stating what (state of the representation should obtain), vs. how to proceed. [beghbali] [ckharris] [dkashirs1] [h5lee] [jbowen]
PROLOG therefore provides a nice resolution to a classic debate within AI, the "procedural/declarative controversy."
The fact that Fortran is a particularly bad language in which to explore self-modification was recognized early [Friedberg58] [chaisson]
Lisp seems almost unique in the natural way it can treat program source as either code or data. Its flexibility to decide whether a piece of code need only be interpretted, or is worth the effort of compilation can also be convenient.
In fact, many languages are flexible enough to support their own self-replication, in the sense of quines, code able to reproduce a copy of itself.
Python provides a more restricted but similar functionality with
its re module.
As AI programs become used for remotely executing, autonomous agents, the ability for them inspect their own state in this deep way may become more important. [beghbali]
"Self-aware" is an overstatement for such facilities, but people like Brian C. Smith have thought deeply about just how a language like Lisp can be extended (in a language called 4Lisp) to provide the sort of self-referential capacities that may be be required for sentient programs. [Smith, B.C., "Reflection and semantics in LISP", POPL84, pp 23-35]
The projects required for this class, and even as part of the undergraduate program in CSE, are rarely large enough to require multiple software developers. As you work on larger programs, and as modern software development involves people across multiple institutions, facilities such as Java's object naming conventions are likely to become increasingly important. [bpancho]
It also not always necessary to pick any single programming language. C programmers are used to mixing object modules that may come from different languages. Lisp's foreign function facility allows computationally-intensive subroutines (eg, neural network calculations) to be written efficiently, then "glued" together within more flexible code.
Given the way that modern AI requires mixtures of symbolic programming (where passing complex data structures is as simple as a single pointer) and sub-symbolic capacities (like NNet learning), the ability to mix languages with differing strengths is especially useful.
Scripting languages like Python and Perl obviously allow arbitrary shell commands.
The Python communitity has also made a point of developing very efficient libraries of computationally intensive routines.
p-code, decades before Java made sense!)
[beghbali]