Example #1
0
        public static IChurchBoolean IsEven(this INaturalNumber n)

        {
            return(n.Match(

                       zero: new ChurchTrue(),         // 0 is even, so true

                       succ: p1 => p1.Match(           // Match previous

                           zero: new ChurchFalse(),    // If 0 then successor was 1

                           succ: p2 => p2.IsEven()))); // Eval previous' previous
        }
Example #2
0
        // The formula used here is

        // x * y = 1 + (x - 1) + (y - 1) + ((x - 1) * (y - 1))

        // It follows like this:

        // x* y =

        // (x - 1 + 1) * (y - 1 + 1) =

        // ((x - 1) + 1) * ((y - 1) + 1) =

        // ((x - 1) * (y - 1)) + ((x - 1) * 1) + ((y - 1) * 1) + 1 * 1 =

        // ((x - 1) * (y - 1)) + (x - 1) + (y - 1) + 1

        public static INaturalNumber Multiply(

            this INaturalNumber x,

            INaturalNumber y)

        {
            return(x.Match(zero: new Zero(),

                           succ: px => y.Match(

                               zero: new Zero(),

                               succ: py =>

                               One

                               .Add(px)

                               .Add(py)

                               .Add(px.Multiply(py)))));
        }
Example #3
0
 public static int Count(this INaturalNumber n)
 {
     return(n.Match(
                zero: 0,
                succ: p => 1 + p.Count()));
 }
Example #4
0
 public static IChurchBoolean IsEven(this INaturalNumber n)
 => n.Match(
     zero: new ChurchTrue(),
     succ: p1 => p1.Match(
         zero: new ChurchFalse(),        // If 0 then successor was 1
         succ: p2 => p2.IsEven()));      // Eval previous' previous
Example #5
0
 public static IChurchBoolean IsZero(this INaturalNumber n)
 => n.Match <IChurchBoolean>(
     zero: new ChurchTrue(),
     succ: _ => new ChurchFalse());
Example #6
0
 public static INaturalNumber Add(this INaturalNumber x, INaturalNumber y)
 => x.Match(
     zero: y,
     succ: p => new Successor(p.Add(y)));