### Algorithms and the concrete universal

(A follow-up to this post.)

Hegel's notion of the "concrete universal," later adopted by British idealists (like Bosanquet, Collingwood and Oakeshott) and Italian idealists (like Croce), and important to a modern philosopher such as Claes Ryn, is difficult to grasp. We are used to thinking of the concrete and the universal as opposites of some sort. So what on earth is a "concrete universal"?

This passage from R. G. Collingwood expresses the idea philosophically about as well as I have seen:

"The concept is not something outside the world of sensuous experience: it is the very structure in order of that world itself... This is the point of view of concrete thought... Too abstract is to consider separately things that are inseparable: to think of the universal, for instance, without reflecting that it is merely the universal of its particulars, and to assume that one can isolate it in thought and to study it in this isolation. This assumption is an error." -- Speculum Mentis (1924)

In shorter form, Bernard Bosanquet wrote: "the fullest universal of character and consciousness will embody itself in the finest and most specialized and unrepeatable responses to environment." -- The Principle of Individuality and Value: The Gifford Lectures for 1911 (1927)

Rather than a philosophical definition, what I would like to offer here is a concrete example of the concrete universal, that of algorithms. At first glance, nothing could be more abstract than an algorithm. But let us try to state what that "abstract" algorithm is: let us take, for instance, the algorithm for the Towers of Hanoi. We can describe the algorithm in words; but these will be particular, concrete words. We can picture the actual puzzle game, and even actually play it:

But this represents the algorithm with particular, concrete pieces of wood and particular instructions on how to play.

We can offer an implementation of the algorithm, in, for instance, Python:

``````def hanoi(n, source, helper, target):
if n > 0:
# move tower of size n - 1 to helper:
hanoi(n - 1, source, target, helper)
# move disk from source peg to target peg
if source:
target.append(source.pop())
# move tower of size n-1 from helper to target
hanoi(n - 1, helper, source, target)

source = [4,3,2,1]
target = []
helper = []
hanoi(len(source), source, helper, target)
```
```
But this is a particular set of instructions in a particular programming language.

We might even provide some pseudo-code, but the pseudo-code will still consist of particular symbols written according to a particular pseudo-convention.

In short, the abstract algorithm is an airy nothing, a "we know not what" (as Berkeley described the abstract matter of Descartes and Locke), unless embodied in some concrete form. Or, as Collingwood said, "it is merely the universal of its particulars." We cannot "isolate it in thought and to study it in this isolation." We can only reach the universal through the concrete, which is its only reality.