# Markov algorithm

A Markov algorithm, names after the Soviet mathematician Andrey Markov, Jr., is a string rewriting system that uses replacement rules to operate on a string of symbols. Markov algorithms have been shown to be Turing complete. They are also known in Russian as Normal Algorithms of Markov (нормальные алгоритмы Маркова or НАМ). Existing implementations of Markov algorithms act as an esoteric language.

At least one high-level programming language, Refal, is based on generalizing Markov algorithms.

## Description

The process of applying the normal algorithm to an arbitrary string $V$ in the alphabet of this algorithm is a discrete sequence of elementary steps, consisting of the following. Let’s assume that $V'$ is the word obtained in the previous step of the algorithm (or the original word $V$ , if the current step is the first). If of the substitution formulas there is no left-hand side which is included in the $V'$ , then the algorithm terminates, and the result of its work is considered to be the string $V'$ . Otherwise, the first of the substitution formulae whose left sides are included in $V'$ is selected. If the substitution formula is of the form $L\to \cdot D$ , then out of all of possible representations of the string $V'$ of the form $RLS$ (where $R$ and $S$ are arbitrary strings) the one with the shortest $R$ is chosen. Then the algorithm terminates and the result of its work is considered to be $RDS$ . However, if this substitution formula is of the form $L\to D$ , then out of all of the possible representations of the string $V'$ of the form of $RLS$ the one with the shortest $R$ is chosen, after which the string $RDS$ is considered to be the result of the current step, subject to further processing in the next step.

For example, the process of applying the algorithm described above to the word $|*||$ results in the sequence of words $|b*|$ , $ba|*|$ , $a|*|$ , $a|b*$ , $aba|*$ , $baa|*$ , $aa|*$ , $aa|c$ , $aac$ , $ac|$ and $c||$ , after which the algorithm stops with the result $||$ .

For other examples, see below.

Any normal algorithm is equivalent to some Turing machine, and vice versa any Turing machine is equivalent to some normal algorithm. A version of the Church-Turing thesis formulated in relation to the normal algorithm is called the "principle of normalization."

## Algorithm

The Rules are a sequence of pairs of strings, usually presented in the form of patternreplacement. Each rule may be either ordinary or terminating.

Given an input string:

1. Check the Rules in order from top to bottom to see whether any of the patterns can be found in the input string.
2. If none is found, the algorithm stops.
3. If one (or more) is found, use the first of them to replace the leftmost occurrence of matched text in the input string with its replacement.
4. If the rule just applied was a terminating one, the algorithm stops.
5. Go to step 1.

Note that after each rule application the search starts over from the first rule.

## Example

The following example shows the basic operation of a Markov algorithm.

### Rules

1. "A" -> "apple"
2. "B" -> "bag"
3. "S" -> "shop"
4. "T" -> "the"
5. "the shop" -> "my brother"
6. "a never used" -> ."terminating rule"

### Symbol string

"I bought a B of As from T S."

### Execution

If the algorithm is applied to the above example, the Symbol string will change in the following manner.

1. "I bought a B of As from T S."
2. "I bought a B of apples from T S."
3. "I bought a bag of apples from T S."
4. "I bought a bag of apples from T shop."
5. "I bought a bag of apples from the shop."
6. "I bought a bag of apples from my brother."

The algorithm will then terminate.

## Another Example

These rules give a more interesting example. They rewrite binary numbers to their unary counterparts. For example, 101 will be rewritten to a string of 5 consecutive bars.

### Rules

1. "|0" -> "0||"
2. "1" -> "0|"
3. "0" -> ""

"101"

### Execution

If the algorithm is applied to the above example, it will terminate after the following steps.

1. "101"
2. "0|01"
3. "00||1"
4. "00||0|"
5. "00|0|||"
6. "000|||||"
7. "00|||||"
8. "0|||||"
9. "|||||"