ometa M { fact 0 -> 1, fact :n ?(n > 0) fact(n - 1):m -> (n * m) } M.match(5, "fact")