def test_run_3cnf(self):
        self.assertTrue(run_3cnf(check_3cnf("0|1|10")[1], [0, 0, 1]))
        self.assertFalse(run_3cnf(check_3cnf("0|1|10")[1], [0, 0, 0]))

        self.assertFalse(run_3cnf(check_3cnf("~0|1|10")[1], [1, 0, 0]))
        self.assertTrue(run_3cnf(check_3cnf("~0|1|10")[1], [1, 0, 1]))
        self.assertTrue(
            run_3cnf(check_3cnf("0|1|10&0|11|~100")[1], [0, 0, 1, 0, 0]))
    def test_check_3cnf(self):
        self.assertTrue(check_3cnf("0|1|10")[0])
        self.assertTrue(check_3cnf("~0|1|10")[0])
        self.assertTrue(check_3cnf("~0|~1|~10")[0])
        self.assertTrue(check_3cnf("0|1|10&0|11|~100")[0])

        self.assertFalse(check_3cnf("0")[0])
        self.assertFalse(check_3cnf("0|1|11")[0])
        self.assertFalse(check_3cnf("lajksdh")[0])
        self.assertFalse(check_3cnf("0|10&11|100")[0])
        self.assertFalse(check_3cnf("")[0])
def check_3sat(phi):
    phi, n = check_3cnf(phi)[1:]
    old_rho = {}
    for i in phi:
        for j in i:
            old_rho[(j[-1], len(j))] = True
    rho = {}
    for i in range(n):
        if (i, 1) not in old_rho:
            rho[i] = False
        elif (i, 2) not in old_rho:
            rho[i] = True
    for i in phi:
        for j in range(len(i)):
            i[j] = tuple(i[j])
    phi = set([tuple(i) for i in phi])

    flag = False
    to_remove = []
    for i in phi:
        for j in i:
            if (j[-1] in rho):
                flag = True
        if (flag):
            to_remove += [i]
            flag = False
    for i in to_remove:
        phi.remove(i)
    if (len(phi) == 0):
        return (True, [int(rho[i]) if i in rho else 0 for i in range(n)])
    return dpll(phi, rho, n)
Ejemplo n.º 4
0
def check_3sat(phi):
    correct = check_3cnf(phi)
    if not correct[0]:
        return False
    for n in itertools.count(start=1):
        tms = 0
        for tm_item in generate_all_tms():
            tms += 1
            if (tms == n):
                break
            tm = copy.deepcopy(tm_item)
            for i in range(len(phi)):
                tm.tape[i] = ord(phi[i])
            count = 0
            while (count < n and not tm.make_step()):
                count += 1
            if (tm.make_step()):
                est = [0] * correct[2]
                for i in range(len(est)):
                    est[i] = tm.tape[i]
                if (run_3cnf(correct[1], est)):
                    print(tm_item)
                    print(tm)
                    return (True, est)
        if (n >= 2**(correct[2]) * correct[2]):
            print("Switching to dpll")
            return dpll.check_3sat(phi)
def check_3sat(phi):
    disjuncts, n = check_3cnf(phi)[1:]
    for est in generate_estimations(n):
        if (run_3cnf(copy.deepcopy(disjuncts), est)):
            return (True, est)
    return (False, None)
Ejemplo n.º 6
0
 def if_solution_true(self, phi):
     result = dpll.check_3sat(phi)
     self.assertTrue(result[0])
     self.assertTrue(run_3cnf(check_3cnf(phi)[1], result[1]))