UNB/ CS/ David Bremner/ teaching/ cs3383/ lectures/ 50.1-demos/ sat.py
#!/usr/bin/env python3
def backtrack(P0):
    S = [P0]
    while len(S) > 0:
        P = S.pop()
        result = test(P)
        if result == True:
            return P
        elif result == None:
            for R in expand(P):
                S.append(R)
    return False

def test(clauses):
    if (len(clauses)) == 0:
        return True
    for clause in clauses:
        if len(clause)==0:
            return False
    return None

def reduce(clauses,literal):
  out=[]
  for C in clauses:
    if not literal in C:
      new=[z for z in C if z != -1*literal]
      out.append(new)
  return out

def expand(clauses):
  j = clauses[0][0]
  return [reduce(clauses,j),
          reduce(clauses,-j)]

if __name__ == "__main__":
    print(backtrack([ [1], [-1,2] ,[-1,3,4] ]))
    print(backtrack([ [1], [-1,2] ,[-2] ]))