In der Praxis erfordern die meisten dieser Optimierungsprobleme eine Art von Iteration bis zum Maximum/Minimum, die zusätzlich zum SMT-Solver eingesetzt wird. Es sind auch quantifizierte Ansätze möglich, die die besonderen Fähigkeiten des SMT-Solvers ausnutzen, aber in der Praxis erweisen sich solche Einschränkungen als zu schwierig für den zugrunde liegenden Solver. Siehe insbesondere diese Diskussion: Wie optimiert man einen Teil des Codes in Z3 (PI_NON_NESTED_ARITH_WEIGHT)?
Die meisten Hochsprachenbindungen enthalten jedoch die notwendigen Funktionen, um Ihnen das Leben zu erleichtern. Wenn Sie zum Beispiel die Haskell-SBV-Bibliothek verwenden, um z3 zu skripten, können Sie das tun:
Prelude> import Data.SBV
Prelude Data.SBV> maximize Quantified head 2 (\[x, y] -> x.==3 &&& y.>=1)
Just [3,1]
Prelude Data.SBV> maximize Quantified (head . tail) 2 (\[x, y] -> x.==3 &&& y.>=1)
Nothing
Prelude Data.SBV> minimize Quantified head 2 (\[x, y] -> x.==3 &&& y.>=1)
Just [3,1]
Prelude Data.SBV> minimize Quantified (head . tail) 2 (\[x, y] -> x.==3 &&& y.>=1)
Just [3,1]
Das erste Ergebnis lautet x=3, y=1 und maximiert x in Bezug auf das Prädikat x==3 && y>=1. Das zweite Ergebnis besagt, dass es keinen Wert gibt, der y in Bezug auf das gleiche Prädikat maximiert. Der dritte Aufruf besagt, dass x=3, y=1 das Prädikat in Bezug auf x minimiert. Der vierte Aufruf besagt, dass x=3,y=1 das Prädikat in Bezug auf y minimiert. (Siehe http://hackage.haskell.org/packages/archive/sbv/0.9.24/doc/html/Data-SBV.html#g:34 für Details).
Sie können auch die Option "Iterativ" (anstelle von quantifiziert) verwenden, damit die Bibliothek die Optimierung iterativ durchführt, anstatt Quantifizierer zu verwenden. Diese beiden Techniken sind no äquivalent, da letztere in einem lokalen Minima/Maxima stecken bleiben kann, aber iterative Ansätze könnten Probleme lösen, bei denen die quantifizierte Version für den SMT-Löser viel zu viel ist.