Skip to content

Commit 3a0d65b

Browse files
committed
Corrections v3
1 parent 3bae8f4 commit 3a0d65b

File tree

1 file changed

+34
-68
lines changed

1 file changed

+34
-68
lines changed

other/dpll.py

Lines changed: 34 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
Davis–Putnam–Logemann–Loveland (DPLL) algorithm is a complete,
33
backtracking-based search algorithm for deciding the satisfiability of
44
propositional logic formulae in conjunctive normal form,
5-
i.e, for solving the CNF-SAT problem.
5+
i.e, for solving the Conjunctive Normal Form SATisfiability(CNF-SAT) problem.
66
77
For more information about the algorithm:
88
https://en.wikipedia.org/wiki/DPLL_algorithm
@@ -21,14 +21,12 @@ class Clause:
2121
{A5', A2', A1} is the clause (A5' v A2' v A1)
2222
2323
Create a set of literals and a clause with them
24-
>>> literals = ["A1", "A2'", "A3"]
25-
>>> clause = Clause(literals)
26-
>>> print(clause)
27-
{ A1 , A2' , A3 }
24+
>>> str(Clause(["A1", "A2'", "A3"]))
25+
"{A1 , A2' , A3}"
2826
2927
Create model
30-
>>> model = {"A1": True}
31-
>>> clause.evaluate(model)
28+
>>> clause = Clause(["A1", "A2'", "A3"])
29+
>>> clause.evaluate({"A1": True})
3230
True
3331
"""
3432

@@ -43,16 +41,8 @@ def __init__(self, literals: List[int]) -> None:
4341
def __str__(self) -> str:
4442
"""
4543
To print a clause as in CNF.
46-
Variable clause holds the string representation.
4744
"""
48-
clause = "{ "
49-
for i in range(0, self.no_of_literals):
50-
clause += str(list(self.literals.keys())[i]) + " "
51-
if i != self.no_of_literals - 1:
52-
clause += ", "
53-
clause += "}"
54-
55-
return clause
45+
return "{" + " , ".join(self.literals) + "}"
5646

5747
def assign(self, model: Dict[str, bool]) -> None:
5848
"""
@@ -110,12 +100,9 @@ class Formula:
110100
{{A1, A2, A3'}, {A5', A2', A1}} is ((A1 v A2 v A3') and (A5' v A2' v A1))
111101
112102
Create two clauses and a formula with them
113-
>>> clause1 = Clause(["A1", "A2'", "A3"])
114-
>>> clause2 = Clause(["A5'", "A2'", "A1"])
115-
116-
>>> formula = Formula([clause1, clause2])
117-
>>> print(formula)
118-
{{ A1 , A2' , A3 } , { A5' , A2' , A1 }}
103+
>>> formula = Formula([Clause(["A1", "A2'", "A3"]), Clause(["A5'", "A2'", "A1"])])
104+
>>> str(formula)
105+
"{{A1 , A2' , A3} , {A5' , A2' , A1}}"
119106
"""
120107

121108
def __init__(self, clauses: List[Clause]) -> None:
@@ -128,18 +115,8 @@ def __init__(self, clauses: List[Clause]) -> None:
128115
def __str__(self) -> str:
129116
"""
130117
To print a formula as in CNF.
131-
Variable formula holds the string representation.
132118
"""
133-
formula = "{"
134-
clause_repr = " , "
135-
clauses_as_strings = [str(clause) for clause in self.clauses]
136-
137-
clause_repr = clause_repr.join(clauses_as_strings)
138-
139-
formula += clause_repr
140-
formula += "}"
141-
142-
return formula
119+
return "{" + " , ".join(str(clause) for clause in self.clauses) + "}"
143120

144121

145122
def generate_clause() -> Clause:
@@ -190,15 +167,12 @@ def generate_parameters(formula: Formula) -> (List[Clause], List[str]):
190167
Symbol of A3 is A3.
191168
Symbol of A5' is A5.
192169
193-
>>> clause1 = Clause(["A1", "A2'", "A3"])
194-
>>> clause2 = Clause(["A5'", "A2'", "A1"])
195-
196-
>>> formula = Formula([clause1, clause2])
170+
>>> formula = Formula([Clause(["A1", "A2'", "A3"]), Clause(["A5'", "A2'", "A1"])])
197171
>>> clauses, symbols = generate_parameters(formula)
198172
>>> clauses_list = [str(i) for i in clauses]
199-
>>> print(clauses_list)
200-
["{ A1 , A2' , A3 }", "{ A5' , A2' , A1 }"]
201-
>>> print(symbols)
173+
>>> clauses_list
174+
["{A1 , A2' , A3}", "{A5' , A2' , A1}"]
175+
>>> symbols
202176
['A1', 'A2', 'A3', 'A5']
203177
"""
204178
clauses = formula.clauses
@@ -227,16 +201,14 @@ def find_pure_symbols(
227201
3. Assign value True or False depending on whether the symbols occurs
228202
in normal or complemented form respectively.
229203
230-
>>> clause1 = Clause(["A1", "A2'", "A3"])
231-
>>> clause2 = Clause(["A5'", "A2'", "A1"])
232-
233-
>>> formula = Formula([clause1, clause2])
204+
>>> formula = Formula([Clause(["A1", "A2'", "A3"]), Clause(["A5'", "A2'", "A1"])])
234205
>>> clauses, symbols = generate_parameters(formula)
235206
236-
>>> model = {}
237-
>>> pure_symbols, values = find_pure_symbols(clauses, symbols, model)
238-
>>> print(pure_symbols, values)
239-
['A1', 'A2', 'A3', 'A5'] {'A1': True, 'A2': False, 'A3': True, 'A5': False}
207+
>>> pure_symbols, values = find_pure_symbols(clauses, symbols, {})
208+
>>> pure_symbols
209+
['A1', 'A2', 'A3', 'A5']
210+
>>> values
211+
{'A1': True, 'A2': False, 'A3': True, 'A5': False}
240212
"""
241213
pure_symbols = []
242214
assignment = dict()
@@ -282,15 +254,13 @@ def find_unit_clauses(
282254
>>> clause1 = Clause(["A4", "A3", "A5'", "A1", "A3'"])
283255
>>> clause2 = Clause(["A4"])
284256
>>> clause3 = Clause(["A3"])
257+
>>> clauses, symbols = generate_parameters(Formula([clause1, clause2, clause3]))
285258
286-
>>> formula = Formula([clause1, clause2, clause3])
287-
>>> clauses, symbols = generate_parameters(formula)
288-
289-
>>> model = {}
290-
>>> unit_clauses, values = find_unit_clauses(clauses, model)
291-
292-
>>> print(unit_clauses, values)
293-
['A4', 'A3'] {'A4': True, 'A3': True}
259+
>>> unit_clauses, values = find_unit_clauses(clauses, {})
260+
>>> unit_clauses
261+
['A4', 'A3']
262+
>>> values
263+
{'A4': True, 'A3': True}
294264
"""
295265
unit_symbols = []
296266
for clause in clauses:
@@ -326,18 +296,14 @@ def dpll_algorithm(
326296
3. Find pure symbols.
327297
4. Find unit symbols.
328298
329-
>>> c1 = Clause(["A4", "A3", "A5'", "A1", "A3'"])
330-
>>> c2 = Clause(["A4"])
331-
>>> c3 = Clause(["A3"])
332-
333-
>>> f = Formula([c1, c2, c3])
334-
>>> c, s = generate_parameters(f)
335-
336-
>>> model = {}
337-
>>> soln, model = dpll_algorithm(c, s, model)
299+
>>> formula = Formula([Clause(["A4", "A3", "A5'", "A1", "A3'"]), Clause(["A4"])])
300+
>>> clauses, symbols = generate_parameters(formula)
338301
339-
>>> print(soln, model)
340-
True {'A4': True, 'A3': True}
302+
>>> soln, model = dpll_algorithm(clauses, symbols, {})
303+
>>> soln
304+
True
305+
>>> model
306+
{'A4': True}
341307
"""
342308
check_clause_all_true = True
343309
for clause in clauses:
@@ -389,7 +355,7 @@ def dpll_algorithm(
389355
doctest.testmod()
390356

391357
formula = generate_formula()
392-
print(f"The formula {formula} is", end=" ")
358+
print(f"The formula \n{formula}\n is", end=" ")
393359

394360
clauses, symbols = generate_parameters(formula)
395361

0 commit comments

Comments
 (0)