Question

J'essaie de traduire le pseudocode suivant en QBF. Les entiers sont codés comme de simples vecteurs de bit de largeur fixe, et toute la procédure s'exécute dans l'espace polynomial garantissant que QBF a suffisamment de puissance de représentation pour une formule compacte.

La formule suivante est imbriquée à une profondeur linéaire en n, produisant 2 ^ n incréments lorsqu'il est déroulé. L'utilisation de QBF permet un codage exponentiellement plus compact que SAT. Les solveurs QBF peuvent généralement gérer des milliers de variables, les solveurs SAT gérent des millions. Pour des valeurs même modestes de n, comme n = 30, la déroulement de SAT produirait des milliards de variables (peu pratiques), tandis qu'un codage QBF serait extrêmement pratique avec seulement des dizaines de variables.

counter = 0
for loop_aux_0 in {0,1}:
  for loop_aux_1 in {0,1}:
    for loop_aux_2 in {0,1}:
      .
        .
          .
            for loop_aux_n in {0,1}: 
              counter += f(loop_aux_0, loop_aux_1, .., loop_aux_n)
assert(counter > 0)

Ici f est une fonction arbitraire qui produit 0 ou 1.

Cela suggère une implémentation QBF (bien que l'initialisation manquante) en utilisant un circuit d'addition

∃ Counter [n] ∀ LOOP_AUX [n] ∃ f_Output [1] (COMPRESS + = f_Output) & (f_output == f (loop_aux_0, loop_aux_1, .., loop_aux_n))

Comment puis-je ajouter des clauses ou des variables auxiliaires pour simuler la contre-initialisation séquentielle?

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à cs.stackexchange
scroll top