enum Nat {
Z,
S(Box<Nat>),
}
fn add(n: &Nat, m: &Nat) -> Nat {
match n {
Nat::Z => m.clone(),
Nat::S(inner_n) => Nat::S(Box::new(add(inner_n, m))),
}
}
fn multiply(n: &Nat, m: &Nat) -> Nat {
match n {
Nat::Z => Nat::Z,
Nat::S(inner_n) => add(m, &multiply(inner_n, m)),
}
}
fn from_integer(num: i32) -> Nat {
if num <= 0 {
Nat::Z
} else {
Nat::S(Box::new(from_integer(num - 1)))
}
}
fn to_integer(nat: &Nat) -> i32 {
match nat {
Nat::Z => 0,
Nat::S(inner) => 1 + to_integer(inner),
}
}
fn main() {
let num1 = from_integer(3);
let num2 = from_integer(5);
let sum_result = add(&num1, &num2);
let mul_result = multiply(&num1, &num2);
println!("Number 1: {}", to_integer(&num1));
println!("Number 2: {}", to_integer(&num2));
println!("Sum result: {}", to_integer(&sum_result));
println!("Multiplication result: {}", to_integer(&mul_result));
}