Implement tightness check

This commit is contained in:
2020-05-29 14:57:00 +02:00
parent b94ee5134a
commit 93db8d02b5
7 changed files with 178 additions and 121 deletions

View File

@@ -149,9 +149,6 @@ impl<'p> Translator<'p>
let completed_definition = completed_definition(predicate_declaration,
&mut self.definitions);
*predicate_declaration.dependencies.borrow_mut() =
Some(crate::collect_predicate_declarations(&completed_definition));
let statement_name =
format!("completed_definition_{}", predicate_declaration.tptp_statement_name());
@@ -203,8 +200,20 @@ impl<'p> Translator<'p>
let parameters_layer =
crate::VariableDeclarationStackLayer::bound(&free_layer, parameters);
let mut predicate_dependencies =
head_atom.predicate_declaration.dependencies.borrow_mut();
if predicate_dependencies.is_none()
{
*predicate_dependencies = Some(crate::PredicateDependencies::new());
}
// The conditional assignment above ensures unwrapping to be safe
let mut dependencies = predicate_dependencies.as_mut().unwrap();
let mut definition_arguments =
translate_body(rule.body(), self.problem, &parameters_layer)?;
translate_body(rule.body(), self.problem, &parameters_layer,
&mut Some(&mut dependencies))?;
// TODO: refactor
assert_eq!(predicate_definitions.parameters.len(), head_atom.arguments.len());
@@ -263,7 +272,8 @@ impl<'p> Translator<'p>
let free_layer =
crate::VariableDeclarationStackLayer::Free(free_variable_declarations);
let mut arguments = translate_body(rule.body(), self.problem, &free_layer)?;
let mut arguments = translate_body(rule.body(), self.problem, &free_layer,
&mut None)?;
// TODO: refactor
let free_variable_declarations = match free_layer

View File

@@ -1,6 +1,7 @@
// TODO: rename context
pub(crate) fn translate_body_term<C>(body_term: &clingo::ast::Term, sign: clingo::ast::Sign,
context: &C, variable_declaration_stack: &crate::VariableDeclarationStackLayer)
context: &C, variable_declaration_stack: &crate::VariableDeclarationStackLayer,
head_predicate_dependencies: &mut Option<&mut crate::PredicateDependencies>)
-> Result<crate::Formula, crate::Error>
where
C: foliage::FindOrCreateFunctionDeclaration<crate::FoliageFlavor>
@@ -26,6 +27,32 @@ where
|parameter| crate::Term::variable(std::rc::Rc::clone(parameter)))
.collect::<Vec<_>>();
if let Some(head_predicate_dependencies) = head_predicate_dependencies
{
match head_predicate_dependencies.get_mut(&predicate_declaration)
{
None =>
{
let predicate_dependency_sign = match sign
{
clingo::ast::Sign::None
| clingo::ast::Sign::DoubleNegation => crate::PredicateDependencySign::OnlyPositive,
clingo::ast::Sign::Negation => crate::PredicateDependencySign::OnlyNegative,
};
head_predicate_dependencies.insert(
std::rc::Rc::clone(&predicate_declaration), predicate_dependency_sign);
},
Some(predicate_dependency_sign) =>
*predicate_dependency_sign = match sign
{
clingo::ast::Sign::None
| clingo::ast::Sign::DoubleNegation => predicate_dependency_sign.and_positive(),
clingo::ast::Sign::Negation => predicate_dependency_sign.and_negative(),
},
}
}
let predicate = crate::Formula::predicate(predicate_declaration, predicate_arguments);
let predicate_literal = match sign
@@ -59,7 +86,8 @@ where
}
pub(crate) fn translate_body_literal<C>(body_literal: &clingo::ast::BodyLiteral,
context: &C, variable_declaration_stack: &crate::VariableDeclarationStackLayer)
context: &C, variable_declaration_stack: &crate::VariableDeclarationStackLayer,
head_predicate_dependencies: &mut Option<&mut crate::PredicateDependencies>)
-> Result<crate::Formula, crate::Error>
where
C: foliage::FindOrCreateFunctionDeclaration<crate::FoliageFlavor>
@@ -92,7 +120,7 @@ where
Ok(crate::Formula::Boolean(value))
},
clingo::ast::LiteralType::Symbolic(term) => translate_body_term(term, literal.sign(),
context, variable_declaration_stack),
context, variable_declaration_stack, head_predicate_dependencies),
clingo::ast::LiteralType::Comparison(comparison) =>
{
let parameters = (0..2).map(
@@ -130,7 +158,9 @@ where
}
pub(crate) fn translate_body<C>(body_literals: &[clingo::ast::BodyLiteral], context: &C,
variable_declaration_stack: &crate::VariableDeclarationStackLayer)
variable_declaration_stack: &crate::VariableDeclarationStackLayer,
// TODO: refactor
mut head_predicate_dependencies: &mut Option<&mut crate::PredicateDependencies>)
-> Result<crate::Formulas, crate::Error>
where
C: foliage::FindOrCreateFunctionDeclaration<crate::FoliageFlavor>
@@ -138,6 +168,6 @@ where
{
body_literals.iter()
.map(|body_literal| translate_body_literal(body_literal, context,
variable_declaration_stack))
variable_declaration_stack, &mut head_predicate_dependencies))
.collect::<Result<crate::Formulas, crate::Error>>()
}