Преглед на файлове

implement is_clause_unit

Lucas Stadler преди 10 години
родител
ревизия
9d2e76e077
променени са 1 файла, в които са добавени 29 реда и са изтрити 0 реда
  1. 29 0
      rust/solve/src/dpll.rs

+ 29 - 0
rust/solve/src/dpll.rs

@ -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
}