use clingo::*;
use std::{env, vec};
fn print_model(model: &Model) {
let atoms = model
.symbols(ShowType::SHOWN)
.expect("Failed to retrieve symbols in the model.");
print!("Model:");
for symbol in atoms {
print!(" {}", symbol);
}
println!();
}
fn solve(ctl: Control) {
let mut handle = ctl
.solve(SolveMode::YIELD, &[])
.expect("Failed retrieving solve handle.");
loop {
handle.resume().expect("Failed resume on solve handle.");
match handle.model() {
Ok(Some(model)) => print_model(model),
Ok(None) => break,
Err(e) => panic!("Error: {}", e),
}
}
handle
.get()
.expect("Failed to get result from solve handle.");
handle.close().expect("Failed to close solve handle.");
}
fn main() {
let options = env::args().skip(1).collect();
let mut ctl = control(options).expect("Failed creating clingo_control.");
ctl.add("base", &[], "{a; b; c}.")
.expect("Failed to add a logic program");
let part = Part::new("base", vec![]).unwrap();
let parts = vec![part];
ctl.ground(&parts)
.expect("Failed to ground a logic program.");
let atom_strings = ["a", "b", "c"];
let mut atom_ids = vec![];
{
let mut atoms_iterator = ctl.symbolic_atoms().unwrap().iter().unwrap();
for atom in &atom_strings {
let symbol = Symbol::create_id(atom, true).unwrap();
let item = atoms_iterator
.find(|e| e.symbol().unwrap() == symbol)
.unwrap();
let lit = item.literal().unwrap();
atom_ids.push(lit);
}
}
{
let mut backend = ctl.backend().unwrap();
let atom_d = backend.add_atom(None).unwrap();
let head = vec![atom_d];
let body = vec![atom_ids[0], atom_ids[1]];
backend
.rule(false, &head, &body)
.expect("Failed to add a rule to the program.");
let head = vec![];
let body = vec![SolverLiteral::from(atom_d).negate(), atom_ids[2]];
backend
.rule(false, &head, &body)
.expect("Failed to add a rule to the program.");
}
solve(ctl);
}