// Demonstrating behavioral properties in Lux // Behavioral properties are compile-time guarantees about function behavior // // Expected output: // add(5, 3) = 8 // factorial(5) = 120 // multiply(7, 6) = 42 // abs(-5) = 5 // A pure function - no side effects, same input always gives same output fn add(a: Int, b: Int): Int is pure = a + b // 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 // An idempotent function - absolute value fn abs(x: Int): Int is idempotent = if x < 0 then 0 - x else x // Test the functions let sumResult = add(5, 3) let factResult = factorial(5) let productResult = multiply(7, 6) let absResult = abs(0 - 5) // Print results fn printResults(): Unit with {Console} = { Console.print("add(5, 3) = " + toString(sumResult)) Console.print("factorial(5) = " + toString(factResult)) Console.print("multiply(7, 6) = " + toString(productResult)) Console.print("abs(-5) = " + toString(absResult)) } let output = run printResults() with {}