## Maxwell’s equations of software

I haz dem:

1 Context This spec defines one function, Nock. 2 Structures A noun is an atom or a cell. An atom is any unsigned integer. A cell is an ordered pair of any two nouns. 3 Pseudocode Brackets enclose cells. [a b c] is [a [b c]]. *a is Nock(a). Reductions match top-down. 4 Reductions ?[a b] => 0 ?a => 1 ^[a b] => ^[a b] ^a => (a + 1) =[a a] => 0 =[a b] => 1 =a => =a /[1 a] => a /[2 a b] => a /[3 a b] => b /[(a + a) b] => /[2 /[a b]] /[(a + a + 1) b] => /[3 /[a b]] /a => /a *[a 0 b] => /[b a] *[a 1 b] => b *[a 2 b c d] => *[a 3 [0 1] 3 [1 c d] [1 0] 3 [1 2 3] [1 0] 5 5 b] *[a 3 b] => **[a b] *[a 4 b] => ?*[a b] *[a 5 b] => ^*[a b] *[a 6 b] => =*[a b] *[a [b c] d] => [*[a b c] *[a d]] *a => *a

For context and comparison, see this or this or this. Here at UR, axioms are axioms—we leave no “niceties such as arithmetic” to the programmer’s imagination. Just sayin’.

To grok Nock, construct a formula `f`

such that
`*[s f]`

equals `(s—1)`

for any atomic nonzero
subject `s`

. The equivalent formula for `(s + 1)`

is
`[5 0 1]`

. The first 16 people who mail me a correct answer
may (or may not) win a prize, which may (or may not) be valuable. (Please include your interpreter—in any language, it should fit on a
page. Please *do not* post the answer here or anywhere, and let me
know if you see it posted. This is not a difficult problem.)

As you’ll quickly see if you try this exercise, raw Nock is not a usable programming language. But nor is it an esoteric language or automaton, like SK combinators. Rather, Nock is a tool for defining higher-level languages—comparable to the lambda calculus, but meant as foundational system software rather than foundational metamathematics.

To define a language with Nock, construct two nouns, `q`

and
`r`

, such that `*[q r]`

equals `r`

, and
`*[s *[p r]`

is a useful functional language. In this
description, `p`

is the function source; `q`

is your
language definition, as source; `r`

is your language definition,
as data; `s`

is the input data. You will find this a tractable
and entertaining problem.