Estou analisando vários solucionadores de SAT e tentando entender como eles funcionam e por que são projetados de determinadas maneiras. (Mas eu não estou em uma universidade no momento e não conheço ninguém que seja professor. Então, estou postando aqui esperando que alguém possa me ajudar. Eu realmente aprecio.)
No Chaff , o BCP (Propagação de Restrições Booleanas) é implementado de maneira diferente do DPLL original : ele faz isso assistindo dois literais de cada vez (uma técnica ligeiramente diferente daquela inicialmente sugerida em SATO: Um Provedor Proposicional Eficiente ), de acordo com o artigo de 2001, Chaff: Projetando um Solucionador SAT Eficiente . Entretanto, não há menção à pura eliminação literal neste artigo.
Em A complexidade da eliminação literal pura , Jan Johannsen escreveu
As melhores implementações atuais de solucionadores SAT do tipo DLL, como Chaff ou BerkMin, sacrificam essa heurística para obter eficiência na propagação da unidade.
onde "essa heurística" está se referindo à pura eliminação literal. Minha compreensão do que a eliminação literal pura faz é que
- pesquisa todos os literais unipolares (ou puros)
- atribui um valor booleano a eles, de modo que cada um produza
True
- Nesse caso, agora podemos excluir todas as cláusulas que as contêm
Aqui está a minha pergunta:
Como o sacrifício é necessário? Existe uma boa razão pela qual a eliminação literal pura está ausente em algoritmos baseados em DPLL como o Chaff? Não podemos simplesmente eliminar o literal literalmente em cada nível de decisão (ou pelo menos fazê-lo no início antes da ramificação)?