-- \u30de\u30af\u30ed\u5b9a\u7fa9
--  [\u6ce8\u610f]
--   \u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\u306f\u03bb\u3092\u610f\u5473\u3059\u308b. \u30a8\u30b9\u30b1\u30fc\u30d7\u306e\u610f\u5473\u3067\u306f\u306a\u3044.
--   "--"\u3067\u59cb\u307e\u308b\u884c\u306f\u30b3\u30e1\u30f3\u30c8\u3068\u306a\u308b.
{-
     \u6b21\u306e\u8a18\u53f7\u306f\u30d7\u30ed\u30d1\u30c6\u30a3\u3067\u5909\u66f4\u3067\u304d\u308b\u306e\u3067\u6ce8\u610f\u3059\u308b\u3053\u3068.
     -----------------------------------------------
       =   \u30de\u30af\u30ed\u540d\u3068\u5024\u306e\u533a\u5207\u308a
       ;   \u30de\u30af\u30ed\u5b9a\u7fa9\u306e\u7d42\u4e86
       <   \u30de\u30af\u30ed\u53c2\u7167\u306e\u958b\u59cb
       >   \u30de\u30af\u30ed\u53c2\u7167\u306e\u7d42\u4e86
-}

true   = \tf.t;
false  = \tf.f;
and    = \pq.pq<false>;
or     = \pq.p<true>q;
not    = \p.p<false><true>;
if     = \pxy.pxy;
succ   = \nsz.s(nsz);
pred   = \nsz.n(\gh.h(gs))(\u.z)(\u.u);
add    = \mnsz.ms(nsz);
plus   = <add>;
sub    = \mn.n<pred>m;
mul    = \mns.m(ns);
exp    = \mn.nm;
iszero = \n.n(\x.(\tf.f))(\tf.t);

I      = \x.x;
K      = \xy.x;
S      = \xyz.xz(yz);
-- Curry\u306e\u4e0d\u52d5\u70b9\u6f14\u7b97\u5b50
Y      = \f.(\x.f(xx))(\x.f(xx));
-- Turing\u306e\u4e0d\u52d5\u70b9\u6f14\u7b97\u5b50
Yt     = (\zx.x(zzx))(\zx.x(zzx));

car    = \p.p<true>;     -- car[(a.b)] = a
cdr    = \p.p<false>;    -- cdr[(a.b)] = b
cons   = \fsb.bfs;       -- cons[a;b] = (a.b)

{-
  \u6570\u5024\u306f\u30d7\u30ed\u30b0\u30e9\u30e0\u5185\u90e8\u3067\u4f5c\u308a\u51fa\u305b\u308b\u3088\u3046\u306b\u6539\u826f\u3055\u308c\u305f\u306e\u3067\u30b3\u30e1\u30f3\u30c8\u3068\u3059\u308b.
	0      = \sz.z;
	1      = \sz.sz;
	2      = \sz.s(sz);
	3      = \sz.s(s(sz));
	4      = \sz.s(s(s(sz)));
	5      = \sz.s(s(s(s(sz))));
	6      = \sz.s(s(s(s(s(sz)))));
	7      = \sz.s(s(s(s(s(s(sz))))));
	8      = \sz.s(s(s(s(s(s(s(sz)))))));
	9      = \sz.s(s(s(s(s(s(s(s(sz))))))));
	10     = \sz.s(s(s(s(s(s(s(s(s(sz)))))))));
	11     = \sz.s(s(s(s(s(s(s(s(s(s(sz))))))))));
-}

{-
   \u968e\u4e57
    lambda> <Y><fact><1>;
    \sz.sz
    36 step(s) [0.003ms]
    lambda> <Y><fact><2>;
    \sz.s(sz)
    142 step(s) [0.041ms]
    lambda> <Y><fact><3>;
    \sz.s(s(s(s(s(sz)))))
    694 step(s) [0.711ms]
    lambda> <Y><fact><4>;
    \sz.s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(sz)))))))))))))))))))))))
    4068 step(s) [9.889ms]
-}
fact   = \fx.<if>(<iszero>x)<1>(<mul>x(f(<pred>x)));
