Jak mogę wziąć tabelę prawdy i zmienić ją w kompaktowy blok if?
Załóżmy na przykład, że mam tabelę prawdy, w której A i B są warunkami, a x, y i z są możliwymi akcjami:
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
To może przekształcić się w poniżej, jeśli blok:
if(A)
{
if(B)
{
do(x)
}
else
{
do(y)
}
}
else
{
do(z)
}
Jest to łatwa próbka, ale często mam kilka warunków, które łączone na różne sposoby powinny dawać różne wyniki i trudno jest znaleźć najbardziej kompaktowy i elegancki sposób przedstawienia ich logiki w bloku if.
Odpowiedzi:
Jeśli projektujesz z mapy Karnaugh, kod może równie dobrze wyglądać w ten sposób:
źródło
W języku C # .NET można użyć klasy Dictionary, aby uzyskać wynik bez IF IFSE w następujący sposób - miłą rzeczą jest to:
Jeśli nie masz odpowiednika klasy Dictionary, możesz zrobić to samo w funkcji binarnego wyszukiwania / wyszukiwania.
źródło
Co chcesz to algorytm Rete . To automatycznie przeczesuje zestaw reguł i nadaje im priorytety w drzewie, tak jak to opisujesz.
Istnieje wiele komercyjnych systemów „silnika reguł”, które robią to na bardzo dużą skalę (miliony reguł), w których niezbędna jest szybkość wykonywania.
źródło
Oto twoja biblioteka :) I nie musisz przekazywać pełnej tabeli K, tylko pola, którymi jesteś zainteresowany :) Zakłada, że jej operator AND w tabeli prawdy. Jeśli chcesz użyć większej liczby operatorów, powinieneś mieć możliwość przepisania go. Możesz mieć dowolną liczbę argumentów. Napisane
python
i przetestowane.źródło
Zamapuj dane wejściowe na jedną wartość, a następnie włącz ją:
źródło
Tabela przeglądowa zawierająca wskaźniki funkcji może działać dobrze w niektórych sytuacjach. Na przykład w C możesz zrobić coś takiego:
Jest to dobre rozwiązanie, gdy liczba danych wejściowych jest względnie mała, ponieważ liczba pozycji w tabeli musi wynosić 2 ^ ^ n, gdzie n jest liczbą danych wejściowych. 7 lub 8 wejściami może być zarządzalnych, 10 lub 12 zaczyna być brzydkich. Jeśli masz tak wiele danych wejściowych, spróbuj najpierw uprościć w inny sposób (np. Mapy Karnaugh).
źródło
Spójrz na oprogramowanie „Gorgeous Karnaugh” - może przyjmować tabele prawdy całkiem dokładnie jak twoja próbka, akceptuje definicję analitycznych formuł boolowskich, akceptuje skrypty Lua, aby budować tabele prawdy. Następnie oprogramowanie „Gorgeous Karnaugh” rysuje mapy K dla pobranych danych, które można zminimalizować ręcznie lub przy użyciu minimalizatora logiki „Espresso”, i wytwarza dane wyjściowe dla C / C ++ i niektórych języków sprzętowych. Zajrzyj na stronę z podsumowaniem funkcji „Gorgeous Karnaugh” - http://purefractalsolutions.com/show.php?a=xgk/gkm
źródło
if
po wejściu do tabeli prawdy nie udało mi się uzyskać kodu C / C ++ do pokazywania niczego poza pustymi literami.