I am new to Z3 (and SMT solvers in general), and I've been going through the Z3 tutorial. In the section on quantifiers, it has me run the following code:
(declare-fun f (Int) Int)
(declare-fun g (Int) Int)
(declare-const a Int)
(declare-const b Int)
(declare-const c Int)
(assert (forall ((x Int))
(! (= (f (g x)) x))))
(assert (= (g a) c))
(assert (= (g b) c))
(assert (not (= a b)))
(check-sat)
And running this returns UNSAT. But this seems satisfiable: just take a = 1, b = 2, c = 1, f(x) = 1 - x, and g(x) = 0 if x = 0, otherwise 1. Then a != b, g(a) = g(b) = 1, and we have no fixed points, since f(g(x)) maps everything to 0 except for 0 itself, which gets mapped to 1.
Where am I going wrong here?