the kernel does not have recursion and will reject defs that are recursive if it supported recursion, it would break logic soundness:
simple_def reallyBad : forall {P : Prop}, P := reallyBad
theorem pipi : 3*3 = 6 := reallyBad
#guard_msg compares the output with the previous message, allows for basic testing.#reduce fun n => something n : this is how we make the kernel accept something that is a recursive definition.
we tell the kernel that we have a new type and when its logic is added to the kernel, the kernel knows it.recursor basically transforms what we write as a recursive definition into something that is
not recursive for the kernel to digest. .below tracks the values defined already, and also this
is designed such that reductions still work nicely.ackermann functionrfl, bv_decide)
-> connection to proof irrelevance?theorem sum_of_n (n : Nat):
    (List.range (n + 1)).reverse.sum = n * (n + 1) / 2 := by 
    induction n with
    | zero => rfl 
    | succ k ih => 
        rw [List.range_succ]
        simp [ih, Nat.mul_add, Nat.add_mul]
        omega 
#check sum_of_n -- shows the actual proof term
partial_fixpoint, monad