(Per discussion with @nikolaj_bjorner on email) The answer is because /
is Real
division while div
is Int
division.
So
(assert (>= b 32))
(assert (= a (div b 8)))
(assert (not (= (div b a) 8)))
is SAT with a = 4
and b = 37
, and so
* div b 8
is 4
but
* div b a
is 9
OTOH the version with /
is unsat
because
1. The solvers automatically coerce the Int
arguments to Real
to enable /
but
2. The define-fun
is rejected because (/ x y)
cannot be coerced down to Int