ArticleslgStudy

mathematics

Refal

Refal is a mathematics topic covered in the lgStudy science library. This page brings together a partial reference excerpt, illustrations, worked examples, real-world applications and a short study plan, so you can understand Refal rather than just read about it. In short: Refal ("Recursive functions algorithmic language"; Russian: РЕФАЛ) "is a functional programming language oriented toward symbolic computations", including "string processing, language translation, [and] artificial intelligence". It is one of the oldest members of this family, first conceived of in 1966 as a theoretical tool, with the first implementation appearing in 1968.

Key takeaways

  • Refal belongs to mathematics; place it in that map before memorising details.
  • Learn the definition first, then one example that makes the definition concrete.
  • Connect Refal to a quantity you can measure, compute or draw — that is where exam questions come from.
  • Reproduce the core statement of Refal from memory before moving on to harder problems.

Reference excerpt

Refal ("Recursive functions algorithmic language"; Russian: РЕФАЛ) "is a functional programming language oriented toward symbolic computations", including "string processing, language translation, [and] artificial intelligence". It is one of the oldest members of this family, first conceived of in 1966 as a theoretical tool, with the first implementation appearing in 1968. Refal was intended to combine mathematical simplicity with practicality for writing large and sophisticated programs. One of the first functional programming languages to do so, and unlike Lisp of its time, Refal is based on pattern matching. Its pattern matching works in conjunction with term rewriting. The basic data structure of Lisp and Prolog is a linear list built by cons operation in a sequential manner, thus with O(n) access to list's nth element. Refal's lists are built and scanned from both ends, with pattern matching working for nested lists as well as the top-level one. In effect, the basic data structure of Refal is a tree rather than a list. This gives freedom and convenience in creating data structures while using only mathematically simple control mechanisms of pattern matching and substitution. Refal also includes a feature called the freezer to support efficient partial evaluation. Refal can be applied to the processing and transformation of tree structures, similarly to XSLT.

Basics

A Refal Hello World example is shown below.

$ENTRY Go { = <Hello>;} Hello { = <Prout 'Hello world'>; }

The program above includes two functions named Go and Hello. A function is written as the name of the function followed by the function body in curly braces. The Go function is marked as the entry point of the program using the $ENTRY directive. One could think of expressions in the function bodies as function "calls" in Lisp-like syntax. For example, the Hello function appears to call the built-in Prout function with the string 'Hello world' as the argument. The meaning and the mechanism of the call, however, is quite different. To illustrate the difference, consider the following function that determines whether a string is a palindrome.

Pal { = True; s.1 = True; s.1 e.2 s.1 = <Pal e.2>; e.1 = False; }

This example shows a function with a more complex body, consisting of four sentences (clauses). A sentence begins with a pattern followed by an equal sign followed by a general expression on the right hand side. A sentence is terminated with a semicolon. For example, the pattern of the second sentence of the function is "s.1" and the expression is "True". As the example shows, patterns include pattern variables that have the form of a character identifying the type of the variable (what the variable matches) followed by the variable identifier. The variables that begin with an "s" match a single symbol, those that begin with an "e" match an arbitrary expression. The variable identifier can be an arbitrary alphanumeric sequence optionally separated from the type identifier by a dot. A function executes by comparing its argument with the patterns of its sentences in the order they appear in the definition, until the first pattern that matches. The function then replaces the argument with the expression on the right hand side of the matched sentence. If the result of a function application includes a subexpression in angle brackets (as it will after the third sentence of our example is applied), the result is further processed by Refal by invoking the function identified by the first symbol in the brackets. Execution stops when the result has no more angle brackets to expand in this way. The function Pal can thus be read informally as: "If the expression is empty, replace it with True. Otherwise if the expression is a single symbol, replace it with True. Otherwise if the expression is a symbol followed by an arbitrary expression e.2 followed by the same symbol, replace it with the expression <Pal e.2>. (In other words, throw away the two identical symbols at the beginning and the end and recurse). Otherwise replace the expression with False. (The pattern e.1 always matches)." The following are three step-by-step execution traces annotated with the sentence numbers applied at each step to produce the next

