// blocksol adds the inverse of the solution to the clauses. // This private method does not acquire the lock or check if p is nil. func (p *Pigosat) blocksol(sol Solution) { n := C.picosat_variables(p.p) clause := make([]C.int, n+1) for i := C.int(1); i <= n; i++ { if sol[i] { clause[i-1] = -i } else { clause[i-1] = i } } // int picosat_add_lits (PicoSAT *, int * lits); C.picosat_add_lits(p.p, &clause[0]) }
// AddClauses adds a slice of clauses, each of which are a slice of literals. // Each clause is a list of integers called literals. The absolute value of the // literal i is the subscript for some variable x_i. If the literal is positive, // x_i must end up being true when the formula is solved. If the literal is // negative, it must end up false. Each clause ORs the literals together. All // the clauses are ANDed together. An optional zero ends a clause, even in the // middle of a slice; [1, 0, 2] is the same as [1, 0] is the same as [1]. func (p *Pigosat) AddClauses(clauses Formula) { defer p.ready(false)() var count int for _, clause := range clauses { count = len(clause) if count == 0 { continue } if clause[count-1] != 0 { // 0 tells PicoSAT where to stop reading array clause = append(clause, 0) } // int picosat_add_lits (PicoSAT *, int * lits); C.picosat_add_lits(p.p, (*C.int)(&clause[0])) } }