Search code examples
z3solverz3pytheorem-provingfirst-order-logic

Z3: Complex numbers?


I have been searching on whether z3 supports complex numbers and have found the following: https://leodemoura.github.io/blog/2013/01/26/complex.html

The author states that (1) Complex numbers are not yet implemented in Z3 as a built-in (this was written in 2013), and (2) that Complex numbers can be encoded on top of the Real numbers provided by Z3.

The basic idea is to represent a Complex number as a pair of Real numbers. He defines the basic imaginary number with I=(0,1), that is: I means the real part equals 0 and the imaginary part equals 1.

He offers the encoding (I mean, we can test it on our machines), where we can solve the equation x^2+2=0. I received the following result:

sat
x = (-1.4142135623?)*I

The sat result does make sense, since this equation is solvable in the simulation of the theory of complex numbers (as a result of the theory of algebraically closed fields) we have just made. However, the root result does not make sense to me. I mean: what about (1.4142135623?)*I?

I would understand to receive the two roots, but, if only one received, I do not understand why I get the negated solution.

Maybe I misread something or I missed something.


Also, I would like to say if complex numbers have already been implemented built in Z3. I mean, with a standard:

x = Complex("x")

And with tactics of kind of a NCA (from nonlinear complex arithmetic).

I have not seen any reference to this theory in SMT-LIB either.


Solution

  • AFAIK there is no plan to add complex numbers to SMT-LIB. There's a Google group for SMT-LIB and it might make sense to send a post there to see if there is any interest there.

    Note, that particular blog post says "find a root"; this is just satisfiability, i.e. it finds one solution, not all of them. (But you can ask for another one by adding an assertion that says x should be different from the first result.)