For any U that contains A, you can rewrite it to U=U’(A).
...In many different ways. For example, you could rewrite it to a U’ that ignores its argument and just repeats the source code of U. Or if U contains one original copy of A and one slightly tweaked but logically equivalent copy, your rewrite might pick up on one but not the other, so you end up defecting in the Prisoner’s Dilemma against someone equivalent to yourself. To find the “one true rewrite” from U to U’, you’ll need the sort of math that we’re developing :-)
Also, do you mean U()=U’(A) (dependence on source code) or U()=U’(A()) (dependence on return value)? There’s a subtle difference, and the form U()=U’(A) is much harder to reason about, because U’(X) could do all sorts of silly things when X!=A and still stay equivalent to U when X=A.
...In many different ways. For example, you could rewrite it to a U’ that ignores its argument and just repeats the source code of U. Or if U contains one original copy of A and one slightly tweaked but logically equivalent copy, your rewrite might pick up on one but not the other, so you end up defecting in the Prisoner’s Dilemma against someone equivalent to yourself. To find the “one true rewrite” from U to U’, you’ll need the sort of math that we’re developing :-)
Also, do you mean U()=U’(A) (dependence on source code) or U()=U’(A()) (dependence on return value)? There’s a subtle difference, and the form U()=U’(A) is much harder to reason about, because U’(X) could do all sorts of silly things when X!=A and still stay equivalent to U when X=A.