use clingo::*;
use std::env;
fn print_model(model: &Model) {
let atoms = model
.symbols(ShowType::SHOWN)
.expect("Failed to retrieve symbols in the model.");
print!("Model:");
for atom in atoms {
print!(" {}", atom.to_string().unwrap());
}
println!();
}
struct MyEFH;
impl ExternalFunctionHandler for MyEFH {
fn on_external_function(
&mut self,
_location: &Location,
name: &str,
arguments: &[Symbol],
) -> Result<Vec<Symbol>, ExternalError> {
if name == "c" && arguments.len() == 0 {
Ok(vec![Symbol::create_number(42), Symbol::create_number(43)])
} else {
return Err(ExternalError {
msg: "function not found",
});
}
}
}
fn main() {
let options = env::args().skip(1).collect();
let mut ctl = Control::new(options).expect("Failed creating clingo_control.");
ctl.add("base", &[], "p(@c()). p(d). p(e).")
.expect("Failed to add a logic program.");
let mut efh = MyEFH;
let part = Part::new("base", &[]).unwrap();
let parts = vec![part];
ctl.ground_with_event_handler(&parts, &mut efh)
.unwrap_or_else(|e| {
panic!("Failed to ground a logic program. {:?}", e);
});
let mut handle = ctl
.solve(SolveMode::YIELD, &[])
.expect("Failed to retrieve solve handle.");
print_model(handle.model().unwrap().unwrap());
handle.close().expect("Failed to close solve handle.");
}