2015-09-17 7 views
9

Sto cercando di risolvere una grande formula CNF utilizzando un SAT solver. La formula (in formato DIMACS) ha 4,697,898,048 = 2^32 + 402,930,752 clausole, e tutti i solutori SAT che ho trovato sono problemi con esso:Risoluzione SAT con più di 2^32 clausole

  • (P)lingeling rapporti che ci sono "troppe clausole" (vale a dire più clausole che la riga di intestazione specifica, ma questo non è il caso)
  • CryptoMiniSat4 & picosat pretesa di leggere la riga di intestazione come dicendo 402,930,752 clausole che sono 2^32 troppo pochi
  • Glucose sembra analizzare 98,916,961 clausole e poi reports to have solved the formula as UNSAT utilizzando semplificazione, ma t il suo è improbabile che sia corretto (un segmento iniziale della formula questo breve è molto probabile che sia SAT).

Qualcuno è a conoscenza di un solutore SAT in grado di gestire file così grandi? O c'è qualcosa come un interruttore del compilatore che può aggirare questo tipo di comportamento? Credo che tutti i solutori siano compilati per 64bit linux. (Sono un po 'un noob quando si tratta di gestire numeri così grandi, mi dispiace.)

+0

Forse puoi provare un solutore SAT distribuito. –

+0

Questi OSS sono? È possibile modificarli per utilizzare interi 64b. – Jeff

+0

@Jeff: sì, sono tutti open source C o forse C++, non so come dire la differenza. –

risposta

5

Sono lo sviluppatore di CryptoMiniSat. Nella maggior parte dei casi in cui il CNF è così grande, il problema non è il solutore SAT, ma la traduzione del problema originale in CNF non è stata eseguita con sufficiente attenzione. Presumo che tu non abbia scritto questo CNF a mano - hai avuto un problema che hai tradotto in CNF usando uno strumento automatico.

L'atto di tradurre un problema in CNF è chiamato codifica e ha un'enorme letteratura nel mondo accademico. È un argomento intero per se stesso, o più appropriatamente, interi argomenti a se stessi. Si prega di consultare i documenti di ricerca su Constraint Programming (CP), Pseudo-boolean constraints (PB), tecniche di traduzione ANF-a-CNF (vedi workshop/conferenze di cripto) e codifica dei circuiti elettronici (ricerca di AIG, codifica di Tseitin e sue varianti e aspetto ai riferimenti). Questi sono i grandi argomenti, ma ce ne sono molti altri. Dare una sbirciatina a questi ridurrà il tuo CNF di almeno 3 ordini di grandezza, probabilmente di più.

+0

Mille grazie per la tua risposta. Per il mio problema specifico, l'unico modo per una codifica equivalente più piccola mi sembra ottenere approfondimenti relativamente profondi sulla rottura della simmetria e sono pessimista. Tutti i linguaggi delle specifiche più espressivi che hai menzionato non consentirebbero una codifica più concisa in questo caso: il mio problema è espresso in modo del tutto naturale nel CNF, e in particolare nessuna delle variabili è ridondante (fino alla propagazione delle unità e alle potenziali simmetrie) - succede solo che sto cercando un oggetto enorme. –

+0

Purtroppo, non sono sicuro che sia espresso naturalmente in CNF, dato che ci vogliono più di 4 miliardi di clausole per esprimerlo. Probabilmente potresti esprimere il chip Apple A8 con quelle molte clausole, e questo è un sistema molto complesso che ha richiesto decine di migliaia di anni di progettazione per progettare. Ti suggerisco di guardare modi alternativi per esprimere il tuo problema. –

Problemi correlati