-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathFormula.java
More file actions
130 lines (115 loc) · 4.1 KB
/
Copy pathFormula.java
File metadata and controls
130 lines (115 loc) · 4.1 KB
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/**
* Feb 3, 2018
* @author Noah Tyler
*/
package satSolver;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.ListIterator;
public class Formula {
private int[] assignedValues;
private int vars, clauses;
private int[][] formulaArr;
private LinkedList<Integer> formula = new LinkedList<>();
public void read(String file){
FormulaReader reader = new FormulaReader();
reader.read(file);
vars = reader.getVariables();
clauses = reader.getClauses();//set vars, clauses, formula array
formulaArr = reader.getFormula();
assignedValues = new int[vars+1];
for(int i = 0; i < clauses; i++)//create formula linkedlist
formula.add(i);
formula.add(-1);//delimiter add
}
public boolean isFormulaEmpty(){
return formula.getFirst() == -1;
}
public boolean isClauseEmpty(int clause){
for(int i : formulaArr[clause]){
if(assignedValues[Math.abs(i)] == 0)
return false;
}
return true;
}
public boolean hasEmptyClause(){
for (int i : formula) {
if(i == -1)//end of unsatisfied clauses
break;
if(isClauseEmpty(i))//check if current clause is empty
return true;
}
return false;
}
public int firstAvailable(){//loop through variables array
for(int i = 1; i <= vars; i++)//find first 0 and return it's index
if(assignedValues[i] == 0)
return i;
return -1;//else returns -1
}
public LinkedList<Integer> separateClauses(){
LinkedList<Integer> returnList = new LinkedList<>();
for (int i : formula) {
if(i == -1)//end of unsatisfied clauses
break;
returnList.add(i);
}
return returnList;
}
public void assign(int var, int value){//assigns the var to value
assignedValues[var] = value;
LinkedList<Integer> satisfiedList = new LinkedList<>();
LinkedList<Integer> unsatisfiedList = new LinkedList<>();
separateClauses().forEach((i) -> {
if(isClauseSatisfied(i))//if clause is satisfied adds it to
satisfiedList.add(i);//satisfied sublist
else
unsatisfiedList.add(i);//else adds to unsatisfied
});
ListIterator<Integer> newFormula;
if(separateClauses().size()+1 > formula.size())
newFormula = formula.listIterator(separateClauses().size());
else
newFormula = formula.listIterator(separateClauses().size()+1);
if(satisfiedList.size() > 0)
satisfiedList.add(-1);
unsatisfiedList.add(-1);
unsatisfiedList.addAll(satisfiedList);
while(newFormula.hasNext()) //reconstructs new formula
unsatisfiedList.add(newFormula.next());
formula = unsatisfiedList;
}
public boolean isClauseSatisfied(int clause){
for(int i : formulaArr[clause]){
if(i < 0){//check if current clause value is negation
if(assignedValues[Math.abs(i)] == -1)
return true;
}
else if(assignedValues[i] == 1)
return true;//current clause value is not negation
}
return false;
}
public void unset(int var){
assignedValues[var] = 0;
int index = 0;
for (int i : formula ) {
if(i == -1){
formula.remove(index);
break;
}
index++;
}
}
public void printAssignment(){//prints assignment array to string
System.out.println("Assigned Variables Array: " +
Arrays.toString(assignedValues));
}
public void printFormula(){//prints formula linkedlist to string
System.out.println("Formula LinkedList: " + formula.toString());
}
public void print(){//prints both assignment array and formula
printAssignment();
printFormula();
}
}