How to reduce k-independent set problem to 3-SAT - algorithm

So I got this homework question and we are asked to reduce a k-independent set satisfiability problem to a 3-SAT set of clauses under the conjunctive normal form.
So for G(V, E) we have verticies set V = {x1, x2, x3, x4, x5, x6} and edges set E = { e1 = (x1,x3), e2 = (x1,x5), e3 = (x1,x6), e4 = (x2,x5), e5 = (x2,x6), e6 = (x3,x4), e7 = (x3,x5), e8 = (x5,x6) }
My first approach to this is to have a clause per edge as we can't have an edge between two vertex in the independent set :
e1: (¬x1 v ¬x3)
e2: (¬x1 v ¬x5)
e3: (¬x1 v ¬x6)
e4: (¬x2 v ¬x5)
e5: (¬x2 v ¬x6)
e6: (¬x3 v ¬x4)
e7: (¬x3 v ¬x5)
e8: (¬x5 v ¬x6)
But the problem is, for k = 3 for example, how to write clauses to ensure that at least 3 different variables (xi) are set to true ?
This is achievable using Weighted-2-satisfiability, but seems hard to achieve just using good old 3-SAT.
Any hints to how to proceed ?

If it's this G and k = 3 that you care about, it's probably easiest to write clauses (xi ∨ xj ∨ xk ∨ xℓ) for all {i, j, k, ℓ} ⊆ V and then reduce them to 3-CNF, e.g., (x ∨ y ∨ z ∨ w) becomes (v ∨ x ∨ y) ∧ (¬v ∨ z ∨ w), where v is a new variable.
In general, you're going to want to
Define a Boolean circuit to compute x1 + … + xn ≥ k (you can evaluate x1 + … + xn − k in two's complement arithmetic using ripple-carry adders and then invert the sign bit).
Translate this circuit into a 3-CNF formula. First, replace gates with more than two inputs with several two-input gates. Then for each node in the circuit create a variable. For each gate write four clauses constraining the output, one for each possible input, e.g., if there's an AND gate with inputs x and y and output z, then write clauses (x ∨ y ∨ ¬z) ∧ (x ∨ ¬y ∧ ¬z) ∧ (¬x ∨ y ∨ ¬z) ∧ (¬x ∨ ¬y ∨ z). A XOR gate would be (x ∨ y ∨ ¬z) ∧ (x ∨ ¬y ∧ z) ∧ (¬x ∨ y ∨ z) ∧ (¬x ∨ ¬y ∨ ¬z).

Related

Boolean formula for a graph colouring algorithm

I have a graph which has 5 vertexes.
Graph g1 = new Graph(5);
g1.addEdge(0, 1);
g1.addEdge(0, 2);
g1.addEdge(1, 2);
g1.addEdge(1, 3);
g1.addEdge(3, 2);
g1.addEdge(3, 4);
g1.addEdge(4, 2);
System.out.println("Coloring of graph 1");
g1.greedyColoring();
I need to express the problem of coloring this graph as a boolean expression.
Suppose a, b, and c are three colours, and the literal ai means vertex i has color a. Then the above graph could be colored like this:
a0, b1, c2, a3, b4
How can I get a boolean formula that, when satisfied, provides a solution for coloring this graph?
You are looking for coloring all vertices in a graph, each with one out of three available colors, such that no two adjacent nodes have the same color.
There are thus three types of conditions:
1. Two adjacent nodes cannot have the same color
So for instance, the edge (0, 1) will imply these three constraints:
Node 0 and 1 cannot both have color a
Node 0 and 1 cannot both have color b
Node 0 and 1 cannot both have color c
Translated into a boolean expression:
¬a0 ∨ ¬a1
¬b0 ∨ ¬b1
¬c0 ∨ ¬c1
You would need to generate such triplets of disjunctions for all edges. So in total you'll have 3 x 7 = 21 boolean disjunctions:
¬a0 ∨ ¬a1 ¬a0 ∨ ¬a2 ¬a1 ∨ ¬a2 ¬a1 ∨ ¬a3 ¬a3 ∨ ¬a2 ¬a3 ∨ ¬a4 ¬a4 ∨ ¬a2
¬b0 ∨ ¬b1 ¬b0 ∨ ¬b2 ¬b1 ∨ ¬b2 ¬b1 ∨ ¬b3 ¬b3 ∨ ¬b2 ¬b3 ∨ ¬b4 ¬b4 ∨ ¬b2
¬c0 ∨ ¬c1 ¬c0 ∨ ¬c2 ¬c1 ∨ ¬c2 ¬c1 ∨ ¬c3 ¬c3 ∨ ¬c2 ¬c3 ∨ ¬c4 ¬c4 ∨ ¬c2
2. All nodes must get a color
So for instance, for node 0 we will have this constraint:
Node 0 must have color a, b, or c
Translated into a boolean expression:
a0 ∨ b0 ∨ c0
You would need to do the same for all nodes, so in total you'll have 5 such expressions:
a0 ∨ b0 ∨ c0
a1 ∨ b1 ∨ c1
a2 ∨ b2 ∨ c2
a3 ∨ b3 ∨ c3
a4 ∨ b4 ∨ c4
3. No nodes can get more than one color
So for instance, for node 0 we will have:
Node 0 cannot have both color a and b
Node 0 cannot have both color a and c
Node 0 cannot have both color b and c
Translated into a boolean expression:
¬a0 ∨ ¬b0
¬a0 ∨ ¬c0
¬b0 ∨ ¬c0
You would need to do the same for all nodes, so in total you'll have 3 * 5 = 15 such expressions for this type:
¬a0 ∨ ¬b0 ¬a1 ∨ ¬b1 ¬a2 ∨ ¬b2 ¬a3 ∨ ¬b3 ¬a4 ∨ ¬b4
¬a0 ∨ ¬c0 ¬a1 ∨ ¬c1 ¬a2 ∨ ¬c2 ¬a3 ∨ ¬c3 ¬a4 ∨ ¬c4
¬b0 ∨ ¬c0 ¬b1 ∨ ¬c1 ¬b2 ∨ ¬c2 ¬b3 ∨ ¬c3 ¬b4 ∨ ¬c4
Conclusion
All the above disjunctions (there are 21 + 5 + 15 = 41 of them) need to be true (conjugated). Such a problem is a Boolean satisfiability problem, and more particularly 3-SAT, and is an NP-Complete problem.
Code to produce the boolean expressions
The following code assumes that the Graph object will exposes a nodes list where each node has an id and neighbors.
The disjunctions are output as strings, each on a separate line:
Graph g1 = new Graph(5);
g1.addEdge(0, 1);
g1.addEdge(0, 2);
g1.addEdge(1, 2);
g1.addEdge(1, 3);
g1.addEdge(3, 2);
g1.addEdge(3, 4);
g1.addEdge(4, 2);
char colors[] = {'a', 'b', 'c'};
// Type 1
for (Node node : g1.nodes) {
for (Node neighbor : node.neighbors) {
for (char color : colors) {
System.out.println(String.format("¬%1$c%2$d ∨ ¬%1$c%3$d", color, node.id, neighbor.id));
}
}
}
// Type 2
for (Node node : g1.nodes) {
String expr[] = new String[colors.length];
int i = 0;
for (char color : colors) {
expr[i++] = String.format("%s%d", color, node.id);
}
System.out.println(String.join(" ∨ ", expr));
}
// Type 3
for (Node node : g1.nodes) {
for (char color1 : colors) {
for (char color2 : colors) {
if (color1 < color2) {
System.out.println(String.format("¬%1$c%3$d ∨ ¬%2$c%3$d", color1, color2, node.id));
}
}
}
}
See it run on repl.it.
You get an equation for each edge and connect them with and (ci is the color used for vertex i):
c0 != c1 && c0 != c2 && c1 != c2 && c1 != c3 && c2 != c3 && c2 != c4 && c3 != c4
The boolean formula only checks if you have found a valid coloring for the graph, not if the number of colors is minimized.

Converting Not All Equal 2-Sat Pr0blem to an equivalent 2-SAT pr0blem

I'm looking over previous exam papers, and have come across this question which has confused me.
Question:
Convert the Not-All-Equal 2-SAT problem given by the clauses {x1, x2}, {x2, x3}, {x3, x4}, {x4, x5}, {x5, x1} to an equivalent 2-SAT problem. (Hint: the 2-SAT problem contains 10 clauses).
From my understanding, is this simply finding the negation for each literal in every clause? So for example, {x1, x2} = {-x1, -x2}, and this is done for each clause?
Is this correct?
That is correct. Specifically, replace all clauses (x ∨ y) with (x ∨ y) ∧ (~x ∨ ~y). That literally says "x or y have to be true, and x or y have to be false", or equivalently "satisfy (x ∨ y) while making sure that one of x and y is false".
To prove the equivalence, let us first assume that the NAE 2-SAT problem is satisfiable. Let A be a satisfying assignment and let {x, y} be one arbitrary clause. Since exactly one of x and y are true, this implies that (x ∨ y) ∧ (~x ∨ ~y) is true. Hence, the corresponding two clauses in the 2-SAT formula are satisfied. Since {x, y} was chosen arbitrarily, we conclude that A satisfies all the clauses in the 2-SAT formula.
Conversely, let us assume that the NAE 2-SAT is not satisfiable. That is, for any assignment, there exists some clause {x, y} for which x and y are either both true or both false. Let A be an arbitrarily chosen assignment and let {x, y} be a clause that A does not satisfy (in the NAE 2-SAT). Since x = y, this implies that (x ∨ y) ∧ (~x ∨ ~y) is false (because one of the halves of the conjunction will be false). Hence, A does not satisfy the 2-SAT formula. Since A was chosen arbitrarily, we conclude that no assignment satisfies the 2-SAT formula.

Proof by resolution - Artificial Intelligence

I'm working with an exercise where I need to show that KB |= ~D.
And I know that the Knowledge Base is:
- (B v ¬C) => ¬A
- (¬A v D) => B
- A ∧ C
After converting to CNF:
A ∧ C ∧ (¬A v ¬B) ∧ (¬A v C) ∧ (A v B) ∧ (B v ¬D)
So now I have converted to CNF but from there, I don't know how to go any further. Would appreciate any help. Thanks!
The general resolution rule is that, for any two clauses
(that is, disjunctions of literals)
P_1 v ... v P_n
and
Q_1 v ... v Q_m
in your CNF such that there is i and j with P_i and Q_j being the negation of each other,
you can add a new clause
P_1 v ... v P_{i-1} v P_{i+1} ... v P_n v Q_1 v ... v Q_{j-1} v Q_{j+1} ... v Q_m
This is just a rigorous way to say that you can form a new clause by joining two of them, minus a literal with opposite "signs" in each.
For example
(A v ¬B)∧(B v ¬C)
is equivalent to
(A v ¬B)∧(B v ¬C)∧(A v ¬C),
by joining the two clauses while removing the opposites B and ¬B, obtaining A v ¬C.
Another example is
A∧(¬A v ¬C)
which is equivalent to
A∧(¬A v ¬C) ∧ ¬C.
since A counts as a clause with a single literal (A itself). So the two clauses are joined, while A and ¬A are removed, yielding a new clause ¬C.
Applying this to your problem, we can resolve A and ¬A v ¬B, obtaining ¬B.
We then resolve this new clause ¬B with B v ¬D, obtaining ¬D.
Because the CNF is a conjunction, the fact that it holds means that every clause in it holds. That is to say, the CNF implies all of its clauses. Since ¬D is one of its clauses, ¬D is implied by the CNF. Since the CNF is equivalent to the original KB, the KB implies ¬D.

Formal Methods, Logic and VDM past exam paper questions

I was hoping someone can help me with the following questions, answers would be best but if you can point me in the right direction that will be helpful also.
I am a final year uni student and these questions are from a previous exam on Formal Methods and I could do with knowing the answers ready for this years paper. Our lecturer does not seem the best and has not covered a lot of this and so finding the exact answer has been proving impossible. Google has not been much of a help nor has the recommended books.
1 - Given that ∃x • P (x) is logically equivalent to ¬∀x • ¬P (x) and that
∀x ∈ S • P (x) means ∀x • x ∈ S ⇒ P (x), deduce that ∃x ∈ S • P (x)
means ∃x • x ∈ S ∧ P (x)
2 - Describe the two statements that would have to be proved to show that
the definition:
max(i, j)
if i>j
then i
else j
is a correct implementation of the specification:
max(i : Z, j : Z)r : Z
pre true
post (r = i ∨ r = j) ∧ i ≤ r ∧ j ≤ r
The first is really just manipulation of symbols using the given and two other well-known logical equivalences:
(1) ∃x • P(x) is logically equivalent to ¬∀x • ¬P(x)
(2) ∀x∈S • P(x) means ∀x • x∈S ⇒ P(x)
∃x∈S • P(x)
== ¬∀x∈S • ¬P(x) (from (1))
== ¬∀x • x∈S ⇒ ¬P(x) (from (2))
== ¬∀x • ¬x∈S v ¬P(x) (from def. of ⇒)
== ¬∀x • ¬(x∈S ∧ P(x)) (from ¬A v ¬B == ¬(A ∧ B))
== ∃x • x∈S ∧ P(x) (from (1) -- the other way around)
For the second, you need to recognize that the outcome of max(i, j) will be computed along one of two paths: one, when i<j and the other when i>=j (the logical negation of i<j)
So you need to show that
if true ∧ i<j (precondition), then (r=i ∨ r=j) ∧ i≤r ∧ j≤r (post condition), and
if true ∧ i>=j (precond.) then (r=i ∨ r=j) ∧ i≤r ∧ j≤r (post cond.),
where r is the result of max(i, j)
But section 2 of your question does not make sense since any implementation that returns either i or j is correct.
The specification is wrong.
A correct postcondition is
post (i > j => r = i) v (i <= j => r = j)

Proving the Associativity of OR

I need help proving the following:
(a ∨ b) ∨ c = a ∨ (b ∨ c)
I don't want the answer... just a hint that will help me understand the process of proving this.
Thank you.
Why not just prove it by doing all possible values of a, b and c = True, False? -- there are only 2^3 = 8 different cases.
Here's a start, for a=T, b=F, c=T
(a v b) v c = a ∨ (b ∨ c)
(T v F) v T = T v (F v T)
T v T = T v T
T = T
(However, this isn't really a programming question...)
What is your axiom set?
Not knowing the set, you could build a truth table

Resources