Wie kann ich eine Wahrheitstabelle in einen komprimierten if-Block verwandeln?
Angenommen, ich habe diese Wahrheitstabelle, in der A und B Bedingungen und x, y und z mögliche Aktionen sind:
A B | x y z
-------------
0 0 | 0 0 1
0 1 | 0 0 1
1 0 | 0 1 0
1 1 | 1 0 0
Dies könnte sich wie folgt umwandeln, wenn block:
if(A)
{
if(B)
{
do(x)
}
else
{
do(y)
}
}
else
{
do(z)
}
Dies ist ein einfaches Beispiel, aber ich habe häufig mehrere Bedingungen, die auf unterschiedliche Weise kombiniert unterschiedliche Ausgaben ergeben sollten, und es wird schwierig, die kompakteste und eleganteste Art und Weise zu finden, um ihre Logik in einem if-Block darzustellen.
Antworten:
Wenn Sie von einer Karnaugh-Karte aus entwerfen, kann der Code auch so aussehen:
quelle
In C # .NET können Sie eine Dictionary-Klasse verwenden, um das Ergebnis ohne IF ELSE zu erhalten. Das Schöne daran ist:
Wenn Sie kein Äquivalent zur Dictionary-Klasse haben, können Sie dasselbe in einer binären Suchfunktion tun.
quelle
Was Sie wollen, ist ein Rete-Algorithmus . Auf diese Weise werden automatisch eine Reihe von Regeln gekämmt und gemäß Ihrer Beschreibung in einem Baum priorisiert.
Es gibt eine Reihe von kommerziellen "Rules Engine" -Systemen, die dies in sehr großem Maßstab tun (Millionen von Regeln), bei denen die Ausführungsgeschwindigkeit von entscheidender Bedeutung ist.
quelle
Hier ist Ihre Bibliothek :) Und Sie müssen keine vollständige K-Tabelle übergeben, sondern nur Felder, die Sie interessieren :) Es wird davon ausgegangen, dass der AND-Operator in der Wahrheitstabelle steht. Wenn Sie mehr Operatoren verwenden möchten, sollten Sie in der Lage sein, diese neu zu schreiben. Sie können eine beliebige Anzahl von Argumenten haben. Eingeschrieben
python
und getestet.quelle
Ordnen Sie die Eingaben einem einzelnen Wert zu und schalten Sie ihn ein:
quelle
Eine Nachschlagetabelle mit Funktionszeigern kann in einigen Situationen gut funktionieren. In C können Sie beispielsweise Folgendes tun:
Dies ist eine gute Lösung, wenn die Anzahl der Eingaben relativ gering ist, da die Anzahl der Einträge in der Tabelle 2 ^^ n sein muss, wobei n die Anzahl der Eingaben ist. 7 oder 8 Eingänge sind möglicherweise überschaubar, 10 oder 12 werden unangenehm. Wenn Sie so viele Eingaben haben, versuchen Sie zunächst, diese auf andere Weise zu vereinfachen (z. B. durch Karnaugh-Karten).
quelle
Schauen Sie sich die Software "Gorgeous Karnaugh" an - sie kann Wahrheitstabellen akzeptieren, die genau wie Ihre Stichprobe sind, analytische boolesche Formeldefinitionen akzeptieren, Lua-Skripte akzeptieren, um Wahrheitstabellen zu erstellen. Als Nächstes zeichnet die Software "Gorgeous Karnaugh" die K-Maps für die genommenen Eingaben, die Sie manuell oder mit dem Logik-Minimierer "Espresso" minimieren können, und erstellt Ausgaben für C / C ++ und einige Hardwaresprachen. Schauen Sie auf die Seite mit den zusammenfassenden Funktionen für "Gorgeous Karnaugh" ( http://purefractalsolutions.com/show.php?a=xgk/gkm)
quelle
if
nach Eingabe einer Wahrheitstabelle etwas anderes als leere s anzeigt.