The Mathematica Journal
Departments
Feature Articles
Columns
New Products
New Publications
Classifieds
Calendar
News Bulletins
Mailbox
Letters
FAQ
Write Us
About the Journal
Staff and Contributors
Submissions
Subscriptions
Advertising
Back Issues
Home
Download this Issue

End Notes

[1] The pioneering work in cellular automata was done by Stephen Wolfram [8]. [Back]

[2] The sum mod 2 of any number is the remainder that is left when one divides the number by two. Thus 3 mod 2 is 1. [Back]

[3] The neighborhoods are sorted in decreasing order of their representation as a base 2 numeral. [Back]

[4] It takes because the site and its relevant neighbors can take on different values, and each output is eight binary digits long. [Back]

[5] Sipper [9] gets around this problem through an approach known as cellular programming. We choose a different approach here. [Back]

[6] As discussed in more detail below, it is also possible to specify "translation rules" that, when used over and over again against expressions written in the grammar, transform those expressions into ones that the Mathematica kernel is able to simplify. The patterns produced by a grammar thus become executable programs capable of yielding a result such as a number or other value. [Back]

[7] When the price is 4, the amount logically supplied by an optimizing producer is 4 because the marginal cost at 4 is 4. Thus, total revenue will be 16, which is the price of 4 multiplied by the optimal quantity 4. But 16 is also the amount that it costs to produce 4 units. Hence, the producer is behaving optimally and making zero economic profit, which essentially defines equilibrium. [Back]

[8] is some arbitrary number that represents the price that will drive demand to zero. [Back]

[9] The utilities make extensive use of the names for patterns provided in the previously defined expressions automatonPattern and sitePattern. [Back]

[10] Increasing the size of these computation costs coupled with various forms of evolution favoring the more profitable behavior programs should result in more parsimonious programs. [Back]

[11] A functional programming style is one in which expressions that are capable of operating on other expressions are treated as "first class" data and used frequently as parts of surrounding expressions. [Back]

[12] The array has six columns rather than five because an additional column is needed to hold the actual behavior. [Back]

[13] The first program at each site remains constant, however. [Back]

[14] The combo function avoids a tricky issue of infinite recursion. When the first argument of combo bears a head of Function, combo yields that function applied to the second argument. Otherwise, combo just yields the first argument. Permitting the first argument to have a Function head and various expressions with the head of Slot as its argument eliminates a problem of infinite recursion that would otherwise occur. Suppose, for example, that a process of transformation on the expression recombination[none] should yield a pointer to an expression recombination[none]. If we then go grab the pointed to recombination[none] we set off an infinite recursion because, as known, recombination[none] is subject to transformation. We thus terminate the transformation process by giving the pointer a head of Slot and wrapping the pointer in a head of Function. We make sure not to have any transformations that operate on patterns with a head of Function. With the transformation process now complete, we use combo to apply the created Function expression to the object pointed to and resolve the reference. This method works so long as "terminal expressions" such as recombination[none] cannot appear inside of other evaluatable expressions. Thus, if the expression behavior[2] transformed to behavior[2], the expression behavior[behavior[2]] would be extremely difficult to handle. [Back]

[15] The transformation rules are separated into those that are position-independent and those that are position-dependent to minimize recomputation of rules for each of the blocks the MapIndexed function goes over. [Back]

[16] The HoldAll attribute must be used to prevent the replacement generation function from evaluating (once) before it is needed to create random expressions. Otherwise, all new sites would be the same. [Back]


Copyright © 2001 Wolfram Media, Inc. All rights reserved.

[Article Index][Prev Page][Next Page]