// Demonstrating behavioral properties in Lux // Behavioral properties are compile-time guarantees about function behavior // // Expected output: // add(5, 3) = 8 // clamp(150, 0, 100) = 100 // factorial(5) = 120 // multiply(7, 6) = 42 // A pure function - no side effects, same input always gives same output fn add(a: Int, b: Int): Int is pure = a + b // An idempotent function - applying twice gives same result as once fn clamp(value: Int, min: Int, max: Int): Int is idempotent = if value < min then min else if value > max then max else value // A deterministic function - same input always gives same output fn factorial(n: Int): Int is deterministic = if n <= 1 then 1 else n * factorial(n - 1) // A commutative function - order of arguments doesn't matter fn multiply(a: Int, b: Int): Int is commutative = a * b // Test the functions let sumResult = add(5, 3) let clampedResult = clamp(150, 0, 100) let factResult = factorial(5) let productResult = multiply(7, 6) // Print results fn printResults(): Unit with {Console} = { Console.print("add(5, 3) = " + toString(sumResult)) Console.print("clamp(150, 0, 100) = " + toString(clampedResult)) Console.print("factorial(5) = " + toString(factResult)) Console.print("multiply(7, 6) = " + toString(productResult)) } let output = run printResults() with {}