Modifying Built-in Functions

The Wolfram Language allows you to define transformation rules for any expression. You can define such rules not only for functions that you add to the Wolfram Language, but also for intrinsic functions that are already built into the Wolfram Language. As a result, you can enhance, or modify, the features of built-in Wolfram Language functions.

This capability is powerful, but potentially dangerous. The Wolfram Language will always follow the rules you give it. This means that if the rules you give are incorrect, then the Wolfram Language will give you incorrect answers.

To avoid the possibility of changing built-in functions by mistake, the Wolfram Language "protects" all built-in functions from redefinition. If you want to give a definition for a built-in function, you have to remove the protection first. After you give the definition, you should usually restore the protection, to prevent future mistakes.

Protection for functions.

Built-in functions are usually "protected", so you cannot redefine them:

Log[7]=2

This removes protection for (RefLink[Log, paclet:ref/Log]):

Unprotect[Log]

Now you can give your own definitions for (RefLink[Log, paclet:ref/Log]). This particular definition is not mathematically correct, but the Wolfram Language will still allow you to give it:

Log[7]=2

The Wolfram Language will use your definitions whenever it can, whether they are mathematically correct or not:

Log[7]+Log[3]

This removes the incorrect definition for (RefLink[Log, paclet:ref/Log]):

Log[7]=.

This restores the protection for (RefLink[Log, paclet:ref/Log]):

Protect[Log]

Definitions you give can override built-in features of the Wolfram Language. In general, the Wolfram Language tries to use your definitions before it uses built-in definitions.

The rules that are built into the Wolfram Language are intended to be appropriate for the broadest range of calculations. In specific cases, however, you may not like what the built-in rules do. In such cases, you can give your own rules to override the ones that are built in.

There is a built-in rule for simplifying (RefLink[Exp, paclet:ref/Exp])[(RefLink[Log, paclet:ref/Log])[expr]]:

Exp[Log[y]]

You can give your own rule for (RefLink[Exp, paclet:ref/Exp])[(RefLink[Log, paclet:ref/Log])[expr]], overriding the built-in rule:

(Unprotect[Exp];Exp[Log[expr_]]:=explog[expr];Protect[Exp];)

Now your rule is used, rather than the built-in one:

Exp[Log[y]]