From 06277bdfbc7b18e58937b1f5b67756ef9257e6d3 Mon Sep 17 00:00:00 2001 From: Kyle Serrecchia Date: Wed, 8 Jul 2026 00:26:42 -0700 Subject: [PATCH] fixed church numeral typing so pred works Co-Authored-By: Claude Fable 5 --- languages/j/java/LambdaCore.java | 35 ++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/languages/j/java/LambdaCore.java b/languages/j/java/LambdaCore.java index 653736c..b8076f6 100644 --- a/languages/j/java/LambdaCore.java +++ b/languages/j/java/LambdaCore.java @@ -11,7 +11,10 @@ interface UnaryBoolOp extends Function { interface BinaryBoolOp extends Function> { } - interface ChurchNumeral extends Function, Function> { + // PRED applies a numeral to functions over functions, so numerals cannot be + // pinned to Function. Term is the untyped lambda calculus' + // single universal type: everything is a function from Term to Term. + interface Term extends Function { } Bool TRUE = x -> y -> x; @@ -21,13 +24,13 @@ interface ChurchNumeral extends Function, Function b2 -> b1.apply(b2).apply(FALSE); BinaryBoolOp OR = b1 -> b2 -> b1.apply(TRUE).apply(b2); - ChurchNumeral ZERO = x -> y -> y; - Function SUCC = w -> y -> x -> y.apply(w.apply(y).apply(x)); - -// Function PRED = n -> f -> x -> -// n.apply(g -> h -> h.apply(g.apply(f))) -// .apply(u -> x) -// .apply(u -> u); + Term ZERO = f -> x -> x; + Term SUCC = n -> f -> x -> f.apply(n.apply(f).apply(x)); + Term PRED = n -> f -> x -> + n.apply(g -> h -> h.apply(g.apply(f))) + .apply(u -> x) + .apply(u -> u); + Term ONE = SUCC.apply(ZERO); static void main(String[] args) { printBool(TRUE); // TRUE @@ -47,7 +50,11 @@ static void main(String[] args) { printBool(OR.apply(TRUE).apply(TRUE)); // TRUE printChurchNumeral(ZERO); // 0 - printChurchNumeral(SUCC.apply(ZERO)); // 1 + printChurchNumeral(ONE); // 1 + printChurchNumeral(SUCC.apply(ONE)); // 2 + printChurchNumeral(PRED.apply(SUCC.apply(ONE))); // 1 + printChurchNumeral(PRED.apply(ONE)); // 0 + printChurchNumeral(PRED.apply(ZERO)); // 0 } static void printBool(Bool b) { @@ -59,7 +66,13 @@ else if (b == FALSE) throw new IllegalStateException(); } - static void printChurchNumeral(ChurchNumeral n) { - System.out.println(n.apply(x -> x + 1).apply(0)); + static void printChurchNumeral(Term n) { + int[] count = {0}; + Term inc = t -> { + count[0]++; + return t; + }; + n.apply(inc).apply(t -> t); + System.out.println(count[0]); } }