Referential transparency is a characteristic of the
functional programming paradigm.
Simply stated, referential transparency implies the following:
Given P(x) and x=y at one point in the program, then P(x) = P(y) througout the program.
Stated more generally: whenever x=y, a true property involving x will remain true after substituting y for all occurrences of x in the property.
If x = 2 and x + y > 5 then 2 + y > 5 if the referential transparency property holds.
However, side effects (changes in the state of a machine), which are common in imperative programming languages, violate referential transparency.
For instance, the following "function" violates referential transparency by changing the value of the global variable y:
Assume that referential transparency holds. Therefore, if z1 = z2 then f(z1) = f(z2). Suppose that z1=z2=y=0. Then the expression f(z1)==f(z2) should return true. But whichever side of the "==" is evaluated first will increment y, which will result in the other side being evaluated differently. Therefore, the referential transparency cannot hold.
y := y + 1;
f := y + x