|
|
@ -97,3 +97,32 @@ fn test_is_clause_conflict() {
|
|
97
|
97
|
assert!(!is_clause_conflict(&from_vec(vec!(1)), vec!(1)));
|
|
98
|
98
|
assert!(!is_clause_conflict(&from_vec(vec!(2)), vec!(1, 2)));
|
|
99
|
99
|
}
|
|
|
100
|
|
|
|
101
|
/// A unit clause is a clause where one atom is unknown and all
|
|
|
102
|
/// others are false.
|
|
|
103
|
fn is_clause_unit(vars: &BoundVars, clause: Clause) -> bool {
|
|
|
104
|
let mut unknowns = 0;
|
|
|
105
|
|
|
|
106
|
for v in clause {
|
|
|
107
|
if is_unknown(vars, v) {
|
|
|
108
|
unknowns += 1
|
|
|
109
|
}
|
|
|
110
|
|
|
|
111
|
if unknowns > 1 || is_true(vars, v) {
|
|
|
112
|
return false
|
|
|
113
|
}
|
|
|
114
|
}
|
|
|
115
|
|
|
|
116
|
return unknowns == 1
|
|
|
117
|
}
|
|
|
118
|
|
|
|
119
|
#[test]
|
|
|
120
|
fn test_is_clause_unit() {
|
|
|
121
|
let vars = &from_vec(vec!(1, 2));
|
|
|
122
|
assert!(is_clause_unit(vars, vec!(3)));
|
|
|
123
|
assert!(is_clause_unit(vars, vec!(-1, 3)));
|
|
|
124
|
assert!(is_clause_unit(vars, vec!(-1, -2, 3)));
|
|
|
125
|
assert!(!is_clause_unit(vars, vec!(1, 3)));
|
|
|
126
|
assert!(!is_clause_unit(vars, vec!(1, 2, 3)));
|
|
|
127
|
assert!(!is_clause_unit(vars, vec!(1, 2)));
|
|
|
128
|
}
|