Просмотр исходного кода

use dpll on the dimac formula that was parsed from stdin

Lucas Stadler лет назад: 10
Родитель
Сommit
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
use std::collections::BTreeSet;
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
fn empty_vars() -> BoundVars {
7
fn empty_vars() -> BoundVars {
8
    BTreeSet::new()
8
    BTreeSet::new()
127
    assert!(!is_clause_unit(vars, vec!(1, 2)));
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
    fn dpll_inner(stack: &mut Vec<(Var, BoundVars)>, vars: &mut BoundVars, clauses: Vec<Clause>) -> Option<BoundVars> {
131
    fn dpll_inner(stack: &mut Vec<(Var, BoundVars)>, vars: &mut BoundVars, clauses: Vec<Clause>) -> Option<BoundVars> {
132
        if clauses.iter().all(|c| is_clause_satisfied(&vars, c.clone())) { // all clauses satisfied, success
132
        if clauses.iter().all(|c| is_clause_satisfied(&vars, c.clone())) { // all clauses satisfied, success
133
            Some(vars.clone())
133
            Some(vars.clone())

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

14
use std::io::Read;
14
use std::io::Read;
15
15
16
use solve::cnf;
16
use solve::cnf;
17
use solve::dpll;
17
18
18
fn main() {
19
fn main() {
19
    let input: &mut String = &mut String::new();
20
    let input: &mut String = &mut String::new();
21
	Ok(_) => match cnf::parse_dimac(input) {
22
	Ok(_) => match cnf::parse_dimac(input) {
22
	    Ok(cnf) => {
23
	    Ok(cnf) => {
23
		println!("cnf has {} variables and {} clauses", cnf.num_vars, cnf.num_clauses);
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
		    println!("{:?}", clause);
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
	    Err(e) => { println!("Error: {}", e) }
34
	    Err(e) => { println!("Error: {}", e) }
29
	},
35
	},