Como posso pegar uma tabela verdade e transformá-la em um bloco compactado se?
Por exemplo, digamos que eu tenha essa tabela de verdade em que A e B são condições e x, ye z são ações possíveis:
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
Isso pode se transformar em abaixo se o bloco:
if(A)
{
if(B)
{
do(x)
}
else
{
do(y)
}
}
else
{
do(z)
}
Esta é uma amostra fácil, mas frequentemente tenho várias condições que combinadas de maneiras diferentes devem produzir saídas diferentes e fica difícil descobrir a maneira mais compacta e elegante de representar sua lógica em um bloco if.
Respostas:
Se você estiver projetando a partir de um mapa de Karnaugh, o código também pode ser assim:
fonte
No C # .NET, você pode usar uma classe Dictionary para obter o resultado sem nenhum IF ELSE da seguinte maneira - A coisa boa sobre isso é:
Se você não tiver um equivalente da classe Dictionary, poderá fazer o mesmo em uma função de pesquisa / pesquisa binária.
fonte
O que você quer é um algoritmo Rete . Isso combina automaticamente um conjunto de regras e as prioriza em uma árvore da maneira que você descreve.
Existem vários sistemas comerciais de "mecanismo de regras" que fazem isso em uma escala muito grande (milhões de regras) em que a velocidade de execução é essencial.
fonte
Aqui está sua biblioteca :) E você não precisa passar a tabela K completa, apenas os campos nos quais está interessado :) Pressupõe que seu operador AND na tabela verdade. Se você quiser usar mais operadores, poderá reescrevê-lo. Você pode ter qualquer número de argumentos. Escrito
python
e testado.fonte
Mapeie as entradas em um único valor e ligue-o:
fonte
Uma tabela de pesquisa contendo ponteiros de funções pode funcionar bem em algumas situações. Em C, por exemplo, você pode fazer algo assim:
Essa é uma boa solução quando o número de entradas é relativamente pequeno, pois o número de entradas na tabela deve ser 2 ^^ n onde n é o número de entradas. 7 ou 8 entradas podem ser gerenciáveis, 10 ou 12 começam a ficar feias. Se você tiver muitas entradas, tente simplificar por outros meios (como mapas de Karnaugh) primeiro.
fonte
Veja o software "Gorgeous Karnaugh" - ele pode aceitar tabelas verdadeiras exatamente como sua amostra, aceitar definição de fórmulas booleanas analíticas, aceitar scripts Lua para criar tabelas verdadeiras. Em seguida, o software "Gorgeous Karnaugh" desenha o K-Maps para entrada, que você pode minimizar manualmente ou usando o minimizador lógico "Espresso" e produz saída para C / C ++ e algumas linguagens de hardware. Consulte a página de recursos resumidos para "Gorgeous Karnaugh" - http://purefractalsolutions.com/show.php?a=xgk/gkm
fonte
if
s vazios depois de inserir uma tabela verdade.