Eu estou trabalhando em resolver as expressões lógicas em Java compreendendo de E , OU , e NÃO operadores.
O programa tem a saída se a entrada foi TRUE
para quaisquer valores booleanos das variáveis incluídas. Eu tenho feito isso com sucesso, mas não é o suficiente eficiente.
Minha solução atual é assim:
Faça uma tabela de verdade para cada variável na expressão e avaliar linha por linha.
(p ∧ ¬q) ∨ (r ∧ s) ∨ (¬p ∨ u)
No exemplo acima, eu vou ter que avaliar a expressão inteira com uma tabela verdade de variáveis p q r s
.
Agora, eu estou pensando em implementar uma solução alternativa que diz assim: Considere o exemplo acima.
Podemos notar que, mesmo por apenas resolver a p ∧ ¬q
parte, toda a expressão vem a ser TRUE
. Isso nos poupa o incômodo de 3 variáveis extras.
Agora a minha pergunta é essa. Como programar isso em Java? Como eu mesmo começar a saber se a entrada tem um padrão como acima? Ou é apenas uma expressão que eu tenho que avaliar para toda a tabela de verdade? Como a abaixo
(p ∨ ¬q) ∧ (r ∨ (s ∧ (¬p ∨ u)))
Este é um problema NP-completo bem conhecido, ver booleana satisfabilidade problema .
Isto significa que há não é conhecida solução em tempo polinomial, mas há muitas> soluções P lá fora.
Você terá que força bruta-lo e curto-circuito onde você pode. (ex: se todos os operadores são or
e você encontrar um true
valor que você pode parar de computação)