[I continue the habit to use sometimes the drafts I write and to extract from them and process a bit those parts which may be of interest to any known or unknown fellow thinker, tinker, hacker.
This is the first part, there will be a second one.]
See also: FAQ: chemlambda in real and virtual worlds
1. Can I play with chemlambda like in the demos?
YES, if you go at https://github.com/chorasimilarity/chemlambda-gui/tree/gh-pages/dynamic , then you’ll find everything needed to play with chemlambda.
What you need:
- scripts like moving_random_metabo.sh, which calls
- the main program which is check_1_mov2_rand_metabo.awk
- you need initial molecules, which are in the files with the extension .mol. Read here about the mol format (1), (2). It’s just a list of nodes and their ports.
- You shall need also the file firstpart.txt.
Then figure it out:
- bash moving_random_metabo.sh asks you to type the name of a mol file, say lalala.mol
- it produces lalala.html which you can see in the browser, as a d3.js animation.
In the awk script you have at the beginning the variables: metabo (which decides the color of the new nodes; periodically, with period metabo, the color of the new nodes is turned to #222 or it is left unchanged, in order to help visualize the flow and replenishment of the new nodes in the molecule, i.e. the metabolism of the molecule) and cycount which is the maximum number of steps in the main cycles (if you expect that the computation stops quick, or if on the contrary, you suspect it will never stop, then take cycount=100, if you are sure the computation will stop, but perhaps after more than 100 steps, then take cycount=1000 for example).
The main cycle starts at line 931.
At about the line 900 there is a function nextval()… where there is a piece “return 3000 + (5*step“, now you can modify 3000 to something else to decide the initial time before the animation starts, and 5 to something like 30 or bigger, if you want to look at the result in firefox or if generally the browser has problems with rendering.
For the list of moves and more details see the page of moves. Go down to that page to see a list of articles.
2. Is chemlambda something fixed or it changes? Can I change it? What can I do if I want to tinker with it, just for fun?
It changes. First there was “graphic lambda calculus”, then there was chemlambda without the FOE node and moves, now after many experiments there is THIS chemlambda.
You can change it any way you want (and be polite to cite my version and to notice me somehow, preferably by posting something in a public place).
If you have real programming skills, not like me (I’m just a mathematician) then you can take the awk script and:
- transform it into a js script, instead of the actual system
- make it quicker (presently there is a preset of 5ms which decides the speed of the animation, but this may give problems to many browsers; why? I have no idea, but it may be a trivial or a clever fix to that)
- add a molecule builder UI
- make a game out of it
- make an app
- make a script which converts lambda terms to chemlambda molecules, according to the algorithm from here.
These are immediately useful things to do. There are others too, see next question.
3. What does the script about chemlambda?
The script implements a model of computation based on chemlambda.
So, chemlambda is a purely local graph rewrite system (it is a list of patterns with up to 4 nodes which are replaced by other patterns, perhaps according to rules which involve a condition which can be verified by checking maybe yet another N (a priori fixed, small) links and nodes).
It does not compute by itself, you have to add an algorithm of reductions, which says how to use the graph rewrites, aka the moves.
In the script is used the following algorithm, called in previous post the “stupid” one, because it is really the most simple: after the mol file is converted into a graph (given as nodes and links arrays), after the head of the html file is written, then the algorithm enters a cycle. The structure of this cycle is the following:
- look for patterns to change, in the order of the graph rewrites priority. (What’s this priority? It may happen that there are nodes or links which are part of two distinct, but overlapping patterns for graph rewrites. This results into a conflict: which move to apply? By close examplnation of the moves, there is a order of looking for the moves which eliminates the conflicts if we look first at the move FO-FOE, then at the other DIST moves, then at BETA (i.e. A-L) move and FAN-IN (i.e. FI-FOE), then at the PRUNING moves, and each time we find a pattern we put the respective move in a list of proposed moves and we block the nodes so they are not available for being part of other patterns during the search of patterns )
- do the proposed moves (in the awk script this means to do the moves in the sense of the graph data variables from the script and in the same time, to write in the html file what you just did, in a format intelligible in d3.js)
- there may be lots of Arrow nodes which appear, and in order to eliminate as many as possible there is an Arrow cycle (see the moves page) which eliminates all Arrow nodes which can be eliminated by COMB moves. (Same thing apply here, you have to write in the html file what you did with the graph during that internal cycle)
This is the stupid deterministic algorithm.
There is a random variant of it, which is exactly what the awk script does.
Whenever a pattern is identified, there is a coin flipped, and with probability about 50% (see further a small detail) the move goes to the list of proposed moves and the nodes are blocked, or not.
In this way the priority of moves is made much less important.
Small detail: there are two kinds of moves, those who increase the number of nodes (DIST) and the others, who decrease the number of nodes (Arrow not taken into consideration). The small detail is that, after each step of the cycle, the probabilities of the moves are slightly modified so that if in the cycle there has been more DIST moves than the others then the probability of DIST moves decrease, or else if there has been less DIST moves than the others then the probability of DIST move increases in the next cycle.
Why randomness: is a cheap substitute, in this stupid reduction version, for asynchronous.
4. How can I seriously change the chemlambda reduction algorithm?
By changing from “stupid” to more interesting, it’s up to you. What about bringing into the game Node.js? Know why? because if you look at a mol file, you notice that if you split the file in ten pieces, then each of them is again a mol file.