Formal representation of algorithm using recursive algebraic data types
You should get acquainted with inductive definitions.

Instead of saying that $Data$ is recursively defined, say that it is a set constructed inductively by:


$(0,i) \in Data$ for every $i \in \mathbb{Z}$,
$(1,d) \in Data$ for every $d \in Data$,
$(2,d) \in Data$ for every $d \in Data$.


Another way to say the same thing is that $Data$ is the smallest set such that
$$Data = \lbrace (0,i) \mid i \in \mathbb{Z} \rbrace \cup
\lbrace (1,d) \mid d \in Data \rbrace \cup
\lbrace (2,d) \mid d \in Data \rbrace.$$
Then remark that you use abbreviations $\mathcal{A} = 0$, $\mathcal{B} = 1$, $\mathcal{C} = 2$. Mathematicians are not used to introduction of basic symbols or tags, unless they are considering polynomials in a "variable" $X$ (which they really should call "symbol").

But it may be better not to cater to old-fashioned traditions of mathematicians. We should push them into the 21st century and teach them some math which they think of as "computer science". What is wrong with assuming your reader knows what an inductive data type is?

One word of warning: Haskell does not have inductive datatypes, but rather coindcutive data types. If you define the type in Haskell you will also get infinite elements of the form B (B (C (B ....))). There is just no way to get this right in Haskell. ML has proper datatypes.