-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsat.sql
114 lines (97 loc) · 2.19 KB
/
sat.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
-- SAT Solver for formulae in 3-CNF, implemented in SQL
-- Lorenz Leutgeb <[email protected]>
-- Note that any propositional formula can be
-- translated into an equivalent formula in 3-CNF.
-- Run as follows:
-- psql -q < sat.sql
-- Implementation --------------------------------------------------------------
-- Unary clauses
create temporary table clause1 (l1 bool);
insert into clause1 values
(true);
-- Binary claues
create temporary table clause2 (l1 bool, l2 bool);
insert into clause2 values
(false, true),
( true, false);
-- Ternary clauses
create temporary table clause3 (l1 bool, l2 bool, l3 bool);
insert into clause3 values
(false, false, true),
(false, true, false),
(false, true, true),
( true, false, false),
( true, false, true),
( true, true, false),
( true, true, true);
-- Literals (can be captured by binary clauses)
create temporary view literal (x, nx) as select * from clause2;
-- Test ------------------------------------------------------------------------
-- 1
-- Example Formula:
-- p implies (q xor r)
--
-- Translated into conjunctive normal form:
-- (~p or q or r) and (~p or ~q or ~r)
--
-- Models:
-- Vacously (p is false):
-- {}, {q}, {q,r}, {r}
-- Exclusive or (p is true, and q is the negation of p):
-- {p,q}, {q,r}
select distinct
-- Read off the assignment for all variables
p.x as p,
q.x as q,
r.x as r
from
-- Declare clauses
clause3 as c1,
clause3 as c2,
-- Declare literals for variables
literal as p,
literal as q,
literal as r
where
-- Define first clause
c1.l1 = p.nx and
c1.l2 = q.x and
c1.l3 = r.x and
-- Define second clause
c2.l1 = p.nx and
c2.l2 = q.nx and
c2.l3 = r.nx ;
-- Expected Output:
-- p | q | r
-- ---+---+---
-- t | t | f
-- t | f | t
-- f | t | t
-- f | t | f
-- f | f | t
-- f | f | f
-- (6 rows)
-- 2
-- Example Formula
-- p and ~p
--
-- Models: NONE
select distinct
-- Read off the assignment for all variables
p.x as p
from
-- Declare clauses
clause1 as c1,
clause1 as c2,
-- Declare literals for variables
literal as p
where
-- Define first clause
c1.l1 = p.x and
-- Define second clause
c2.l1 = p.nx ;
-- Expected Output:
-- p
-- ---
-- (0 rows)
-- Tested with PostgreSQL 9.6.8