Untitled
unknown
plain_text
10 months ago
1.4 kB
2
Indexable
import itertools def pl_resolution(clauses): def negate_literal(literal): if literal.startswith('~'): return literal[1:] else: return '~' + literal def resolve(ci, cj): resolvents = [] for di in ci: for dj in cj: if di == negate_literal(dj): new_clause = list(set(ci + cj) - {di, dj}) if new_clause: resolvents.append(new_clause) return resolvents def is_subset(c1, c2): return all(any(x in d for d in c2) for x in c1) new_clauses = clauses[:] while True: new = [] for (ci, cj) in itertools.combinations(new_clauses, 2): resolvents = resolve(ci, cj) for resolvent in resolvents: if not resolvent: return True if not any(is_subset(resolvent, clause) for clause in new_clauses + new): new.append(resolvent) if all(any(is_subset(c, new) for new in new_clauses) for c in new): return False new_clauses.extend(new) # Example usage clauses = [ ['P', 'Q'], ['~P'], ['~Q'] ] if pl_resolution(clauses): print("The set of clauses is unsatisfiable (contradiction found).") else: print("The set of clauses is satisfiable (no contradiction found).")
Editor is loading...
Leave a Comment