kdrag.datatype.define_primrec

kdrag.datatype.define_primrec(fun_name, vs: list[ExprRef], res_type: SortRef, **cases)

Define a function by primitive recursion. https://en.wikipedia.org/wiki/Primitive_recursive_function This is the analog of a fold.

>>> import kdrag.theories.nat as nat
>>> n, m = smt.Consts("n m", nat.Nat)
>>> myadd2 = define_primrec("myadd2", [n, m], nat.Nat,                                 Z = lambda: m,                                S = lambda a: nat.S(a))
>>> myadd2.defn
|= ForAll([n, m],
    myadd2(n, m) == If(is(S, n), S(myadd2(pred(n), m)), m))
Parameters:
  • vs (list[ExprRef])

  • res_type (SortRef)