gegeben eine Reihe von Bedingungen, algorithmisch bestimmen nur eine kann True sein

8

Wenn zwei oder mehr logische Bedingungen gegeben sind, ist es dann möglich, algorithmisch zu bestimmen, dass genau EINER von ihnen als WAHR ausgewertet wird? Zum Beispiel:

%Vor%

Diese Bedingungen werden aus einer domänenspezifischen Sprache generiert und zur Bestimmung des nächsten Ausführungspfades verwendet. d. h. Benutzer erstellen eine Bedingung für jede Option, wenn der Ausführungsbaum in mehrere Pfade unterteilt ist, und die Bedingung, die als wahr bewertet wird, bestimmt den Pfad, der zu nehmen ist. Damit die Simulation gültig ist, sollte dies nur ein möglicher Pfad sein, der für beliebige Werte verwendet werden kann.

Gegenwärtig werte ich diese Bedingungen zur Laufzeit aus und werfe einen Wutanfall aus, wenn mehr als einer (oder keiner davon) wahr ist.

Ich möchte in der Lage sein, fehlerhafte Bedingungen während des Parsing-Schritts zu prüfen (Domänensprache für kompilierbaren Quellcode). Ist es möglich? Wie würde man die Bedingungen überprüfen?

aktualisieren

Was in den Bedingungen enthalten sein kann, ist in der Praxis ziemlich weit gefasst. All dies sind mögliche Bedingungen:

  • X >= Y && Y < Z
  • X.within_radius(0.4)
  • X IN some_array
  • X * Y < Z

letzte Aktualisierung

Es scheint so, als ob eine Lösung, die alle möglichen Bedingungen abdeckt, nicht möglich ist (oder zumindest aufgrund meiner begrenzten Kenntnisse nicht innerhalb der für das Problem vorgesehenen Zeit möglich ist). Ich werde dies eines Tages noch einmal Revue passieren lassen, aber jetzt akzeptiere ich die Antwort, die mich am weitesten gebracht hat.

    
Shawn Chin 20.08.2010, 15:09
quelle

4 Antworten

3

EDIT: Ich wiederhole es, weil es so aussieht, als ob die anderen Antworten eine Reihe von Dingen annehmen, die seither bestätigt wurden:

Wenn Sie Ihre Bedingungen (und die Einschränkung, dass nur eine wahr ist) in Presburger-Arithmetik angeben können, dann Sie können eine Entscheidungsprozedur schreiben, um diese Eigenschaft statisch zu überprüfen. Dies scheint aus den obigen Beispielen vollkommen erreichbar zu sein.

Der Ansatz des "stumpfen Instruments" besteht darin, dass er im Grunde mit etwas wie einem automatischen Theorembeweiser oder einem SMT-Solver verbunden ist (wo Sie im Grunde versuchen würden, die Negation der Aussage zu beweisen) "gibt es einen Wert x, der constraint1 XOR constraint2 erfüllt" ). Ich habe programmatisch eine Schnittstelle mit CVC3 hergestellt und fand es ziemlich gut, damit zu arbeiten, aber mein Verständnis ist das es wurde von anderen SMT-Lösern übertroffen.

Alles andere, was Sie tun, um dieses Problem zu lösen, wird wahrscheinlich dazu führen, dass einige Implementierungen der von mir vorgeschlagenen Tools, denke ich, approximiert werden. Abhängig davon, wie genau Ihre Beschränkungen spezifiziert sind, können Sie vielleicht mit der Implementierung einer Art von Entscheidungsprozedur für etwas wie Presburger Arithmetik .

    
Gian 20.08.2010, 15:20
quelle
1

Im Allgemeinen, nein. Aber wenn Sie wirklich fragen, ob es möglich ist, Bedingungen zu definieren, die aus booleschen logischen Kombinationen von Ungleichungen auf einer endlichen Menge unabhängiger ganzzahliger Variablen mit Konstanten bestehen, dann gibt es Hoffnung. Sie können die Variablen mit den Konstanten, die in Ihren Ungleichungen (und +1 und -1 dieser Konstanten) erscheinen, umfassend überprüfen und überprüfen, ob die Anzahl der Bedingungen, die wahr sind, immer 1 ist.

    
Eric Mickelsen 20.08.2010 15:22
quelle
1

Wenn Sie herausfinden möchten, ob nur eine Bedingung zutrifft (von zwei oder mehr möglichen Bedingungen), kann es hilfreich sein, auf diese Frage zu SO zu verweisen: xoder-drei-Werte . Nehmen wir direkt von seiner Antwort:

%Vor%

In Ihrem Fall:

%Vor%

Es gibt auch eine allgemeine Lösung, bei der Sie jedesmal, wenn eine Bedingung wahr ist, eine Zählung inkrementieren, dann die Zählung gegen 1 überprüfen, sobald alle Bedingungen getestet worden sind.

    
gary 20.08.2010 15:48
quelle
0

Sind die Bausteine ​​Ihrer Bedingungen nur

?
  • eine ganzzahlige Variable,
  • ein Vergleichsoperator aus (& lt ;, & lt; =, & gt ;, & gt; =),
  • Zahlen (nehmen wir ganze Zahlen an)?

Und die Endbedingungen werden aus diesen mit & amp; & amp; und ||?

Können wir annehmen, dass alle Integer-Variablen unabhängig sind?

Unter diesen Bedingungen würde ich annehmen, dass es algorithmisch überprüft werden kann. Ich würde alle gültigen Bereiche pro Variable in eine Datenstruktur setzen und nach Überschneidungen suchen.

EDIT: Da dies nicht der Fall zu sein scheint, wäre die beste Lösung wahrscheinlich, die verschiedenen Arten von Bedingungen zu gruppieren, so dass die Bedingungen in jeder Gruppe statisch gegeneinander bewertet werden können. Die Art der Bedingungen, die ich von Ihrer ersten Beschreibung annahm, wäre nur eine dieser Gruppen.

    
Frank 20.08.2010 15:19
quelle