<Pal 'noon'> (#3) <Pal 'oo'> (#3) <Pal > (#1) True

<Pal 'wow'> (#3) <Pal 'o'> (#2) True

<Pal 'revolver'> (#3) <Pal 'evolve'> (#3) <Pal 'volv'> (#3) <Pal 'ol'> (#4) False

We can now see that the Hello World example in fact executes as the sequence of the following expression transformations:

Seed the machine with the initial expression marked by $ENTRY: <Go > (apply the sentence in Go) <Hello > (apply the sentence in Hello) <Prout 'Hello world'> (Prout is a built-in that prints and expands to nothing) (nothing to apply; stop)

Other examples

Factorial Fact { 0 = 1; s.N = <* s.N <Fact <- s.N 1>>>; }

Here 0 matches 0 the number and produces 1. On any other symbol which is a number, multiply it with the result of (Fact (- s.N 1)) Note the prefix style of operators.

Factorial with loops Fact { s.n = <Loop s.n 1>; }; Loop { 0 s.f = s.f; s.n s.f = <Loop <- s.n 1> <* s.n s.f>>; }

As can be seen s.n acts as the loop counter.

Equality Equal { (e.1)(e.1) = T; (e.1)(e.2) = F; }

Here the function is defined as, if given two terms, and the terms are same then the first clause matches and produces True. else the second clause matches and produces False. An important property of Refal is that all functions in refal are single argument. (But may be decomposed into terms in an expression as above.)

If Defining control structures is easy

If { T Then (e.1) Else (e.2) = e.1; F Then (e.1) Else (e.2) = e.2; }

Here the e1 is evaluated only when the expression entered matches 'True' Then e1 Else e2 the same for e2.

Squeeze blanks Squeeze { e.1'__'e.2 = <Squeeze e.1'_'e.2>; e.1 = e.1; }

(Using '_' in place of space char so as to make the function call clear.) The first clause matches whenever the function Squeeze encounters double blanks in its input expression, and replaces it with a single blank. The second clause matches only when the first one did not, and returns the resultant value which is the current expression.

Squeeze using explicit looping Squeeze { '__'e.1 = <Squeeze '_'e.1>; s.A e.1 = s.A <Squeeze e.1>; = ; };

… excerpt ends here. Continue reading the full article.

Worked examples

Example 1 — a first encounter with Refal

Start with the simplest possible case. Write down what Refal claims or describes in one sentence, then invent the smallest concrete situation in which that sentence is true. In mathematics, the smallest case is usually a single object, a single equation or a single measurement. Check that every symbol or term in your sentence has a meaning in that case.

Example 2 — changing one variable

Take the situation from Example 1 and change exactly one quantity: double it, halve it, or set it to zero. Predict what should happen to Refal before you calculate. Comparing your prediction with the result is the fastest way to find out whether you understand the idea or only the words.

Example 3 — an exam-style question

Typical questions about Refal ask you to (a) state it precisely, (b) apply it to given data, and (c) explain a limitation. Practise writing all three answers in under five minutes; the third part is what separates a full-mark answer from an average one.

Applications of Refal

In research
Refal appears in mathematics research whenever the underlying quantities have to be modelled precisely. Papers usually cite it as a starting assumption and then explore where it breaks down.
In technology and industry
Engineering practice reuses Refal in design rules, simulations and safety margins. Knowing the idea lets you read a specification sheet and understand why the numbers look the way they do.
In the classroom
Refal is common in secondary-school and first-year university syllabi. It links to neighbouring topics Functional languages, Homoiconic programming languages, Pattern matching programming languages, so understanding it makes those chapters shorter.
In everyday life
Look for Refal outside the textbook — in sport, cooking, traffic, electronics or the sky above you. An example you found yourself is remembered far longer than one you were given.

Affiliate

Preply — study more efficiently by working with a personal tutor. 50% off.

How to study Refal in 20 minutes

  1. Read the reference excerpt below once, without taking notes.
  2. Close the page and write down what Refal means in your own words.
  3. Compare your version with the excerpt and mark what you missed.
  4. Work through the three examples above with pen and paper.
  5. Explain Refal out loud to somebody else — or to Teacher Smith in the lgStudy chat.

Frequently asked questions

What is Refal in simple terms?

Refal ("Recursive functions algorithmic language"; Russian: РЕФАЛ) "is a functional programming language oriented toward symbolic computations", including "string processing, language translation, [and] artificial intelligence". It is one of the oldest members of this family, first conceived of in…

Why does Refal matter?

Because it connects several mathematics ideas at once: it gives you a definition you can apply, a quantity you can calculate, and a way to check whether a result is plausible.

How should I study Refal?

Read the excerpt, restate it from memory, then work through the examples and applications listed on this page. The five-step study plan above takes about twenty minutes.

What does this page cover?

It gives you a compact reference excerpt plus original lgStudy explanations, examples, applications and study material on Refal.

Tags

  • Functional languages
  • Homoiconic programming languages
  • Pattern matching programming languages
  • Programming languages
  • Term-rewriting programming languages

Keep exploring