Known bug (though it would have been nice if you had received a warning, I agree).
The issue is that the evaluation works depth-first, so that it first replaces e.g.
D_{x}{A_{y}} -> D_{x}{ Ay }
and then at the next step it uses the fact that Ay
has not been declared to depend on x
to get rid of the term altogether.
These kind of things should evaluate 'in the opposite direction' but I have not yet found the time to implement that.
I thought things should work if you declare
{Ax, Ay, Az}::Depends(D{#});
and then change rl2
so that it refers to Ax
instead of A_{x}
and run rl2
as
evaluate(ex, rl1);
substitute(ex, rl2);
But that doesn't work, for reasons I don't know (yet).