Implement tightness check
This commit is contained in:
@@ -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, ¶meters_layer)?;
|
||||
translate_body(rule.body(), self.problem, ¶meters_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
|
||||
|
@@ -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>>()
|
||||
}
|
||||
|
Reference in New Issue
Block a user