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 }
// 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))))); }
public static int Count(this INaturalNumber n) { return(n.Match( zero: 0, succ: p => 1 + p.Count())); }
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
public static IChurchBoolean IsZero(this INaturalNumber n) => n.Match <IChurchBoolean>( zero: new ChurchTrue(), succ: _ => new ChurchFalse());
public static INaturalNumber Add(this INaturalNumber x, INaturalNumber y) => x.Match( zero: y, succ: p => new Successor(p.Add(y)));