Gibt es eine intelligente Methode, um in Z3 ganze Zahlen zu definieren?Begrenzte Ganzzahlen in z3 definieren
Zum Beispiel möchte ich eine ganzzahlige Variable "x" definieren, die Werte aus [1,4] nehmen kann. Ich kann die folgende tun (ich bin mit dem Java API)
IntExpr x = ctx.mkIntConst("x");
solver.add(ctx.mkGT(x, ctx.mkInt(0))); // (assert (> x 0))
solver.add(ctx.mkLT(x, ctx.mkInt(5))); // (assert (< x 5))
Allerdings frage ich mich, ob es eine intelligentere Art und Weise, dies zu tun? Etwas, das bei der Deklaration automatisch Ober-/Untergrenzen für Variablen festlegen kann. Ich bin über Aufzählungen gekommen, aber ich bin mir nicht sicher, ob das die beste Wahl ist.
Dank
Dank Levent, meine einzige Sorge war der Suchraum. Das Hinzufügen der gebundenen Beschränkungen wird Z2 behutsam helfen, eine beträchtliche Anzahl von irrelevanten Lösungen zu reduzieren, aber diese Lösungen sind immer noch da und Z3 betrachtete sie zu einem bestimmten Zeitpunkt. Ich mag mich irren und es könnte dasselbe sein, aber wenn in Z3 beschränkte ganze Zahlen existieren, dann könnte es sein, dass diese irrelevante Lösung von Anfang an nie da war. Wie auch immer, ich werde mich vorerst an die Grenzen halten. – Mohammed
@Mohammed Hinzufügen von * redundanten * oberen und unteren Grenzen zu Variablen oder Kombinationen davon, kann die Suche ein wenig beschleunigen, selbst wenn diese * Constraints * aus bestehenden Constraints abgeleitet werden können (zB siehe [Wie berechnet man WCET .... ] (http://dl.acm.org/citation.cfm?id=2597817&dl=ACM&coll=DL&CFID=780316479&CFTOKEN=19429447)). Nachdem dies gesagt wurde, ist die Vorhersage der Laufzeit eines * smt * Solvers in diesem Fall wie das Werfen einer Münze, es gibt mehrere Faktoren, die ins Spiel kommen, einschließlich der Struktur des betrachteten Problems, d. wie der Boolean Teil mit den LAR Constraints * interagiert. –