Ich möchte feststellen, ob ein Eingabearray von ganzen Zahlen einem Satz von Regeln "entspricht" oder nicht.Reduzieren komplexer Filterregeln auf eine vergleichbare Form
Der Matcher
Die Matcher
aus einer Reihe von Hilfsmethoden gebaut Regeln für die Eingangsdaten zu beschreiben. Diese Regeln sind im Wesentlichen Logikgatter auf Arrays von ganzen Zahlen:
AND(1, 2) // Requires both 1 AND 2 be present in the input array.
OR(3, 4, 5) // Requires that 3 OR 4 OR 5 be present in the input array.
NOR(6, 7) // Requires that neither 6 NOR 7 be present in the input array.
XOR(8, 9) // Requires that either 8 (X)OR 9 be present in the input array, but not both.
So ich könnte sagen, dass angesichts der Eingangsanordnung:
[0, 1, 2, 3]
ich bauen konnte ein Matcher
wie:
AND(OR(0, 1), AND(1, 2) NOR(4))
Die Eingabe entspricht der Eingabe, da die Eingabe erfüllt:
OR(0, 1) // 0 or 1 is present
AND(1, 2) // Both 1 and 2 are present
NOR(4) // 4 is not present
Und jeder von diesen erfüllt kumulativ die übergeordnete AND
Regel.
Das Problem
muss ich Matcher auf die einfachste und grundlegende Form zu reduzieren, die nach wie vor die Regeln beschreibt. Zum Beispiel kann die oben Matcher gegeben, könnte eine Probe Reduktion sein:
rules = {
or: [1, 2],
xor: [], // No XORs
nor: [4]
}
Jeder rule
hat drei Anordnungen von Unterregeln, die sich aus ganzen Zahlen oder rule
s.
Beachten Sie, dass die ORs leer sind, da 1
sowieso erforderlich ist, was bedeutet, OR(0, 1) => [0, 1]
ist redundant, weil es erfüllt sein muss.
Da Matcher
s müssen vergleichbar sein (Ich muss in der Lage, eine Äquivalenz zwischen den zugrunde liegenden Regeln zu bestimmen), ist es etwas komplizierter wird, wenn ich zu bekommen: Jetzt
input = [1, 2, 5, 9, 11, 12, 13, 14, 17]
XOR(OR(AND(1, 2), NOR(3, 4), XOR(3 11), AND(11, 14)), AND(1, 5, 17))
, eine große Menge Das ist überflüssig und/oder widersprüchlich. Was ich also denken konnte, war, dass ich es zuerst in eine baumartige Struktur bringen und es dann rekursiv darstellen und unnötige Einträge reduzieren konnte. Irgendwelche Ideen für einen besseren Weg, dies zu tun?
Ich bin speziell auf der Suche nach etwas Deterministisch (jede Menge von Regeln, die das gleiche bedeuten, die gleiche endgültige reduzierte Form). Wenn es eine bessere Möglichkeit gibt, dieses Problem auszudrücken, bin ich interessiert, und wenn Regeln widersprüchlich sind, ist es in Ordnung, wenn der Reduzierer bricht und eine Ausnahme auslöst. Dies ist für den gelegentlichen Gebrauch im Programm gedacht, so dass die Leistung kein großes Problem darstellt.
So wurde ich informiert, dass dies ein Fall eines Erfüllbarkeitsproblems sein kann, das NP-vollständig und daher unwahrscheinlich lösbar ist. – AniSkywalker