再帰理論

こちらもただのお遊びです。
今回はHaskellを選びました。

-- 後者関数は原始再帰関数
suc = (1 +)

-- 射影関数は原始再帰関数
u1_1 x = x
u3_1 (x, _, _) = x
u3_2 (_, x, _) = x
u2_1 (x, _) = x
u2_2 (_, x) = x

-- 加算関数
x +. 0       = u1_1 x
x +. (y + 1) = suc $ u3_2 (x, (x +. y), y)

-- zeroも原始再帰関数
zero x = 0

-- 乗算関数
x *. 0       = zero x
x *. (y + 1) = u3_2 (x, (x *. y), y) +. u3_1 (x, (x *. y), y)

-- 階乗関数
fac 0       = 1
fac (x + 1) = f (x, fac x)
    where f arg = (suc $ u2_1 arg) *. u2_2 arg

-- 前者関数
pd 0       = 0
pd (x + 1) = x

-- 減算関数
x -. 0       = x
x -. (y + 1) = pd (x -. y)

-- 最小、最大、絶対値
min' (x, y)  = x -. (x -. y)
max' (x, y)  = (x +. y) -. min' (x, y)
abs' (x, y)  = (x -. y) +. (y -. x)
   
main = do
    print $ 4 +. 6
    print $ 16 *. 16
    print $ fac 5
    print $ 10 -. 5
    print "-----"
    print $ min' (3, 4)
    print $ max' (3, 4)
    print $ abs' (3, 4)

10
256
120
5
"-----"
3
4
1
Haskell触ったのいつぶりだろう!
n + k パターンを初めて有効活用した気がします。