anthem-rs/src/translate/verify_properties.rs

99 lines
3.0 KiB
Rust
Raw Normal View History

mod head_type;
mod translate_body;
use head_type::*;
use translate_body::*;
2020-01-25 12:55:23 +01:00
2020-02-01 19:20:46 +01:00
pub struct ScopedFormula
{
free_variable_declarations: foliage::VariableDeclarations,
formula: foliage::Formula,
}
pub struct Definitions
{
2020-02-01 21:59:36 +01:00
head_atom_parameters: std::rc::Rc<foliage::VariableDeclarations>,
2020-02-01 19:20:46 +01:00
definitions: Vec<ScopedFormula>,
}
pub fn read(rule: &clingo::ast::Rule) -> Result<(), crate::Error>
{
2020-02-01 21:59:36 +01:00
use super::common::FindOrCreatePredicateDeclaration;
2020-02-01 19:20:46 +01:00
let mut function_declarations = foliage::FunctionDeclarations::new();
let mut predicate_declarations = foliage::PredicateDeclarations::new();
let mut variable_declaration_stack = foliage::VariableDeclarationStack::new();
2020-02-01 15:32:41 +01:00
2020-02-01 17:13:43 +01:00
let head_type = determine_head_type(rule.head(),
2020-02-01 21:59:36 +01:00
|name, arity| predicate_declarations.find_or_create(name, arity))?;
2020-02-01 19:20:46 +01:00
let mut definitions
= std::collections::BTreeMap::<std::rc::Rc<foliage::PredicateDeclaration>, Definitions>::new();
let declare_predicate_parameters = |predicate_declaration: &foliage::PredicateDeclaration|
{
2020-02-01 21:59:36 +01:00
std::rc::Rc::new((0..predicate_declaration.arity)
2020-02-02 02:32:32 +01:00
.map(|_| std::rc::Rc::new(foliage::VariableDeclaration::new("<anonymous>".to_string())))
2020-02-01 21:59:36 +01:00
.collect())
2020-02-01 19:20:46 +01:00
};
2020-02-01 15:32:41 +01:00
2020-02-01 17:13:43 +01:00
match head_type
2020-02-01 15:32:41 +01:00
{
2020-02-01 19:20:46 +01:00
HeadType::SingleAtom(head_atom) =>
{
if !definitions.contains_key(&head_atom.predicate_declaration)
{
definitions.insert(std::rc::Rc::clone(&head_atom.predicate_declaration),
Definitions
{
head_atom_parameters: declare_predicate_parameters(&head_atom.predicate_declaration),
definitions: vec![],
});
}
2020-02-02 02:32:32 +01:00
let definitions = definitions.get_mut(&head_atom.predicate_declaration).unwrap();
2020-02-01 21:59:36 +01:00
variable_declaration_stack.push(std::rc::Rc::clone(&definitions.head_atom_parameters));
2020-02-02 02:32:32 +01:00
let mut definition_arguments = translate_body(rule.body(), &mut function_declarations,
&mut predicate_declarations, &mut variable_declaration_stack)?;
assert_eq!(definitions.head_atom_parameters.len(), head_atom.arguments.len());
let mut head_atom_arguments_iterator = head_atom.arguments.iter();
for head_atom_parameter in definitions.head_atom_parameters.iter()
{
let head_atom_argument = head_atom_arguments_iterator.next().unwrap();
let translated_head_term = crate::translate::common::choose_value_in_term(
head_atom_argument, head_atom_parameter, &mut function_declarations,
&mut variable_declaration_stack)?;
definition_arguments.push(Box::new(translated_head_term));
}
2020-02-01 21:59:36 +01:00
variable_declaration_stack.pop();
2020-02-02 02:32:32 +01:00
let definition = foliage::Formula::And(definition_arguments);
let definition = ScopedFormula
{
free_variable_declarations: variable_declaration_stack.free_variable_declarations,
formula: definition,
};
log::trace!("translated formula: {:?}", definition.formula);
definitions.definitions.push(definition);
2020-02-01 19:20:46 +01:00
},
2020-02-01 21:59:36 +01:00
HeadType::ChoiceWithSingleAtom(_) =>
2020-02-01 17:13:43 +01:00
log::debug!("translating choice rule with single atom"),
HeadType::IntegrityConstraint =>
2020-02-01 17:13:43 +01:00
log::debug!("translating integrity constraint"),
2020-02-02 02:32:32 +01:00
HeadType::Trivial => log::debug!("skipping trivial rule"),
2020-02-01 15:32:41 +01:00
}
Ok(())
2020-01-24 13:32:43 +01:00
}