The whole thing will remain completely deterministic, that was just a poor choice of words by Carlo.
Let's start from here. I noticed some confusion deriving from the use of the term "nondeterminism". Confusion is due to the fact that unfortunately -and strangely enough- there are at least two different uses of the concept of nondeterminacy in computer science. Nondeterministic finite automata and ND Turing machines are models in which the computation follows different branches at the same time. Every time a branch point is encountered, the machine "forks" in two different and parallel computations. This model of computation is sometimes called "angelic nondeterminacy", and clearly it's what you were thinking of (also because it's by far the most known).
A different use of "nondeterministic" have been introduced by Dijkstra in 1975. Dijkstra's nondeterminacy is based on guarded commands, that is, blocks of code activated by a condition. If more than one condition is met, only one of the blocks is randomly chosen and executed. This is called "demonic nondeterminacy". And this is the kind of nondeterminacy I am talking about.
There's a little explanation of how guarded commands work here:
http://en.wikipedia.org/wiki/Guarded_commandsThe interaction between different genes will go to hell as a side effect of the new system and I personally would sorely miss that, because it is such a powerful system and nothing of equivalnce is proposed for the new system.
This is completely false. Interaction between genes would be perfectly possible, using memory locations.
For example, reproduce and shoot one info particle to the son:
cond
*.nrg 6000 >
start
50 .repro store
1 100 store
stop
cond
*100 1 =
start
0 100 store
familyloc .shoot store
myfamily .shootval store
stop
This shows also the elegance of this system. If you want to do the same thing with the current system, you face a few problems. First of all, you have to know that gene 2 is executed right after gene 1, before any external action. Then, you may ask yourself, well, but is the shot created _before_ the son is deployed, or is it created _after_? In the first case, maybe the shot won't hit the son. If you want to be sure of the correct order of the actions, you have to put gene 2 before gene 1 in the dna. This makes you sure that the requested actions are performed in the correct order.
Both are working during mini-cycles, but when you look at the final result of the cycle, you see that bot moved 7 steps ahead. This is a simple example and can be accomplished in ways that are easier than the one proposed by Carlo. But I assume that there are things that can only be accomplished using Carlo's system and that's why I asked for an example of such a thing.
I think there isn't a single example like that you're asking for. You can always find a new way to mix up the results of different genes; you can make a mean or a sum or a complete overwrite of the different values falling in a same memory location, depending on the location; you can make possible to shoot two, three, or one hundred shots within a single cycle; deciding that if the shot is -2 or -1, then shootval is calculated as a mean, if it is >0 then there's an overwrite, and so on. You'd then have the problem of deciding how many shots you can shoot in a single cycle, because shooting 100 shots against the enemy in a single cycle wouldn't be fair. Etc. Then you'd have to do the same thing for every other sysvar or memory location. These solutions are possible, but cludgy, inelegant. When I designed the dna model, I made a mistake. I wanted a daemon system, like that described by Dijkstra, but I made it internally sequential. I thought it was right to have multiple genes activating at the same time. It's not. It's even worse because all the physical actions are taken after a complete cycle has been executed, so that some genes are aware of them (those which come before of the genes producing physical effects, because they will be executed again only in the next cycle) and some not (the genes coming after).
So, the advantages of the nondeterministic system are
1) It's elegant, coherent. Makes understanding DarwinBots much, much simpler. It's a known model.
2) Genes have immediate physical effect. Their order is not important anymore. If a gene which takes at the same time physical and non-physical actions has been executed, you are sure that both actions have been performed.
3) Genes don't cover reciprocally their actions. Each active gene has effect. From the point of view of evolution this is very important, because genes duplications will bring to existence new working genes, not just dead copies, ready to be turned in junk dna.
4) Behaviours will mix. A gene for shooting attack particles can duplicate and mutate in a gene for sending disturb values to the victim. Both will have effect, and effects will mix. The correct balance between the two actions can be reached duplicating further one of the two genes.
5) Time becomes an important factor. A gene duplication changes the power balance of genes inside the genome. Duplicating a gene means giving it more execution time, subtracting it from that of the other genes; more active genes allow more complex or balanced reactions, but at the expense of reaction times.
6) May introduce the new choice between fast'n'simple and complex'n'slow robots. Also specialization may become more probable, because specializing would mean becoming faster. For example (maybe an idea for the future) the sequence of actions needed to perform photosynthesis may slow down a predator too much to let it follow a prey, so that it has to choose between the two ways of feeding.