hsnock-0.2.0: Language/Nock5K/Spec.lhs
> module Language.Nock5K.Spec where 1 Structures A noun is an atom or a cell. An atom is any natural number. A cell is an ordered pair of nouns. > data Noun = Atom Integer | Noun :- Noun deriving (Eq) 2 Reductions nock(a) *a > nock :: Noun -> Noun > nock = tar [a b c] [a [b c]] > infixr 1 :- ?[a b] 0 > wut (a :- b) = Atom 0 ?a 1 > wut a = Atom 1 +[a b] +[a b] > lus (a :- b) = error "+[a b]" +a 1 + a > lus (Atom a) = Atom (1 + a) =[a a] 0 > tis (a :- a') | a == a' = Atom 0 =[a b] 1 > tis (a :- b) = Atom 1 =a =a > tis a = error "=a" /[1 a] a > fas (Atom 1 :- a) = a /[2 a b] a > fas (Atom 2 :- a :- b) = a /[3 a b] b > fas (Atom 3 :- a :- b) = b /[(a + a) b] /[2 /[a b]] > fas (Atom a :- b) | a > 2 && a `mod` 2 == 0 = > fas $ Atom 2 :- fas (Atom (a `div` 2) :- b) /[(a + a + 1) b] /[3 /[a b]] > fas (Atom a :- b) | a > 3 && a `mod` 2 == 1 = > fas $ Atom 3 :- fas (Atom (a `div` 2) :- b) /a /a > fas a = error "/a" *[a [b c] d] [*[a b c] *[a d]] > tar (a :- (b :- c) :- d) = tar (a :- b :- c) :- tar (a :- d) *[a 0 b] /[b a] > tar (a :- (Atom 0 :- b)) = fas $ b :- a *[a 1 b] b > tar (a :- (Atom 1 :- b)) = b *[a 2 b c] *[*[a b] *[a c]] > tar (a :- Atom 2 :- b :- c) = tar $ tar (a :- b) :- tar (a :- c) *[a 3 b] ?*[a b] > tar (a :- Atom 3 :- b) = (wut.tar) (a :- b) *[a 4 b] +*[a b] > tar (a :- Atom 4 :- b) = (lus.tar) (a :- b) *[a 5 b] =*[a b] > tar (a :- Atom 5 :- b) = (tis.tar) (a :- b) *[a 6 b c d] *[a 2 [0 1] 2 [1 c d] [1 0] 2 [1 2 3] [1 0] 4 4 b] > tar (a :- Atom 6 :- b :- c :- d) = > tar (a :- Atom 2 :- (Atom 0 :- Atom 1) :- Atom 2 :- (Atom 1 :- c :- d) :- > (Atom 1 :- Atom 0) :- Atom 2 :- (Atom 1 :- Atom 2 :- Atom 3) :- > (Atom 1 :- Atom 0) :- Atom 4 :- Atom 4 :- b) *[a 7 b c] *[a 2 b 1 c] > tar (a :- Atom 7 :- b :- c) = tar $ a :- Atom 2 :- b :- Atom 1 :- c *[a 8 b c] *[a 7 [[7 [0 1] b] 0 1] c] > tar (a :- Atom 8 :- b :- c) = > tar (a :- Atom 7 :- ((Atom 7 :- (Atom 0 :- Atom 1) :- b) :- > Atom 0 :- Atom 1) :- c) *[a 9 b c] *[a 7 c 2 [0 1] 0 b] > tar (a :- Atom 9 :- b :- c) = > tar (a :- Atom 7 :- c :- Atom 2 :- (Atom 0 :- Atom 1) :- Atom 0 :- b) *[a 10 [b c] d] *[a 8 c 7 [0 3] d] > tar (a :- Atom 10 :- (b :- c) :- d) = tar (a :- c) `seq` > tar (a :- Atom 8 :- c :- Atom 7 :- (Atom 0 :- Atom 3) :- d) *[a 10 b c] *[a c] > tar (a :- Atom 10 :- b :- c) = tar $ a :- c *a *a > tar a = error "*a"