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

use dpll on the dimac formula that was parsed from stdin

Lucas Stadler преди 10 години
родител
ревизия
19c052f5d8
променени са 2 файла, в които са добавени 11 реда и са изтрити 5 реда
  1. 4 4
      rust/solve/src/dpll.rs
  2. 7 1
      rust/solve/src/main.rs

+ 4 - 4
rust/solve/src/dpll.rs

@ -1,8 +1,8 @@
1 1
use std::collections::BTreeSet;
2 2
3
type Var = i32;
4
type BoundVars = BTreeSet<Var>;
5
type Clause = Vec<Var>;
3
pub type Var = i32;
4
pub type BoundVars = BTreeSet<Var>;
5
pub type Clause = Vec<Var>;
6 6
7 7
fn empty_vars() -> BoundVars {
8 8
    BTreeSet::new()
@ -127,7 +127,7 @@ fn test_is_clause_unit() {
127 127
    assert!(!is_clause_unit(vars, vec!(1, 2)));
128 128
}
129 129
130
fn dpll(clauses: Vec<Clause>) -> Option<BoundVars> {
130
pub fn dpll(clauses: Vec<Clause>) -> Option<BoundVars> {
131 131
    fn dpll_inner(stack: &mut Vec<(Var, BoundVars)>, vars: &mut BoundVars, clauses: Vec<Clause>) -> Option<BoundVars> {
132 132
        if clauses.iter().all(|c| is_clause_satisfied(&vars, c.clone())) { // all clauses satisfied, success
133 133
            Some(vars.clone())

+ 7 - 1
rust/solve/src/main.rs

@ -14,6 +14,7 @@ use std::io;
14 14
use std::io::Read;
15 15
16 16
use solve::cnf;
17
use solve::dpll;
17 18
18 19
fn main() {
19 20
    let input: &mut String = &mut String::new();
@ -21,9 +22,14 @@ fn main() {
21 22
	Ok(_) => match cnf::parse_dimac(input) {
22 23
	    Ok(cnf) => {
23 24
		println!("cnf has {} variables and {} clauses", cnf.num_vars, cnf.num_clauses);
24
		for clause in cnf.clauses {
25
		for clause in cnf.clauses.clone() {
25 26
		    println!("{:?}", clause);
26 27
		}
28
29
                match dpll::dpll(cnf.clauses) {
30
                    Some(bindings) => println!("satisfiable: {:?}", bindings),
31
                    None => println!("not satisfiable")
32
                }
27 33
	    }
28 34
	    Err(e) => { println!("Error: {}", e) }
29 35
	},