% Filename: Lambda.sty
% Author: Alan Jeffrey
% Last modified: 12 Feb 1990
% Modified 24 July 2003 by Robin Fairbairns, to change file name and
%                       licence requirements, at Alan Jeffrey's request
%
% This package is (c) 1990 Alan Jeffrey.
%
% Version 1.0a
%
% Use and distribution are subject to the LaTeX Project Public
% License (lppl), version 1.2 (or any later version, at your
% convenience).
%
% A copy of the latest version of lppl may be found at
% http://www.latex-project.org/lppl.txt
%
% See the Gnu manifesto for details on why software ought to be free.
%
% Tugboat are given permission to publish any or all of this.
%
% This package provides a pile of lambda-calculus and list-handling
% macros of an incredibly obtuse nature.  Read lazylist.tex to find
% out what they all do and how they do it.  This \TeX\ code was
% formally verified.
%
% Alan Jeffrey, 25 Jan 1990.

\def\Identity#1{#1}

\def\Error%
   {\errmessage{Abandon verification all 
                ye who enter here}}

\def\First#1#2{#1}
\def\Second#1#2{#2}

\def\Compose#1#2#3{#1{#2{#3}}}

\def\Twiddle#1#2#3{#1{#3}{#2}}

\let\True=\First
\let\False=\Second
\let\Not=\Twiddle

\def\And#1#2{#1{#2}\False}
\def\Or#1#2{#1\True{#2}}

\def\Lift#1#2#3#4{#1{#4}{#2}{#3}{#4}}

\def\Lessthan#1#2{\TeXif{\ifnum#1<#2 }}

\def\gobblefalse\else\gobbletrue\fi#1#2%
   {\fi#1}
\def\gobbletrue\fi#1#2%
   {\fi#2}
\def\TeXif#1%
   {#1\gobblefalse\else\gobbletrue\fi}

\def\Nil#1#2{#2}
\def\Cons#1#2#3#4{#3{#1}{#2}}
\def\Stream#1{\Cons{#1}{\Stream{#1}}}
\def\Singleton#1{\Cons{#1}\Nil}

\def\Head#1{#1\First\Error}
\def\Tail#1{#1\Second\Error}

\def\Foldl#1#2#3%
   {#3{\Foldl@{#1}{#2}}{#2}}
\def\Foldl@#1#2#3#4%
   {\Foldl{#1}{#1{#2}{#3}}{#4}}
\def\Foldr#1#2#3%
   {#3{\Foldr@{#1}{#2}}{#2}}
\def\Foldr@#1#2#3#4%
   {#1{#3}{\Foldr{#1}{#2}{#4}}}

\def\Cat#1#2{\Foldr\Cons{#2}{#1}}

\def\Reverse{\Foldl{\Twiddle\Cons}\Nil}

\def\All#1{\Foldr{\Compose\And{#1}}\True}
\def\Some#1{\Foldr{\Compose\Or{#1}}\False}
\def\Isempty{\All{\First\False}}

\def\Filter#1%
   {\Foldr{\Lift{#1}\Cons\Second}\Nil}

\def\Map#1{\Foldr{\Compose\Cons{#1}}\Nil}

\def\Insert#1#2#3%
   {#3{\Insert@{#1}{#2}}{\Singleton{#2}}}
\def\Insert@#1#2#3#4%
   {#1{#2}{#3}%
      {\Cons{#2}{\Cons{#3}{#4}}}%
      {\Cons{#3}{\Insert{#1}{#2}{#4}}}}
\def\Insertsort#1{\Foldr{\Insert{#1}}\Nil}

\def\Unlistize#1{[#1\Unlistize@{}]}
\def\Unlistize@#1{#1\Foldr\Commaize{}}
\def\Commaize#1#2{, #1#2}

\def\Listize[#1]%
   {\Listize@#1,\relax]}
\def\Listize@#1,#2]%
   {\TeXif{\ifx\relax#2}%
        {\Singleton{#1}}%
        {\Cons{#1}{\Listize@#2]}}}

\def\Show#1[#2]%
   {\Unlistize{#1{\Listize[#2]}}}


