Lean4
/-- Check if an expression is a "rational in normal form",
i.e. either an integer number in normal form,
or `n / d` where `n` is an integer in normal form, `d` is a natural number in normal form,
`d ≠ 1`, and `n` and `d` are coprime (in particular, we check that `(mkRat n d).den = d`).
If so returns the rational number.
-/
def rat? (e : Expr) : Option Rat := do
if e.isAppOfArity ``Div.div 4 then
let d ← e.appArg!.nat?
guard (d ≠ 1)
let n ← e.appFn!.appArg!.int?
let q := mkRat n d
guard (q.den = d)
pure q
else
e.int?