PMR2300 - Computação para Automação Exercício Programa 1 - 2013 Satisfazibilidade booleana (SAT) - Parte 1: Geração de fórmulas proposicionais Prof. Dr. Fabio Gagliardi Cozman Prof. Dr. Newton Maruyama 1 Introdução O Problema de Satisfazibilidade Booleana (SAT) é um problema de decisão. Trata-se da verificação da existência (ou não) de um conjunto de valores booleanos que se atribuídos às proposições que constituem os elementos de uma fórmula proposicional tornam esta fórmula verdadeira. Por exemplo, seja a seguinte fórmula: f1 = (x1 ∨ x2 ) ∧ (¬x1 ∨ x3 ). (1) Será que existe um conjunto de valores booleanos que se atribuídos à (x1 , x2 , x3 ) fariam com que a fórmula f1 seja verdadeira ? Uma das maneiras de resolver este problema seria construindo uma tabela verdade como ilustrado abaixo: x1 0 0 0 0 1 1 1 1 x2 0 0 1 1 0 0 1 1 x3 0 1 0 1 0 1 0 1 (x1 ∨ x2 ) 0 0 1 1 1 1 1 1 (¬x1 ∨ x3 ) 1 1 1 1 0 1 0 1 f1 0 0 1 1 0 1 0 1 Tabela 1: Tabela verdade para a fórmula f1 . Através da construção da tabela verdade sabemos que existem quatro conjuntos de valores (x1 , x2 , x3 ) que tornam a fórmula f verdadeira. Fórmulas proposicionais podem não ser verdadeiras para nenhum conjunto de valores ? Sim, por exemplo: f2 = (x1 ∧ ¬x1 ). 1 (2) Pode-se verificar facilmente que a fórmula f2 não possui valores booleanos para x1 que a tornam verdadeira. O Problema de Satisfazibilidade Booleana se torna de difícil solução a medida que o número de variáveis n cresce. Atualmente, o Problema SAT desperta grande interesse devido a sua aplicação nas áreas de Inteligência Artificial e checagem de modelos de hardware e software. 2 O Problema k-SAT O Problema k-SAT se refere a fórmulas com cláusulas disjuntivas com k literais1 . Particulamente, estamos interessados no Problema 3−SAT. Por exemplo, uma fórmula com quatro variáveis (x1 , x2 , x3 , x4 ) poderia ser a seguinte: f3 = (x1 ∨ ¬x2 ∨ ¬x3 ) ∧ (x1 ∧ x2 ∧ x4 ). (3) A fórmula f3 tem duas cláusulas (Expressão entre parênteses). Cada cláusula possui três literais que podem ser compostos apenas pelo operador de disjunção ∨. A fórmula completa é constituída por cláusulas compostas pelo operador de conjunção ∧. Uma fórmula genérica seria composta por n variáveis, m cláusulas e k literais. 3 Geração aleatória de fórmulas proposicionais Usualmente, objetiva-se o desenvolvimento de algoritmos de SAT. A eficiência destes algoritmos é verificada através de testes onde o algoritmo recebe como entrada uma fórmula proposicional gerada de forma aleátória. A importância desta área é evidenciada pela existência de uma competição internacional de algoritmos SAT (The International SAT Competition Web Page http://www.satcompetition.org/) Neste exercício programa o objetivo será implementar um algoritmo aleatório 3-SAT com distribuição uniforme. Uma fórmula neste caso possui n variáveis com distribuição uniforme, m cláusulas, cada cláusula contendo três literais. Para cada variável, por exemplo x1 , os literais associados possuem probabilidade P = 0.5 cada um, i.e., P (x1 ) = 0.5 e P (¬x1 ) = 0.5. 1 Os literais da variável x1 são representados por x1 e sua negação ¬x1 . 2 4 Representação de Fórmulas proposicionais Para as competições do The International SAT Competition é utilizado um formato do tipo CNF (Conjunctive Normal Form) Você deve utilizar este formato para a representação das fórmulas proposcionais. Detalhes deste formato podem ser encontrados em http://www.satcompetition.org/2009/format-benchmarks2009.html 5 Para você fazer: 1. Projete um algoritmo para gerar fórmulas 3-SAT aleatórios utilizando a Linguagem JAVA. 2. Uma fórmula neste caso possui n variáveis, m cláusulas, cada cláusula contendo três literais. 3. Cada variável é amostrada aleatoriamente de uma distribuição uniforme. Ou seja P (x1 ) = 1/n, P (x2 ) = 1/n, etc. 4. Para cada variável, devemos decidir se devemos negá-la ou não. Esta decisão também deve ser aleatória. Por exemplo, para x1 , os literais associados devem possuir probabilidade P = 0.5 cada um, i.e., P (x1 ) = 0.5 e P (¬x1 ) = 0.5. 5. As fórmulas devem ser armazenadas num arquivo com o formato definido acima. 6. O seu programa deve ser acionado da seguinte forma: java SAT n m nome-do-arquivo-de-saída onde n e m são inteiros positivos. O nome do programa deve ser SAT, ou seja, deve ser declarado no arquivo SAT.java. Coisas importantes: • O exercício deve ser feito individualmente; • Entregue ao monitor da disciplina no dia 11/04/2013 – Documentação impressa descrevendo o seu projeto em uma página A4, – Código fonte e código compilado (bytecode). Pode ser entregue em um CD ou pode ser armazenado em um Pen Drive que o monitor se encarregará de fazer uma cópia dos arquivos no momento da entrega. 3