# Is everything in Mathematica ultimately stored as a rule?

My current understanding about Mathematica is that everything, at the lowest level, ends up as replacement rules.
First question: is this true?
Second question: does Mathematica "gloss over" these rules by representing them as functions? doesn't seem to be expressed as a rule.

Third question: does the by value/by reference question have any when you "pass" a value to a Mathematica function?

• Well, obviously a system based on rules only, would only be able to do endless expression rewritings, but not much more. Even if one can build such a model of computation consistently, this is not what we see in Mathematica. From the user's viewpoint, (many) built-in functions are terminals, because their actions are no longer governed by rules. For example, when Mathematica sees Sin[0.15], it calls the built-in numerical implementation of Sin to make a computation - at which point it arguably leaves the rule-based paradigm. And similarly for most other useful lower-level actions. – Leonid Shifrin Oct 22 '13 at 1:56
• I was tempted to edit your title: "Do rules rule?" But my nose is still bleeding as a result of a limerick. – Dr. belisarius Oct 22 '13 at 2:19
• Have a look at DownValues[f] that's where the rules are hiding in this case – ssch Oct 22 '13 at 2:25
• @GeorgeWolfe Your simple function is a rule. The only top-level (user-defined) functions in Mathematica which are not rules, AFAIK, are pure functions (defined using Function). – Leonid Shifrin Oct 22 '13 at 2:56
• @GeorgeWolfe But generally, rules seem to be the core paradigm of the Mathematica language - more fundamental than functional or structural or procedural ones. Roman Maeder directly admits this in his "Programming in Mathematica". – Leonid Shifrin Oct 22 '13 at 3:00

When you define a function f, you are (a) applying Set or SetDelayed to a pattern, (b) creating a rule, (c) associating the rule with a symbol (f), and (d) storing that in DownValues (usually).

FullForm[Hold[f[x_] := x^2]]
(* Hold[SetDelayed[f[Pattern[x, Blank[]]], Power[x, 2]]] *)

f[x_] := x^2
DownValues@f
(* {HoldPattern[f[x_]] :> x^2} *)


### First question: is it true that "everything in Mathematica is ultimately stored as a rule?"

No: for example 2 is not a rule. It's just 2. So not everything is a rule, just functions. Everything is an expression, ... some expressions (as a side-effect) create and store rules in DownValues.

### Second question: does Mathematica "gloss over" these rules by representing them as functions?

Yes and no. They give you a glossy shortcut for input:

f[x_] := x^2


instead of requiring you to write something like

AppendTo[DownValues[f], HoldPattern[f[x_]] :> x^2]


FullForm[f[x]]


This is not showing you the definition of the function f. It is showing you the result of applying f to x. See the following:

FullForm[f]
(* 4 *)


If you want to see the definition of f you should either use Information (which is glossy and not very useful) or DownValues which contains what you're after.

### Third question: does the by value/by reference question have any when you "pass" a value to a Mathematica function?

Work on the assumption that Mathematica is pretty smart "under the hood" about pass by value/ pass by reference.

• Also comments (* ... *) and Mathematica packages are not stored as rules. They are not even expressions. – Rolf Mertig Mar 4 '15 at 4:53