From Chris, on https://sourceforge.net/p/sbml/sbml-specifications/260/ :
We have a similar problem, we would like to be able to create an assignment rule like this:
TetR = piecewise(1, (IPTG==1) or (not (aTc==1) and (TetR==1)), 0)
This models the genetic toggle switch in a Binary fashion. Namely, if you add IPTG, you set TetR high, but when you remove IPTG, you continue to get TetR high due to the feedback in the assignment rule. Only once you set aTc high, does TetR go away.
This is currently illegal because it appears to be a recursive assignment rule. However, this does converge, but you only know this because you execute it and find that it does so. If you have this instead,
TetR = piecewise(1, (TetR==0), 0)
You get an oscillation. So, is this a modeling error or a validation error. You can cause the same problem when simulating events,
Trigger TetR == 0
Assignment TetR = 1
Trigger TetR == 1
Assignment TetR = 0
This will also bring simulation to its knees, but this is not illegal SBML.
So, I guess what I'm saying is that if we allow recursive function definitions, and they can only be proven to terminate by simulation, this is not any different than what we are already allowed to do with 0 delay events and what we perhaps SHOULD be allowed to do with assignment rules that can reference themselves.