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 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)));
public Successor(INaturalNumber n) { predecessor = n; }
public static IChurchBoolean IsOdd(this INaturalNumber n) { return(new ChurchNot(n.IsEven())); }
public static IChurchBoolean IsEven(this INaturalNumber n) { return(n.Accept(new IsEvenNaturalNumberVisitor())); }
// 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.Accept(new MultiplyNaturalNumberVisitor(y))); }
public static INaturalNumber Add( this INaturalNumber x, INaturalNumber y) { return(x.Accept(new AddNaturalNumberVisitor(y))); }
public int VisitSucc(INaturalNumber predecessor) { return(1 + predecessor.Count()); }
// More memmbers go here... public static int Count(this INaturalNumber n) { return(n.Accept(new CountNaturalNumberVisitor())); }
public IChurchBoolean VisitSucc(INaturalNumber predecessor) { // Evaluate previous' previous value return(predecessor.IsEven()); }
public IChurchBoolean VisitSucc(INaturalNumber predecessor) { // Match previous return(predecessor.Accept( new IsEvenPredecessorNaturalNumberVisitor())); }
succ: p2 => p2.IsEven())); // Eval previous' previous public static IChurchBoolean IsOff(this INaturalNumber n) => new ChurchNot(n.IsEven());
public static int Count(this INaturalNumber n) { return(n.Match( zero: 0, succ: p => 1 + p.Count())); }
public IChurchBoolean VisitSucc(INaturalNumber predecessor) { return(new ChurchFalse()); }