Programming in the Symbolics Connectionist Supercomputer Environment |
|||
Symbolics Links: Symbolic
Parallel Multiprocessing Suspended
Construction Janus Machines: c16 c4 |
Shane Forsythe on Symbolics Programming To begin a discussion of what Symbolics Linux is, it is best to first understand some of the reasons that make it desirable. An eloquent statement to start from is given by Eric R. Jeschke, "Symbolic languages relieve the programmer from resource management considerations that are required for traditional programming languages, such as memory and process management" (Doctorial Thesis on Daisy/DSI, Indiana University). That is a higher level definition that we will come back to. In simpler terms, what do we mean by "Symbolic" ? Computations can be considered to fall into one of two categories, Numerical or Symbolic. Numerical calculations are highly arithmetic and what most people would consider as 'computing'. Symbolic computations are more focused on the rearrangement and classification of data, i.e. sorting, searching, database management. It is concerned with manipulating symbols (data structures, lists, etc) based on a set of rules, without regard to the symbols meaning. Those rules are referred to as heuristics. The term algorithm, refers to a given set of rules one can follow to find 'the answer'. Heuristics are more a collection of "rule of thumb" type logic. One can define what is 'probably' the best choice to make, but there is no guarantee. A classic example of this is playing a game of chess. From the beginning one cannot prescribe to you a set number of moves to make that will guarantee that you win. However you begin to build some 'common sense' rules aside from the basic rules of the game. Such as "it is better to lose a pawn than a named piece", "don't use the king as your primary offense piece", etc, etc .... the more 'rules' you collect and 'learn' , the better you will play. AI relies heavily on the use of heuristics. At the most advanced level, it will be able to 'learn' or postulate its own rules ... realize that one of its rules is wrong ... or choose the most applicable rule if a conflicting answer is given. Two other terms will be important to understand as well to discuss the benefits of Symbolic systems, Recursion and Suspended-Construction. Recursion is a classical type of calculation that every programmer is taught. A simple definition of recursion is that the definition of a function contains the function itself. To solve a problem, a recursive function has to have a 'terminating condition' that tells it when to stop recursing. It can be easy to not properly establish the terminating condition, and create a function that gets trapped in an endless loop and breaks your program. Here is an example. The Factorial of a number, is the product of all integers up to and including that number: F(4)=4*3*2*1. Another way to write the definition is: The Factorial of a number is that number times the Factorial of that number minus 1 F(4) = 4 * F(3) The code for such a recursive function would look something like this: function f( n ) if ( n = 1 ) then answer= 1 return answer else answer = f( n -1) end To calculate the answer, the program/computer must loop through the function several times. Looking somewhat like this: f(4)= 4* f(3) f(3) = 3 * f(2) f(2)= 2 * f(1) f(1)= 1 The key factor is that the program/computer must keep track of the 'state' of each line (loop) of calculation. An anology would be if I asked you to calcuate the answer similarly, BUT, you had to use a fresh sheet of paper for each recursion through the function, keeping track of every sheet of paper, and filling in (back propagating) the answer when you finally reduced it to 1. That would not be so hard to do using the above example of f(4), but if I asked for f(13,245), you would probably refuse to do so. The 'sheets of paper' are analogous to the memory (and other types of 'resources') available to the computer. Generally , programmers are taught to not use this type of function, because it has a high 'overhead' and it is not efficient to calculate using a single cpu. If we have many, many processors available to us, things change. The second term I listed was suspended-construction, and relates to how to calculate a recursive function on a parallel machine efficiently. Typically, the code in a program executes sequentially through each instruction, waiting for each instruction to complete before moving on to the next. Functions are evaluated immediately and a definite concrete answer is returned. So given a=4 b=5 F= a + b what is the value of F ???? The answer given by most modern languages and computers is of course 9. But what if we did not really need to know the answer , 9, just yet ... but that we wanted the program to 'know' that F = a + b. (Suppose the value of "a" changes from the time we assign the function till the time when we need to know the answer ... ) In Daisy, a language we are using and exploring, suspended-construction is allowed. The function is not evaluated when it is created ... only when it is 'probed' (asked for the answer). In a more traditional programming language, I would say F is assigned the value of a + b. In Daisy, we create a suspension or suspended-construction. Every suspension is a separate process that is spawned off from the original program. If multiple processors/nodes are available they can be utilized to split up the workload. Combining recursive function, suspended-construction, and a true parallel architecture we will then begin to manipulate 'clouds of probabilities'. |
||
© Copyright 2000 PATMOS International
Corporation, All Rights Reserved
|
|||