Support hiding auxiliary predicates

This commit is contained in:
2020-05-13 07:41:01 +02:00
parent 84031c483b
commit 82422cc28f
10 changed files with 528 additions and 29 deletions

View File

@@ -20,6 +20,9 @@ type VariableDeclarationIDs
type InputConstantDeclarationDomains
= std::collections::BTreeMap<std::rc::Rc<foliage::FunctionDeclaration>, crate::Domain>;
type VariableDeclarationDomains
= std::collections::BTreeMap<std::rc::Rc<foliage::VariableDeclaration>, crate::Domain>;
struct FormatContext<'a, 'b>
{
pub program_variable_declaration_ids: std::cell::RefCell<VariableDeclarationIDs>,
@@ -28,9 +31,6 @@ struct FormatContext<'a, 'b>
pub variable_declaration_domains: &'b VariableDeclarationDomains,
}
type VariableDeclarationDomains
= std::collections::BTreeMap<std::rc::Rc<foliage::VariableDeclaration>, crate::Domain>;
pub struct Problem
{
function_declarations: std::cell::RefCell<foliage::FunctionDeclarations>,
@@ -82,6 +82,64 @@ impl Problem
section.push(statement);
}
pub(crate) fn restrict_to_output_predicates(&mut self) -> Result<(), crate::Error>
{
let predicate_declarations = self.predicate_declarations.borrow();
let input_predicate_declarations = self.input_predicate_declarations.borrow();
let output_predicate_declarations = self.output_predicate_declarations.borrow();
// If no output statements were provided, show all predicates by default
if output_predicate_declarations.is_empty()
{
return Ok(());
}
let hidden_predicate_declarations =
predicate_declarations.iter().filter(|x| !output_predicate_declarations.contains(*x)
&& !input_predicate_declarations.contains(*x));
let mut statements = self.statements.borrow_mut();
for hidden_predicate_declaration in hidden_predicate_declarations
{
let matches_completed_definition =
|(_, statement): &(_, &Statement)| match statement.kind
{
StatementKind::CompletedDefinition(ref predicate_declaration) =>
predicate_declaration == hidden_predicate_declaration,
_ => false,
};
let completed_definitions = match statements.get_mut(&SectionKind::CompletedDefinitions)
{
Some(completed_definitions) => completed_definitions,
None => return Ok(()),
};
let completed_definition = match completed_definitions.iter().enumerate()
.find(matches_completed_definition)
{
Some((completed_definition_index, _)) =>
completed_definitions.remove(completed_definition_index).formula,
None => return Err(crate::Error::new_no_completed_definition_found(
std::rc::Rc::clone(hidden_predicate_declaration))),
};
drop(completed_definitions);
for (_, statements) in statements.iter_mut()
{
for statement in statements.iter_mut()
{
crate::utils::replace_predicate_in_formula_with_completed_definition(
&mut statement.formula, &completed_definition, self)?;
}
}
}
Ok(())
}
fn print_step_title(&self, step_title: &str, color: &termcolor::ColorSpec)
{
let longest_possible_key = " Finished";
@@ -216,17 +274,7 @@ impl Problem
fn prove_unproven_statements(&self) -> Result<ProofResult, crate::Error>
{
let format_context = FormatContext
{
program_variable_declaration_ids:
std::cell::RefCell::new(VariableDeclarationIDs::new()),
integer_variable_declaration_ids:
std::cell::RefCell::new(VariableDeclarationIDs::new()),
input_constant_declaration_domains: &self.input_constant_declaration_domains.borrow(),
variable_declaration_domains: &self.variable_declaration_domains.borrow(),
};
let display_statement = |statement: &Statement, format_context|
let display_statement = |statement: &Statement|
{
let step_title = match statement.proof_status
{
@@ -256,15 +304,17 @@ impl Problem
self.shell.borrow_mut().print(&format!("{}: ", statement.kind),
&termcolor::ColorSpec::new());
match statement.kind
let format_context = FormatContext
{
StatementKind::CompletedDefinition(_)
| StatementKind::IntegrityConstraint =>
print!("{}",
foliage::format::display_formula(&statement.formula, format_context)),
_ =>
print!("{}", statement.formula),
}
program_variable_declaration_ids:
std::cell::RefCell::new(VariableDeclarationIDs::new()),
integer_variable_declaration_ids:
std::cell::RefCell::new(VariableDeclarationIDs::new()),
input_constant_declaration_domains: &self.input_constant_declaration_domains.borrow(),
variable_declaration_domains: &self.variable_declaration_domains.borrow(),
};
print!("{}", foliage::format::display_formula(&statement.formula, &format_context));
};
// Show all statements that are assumed to be proven
@@ -273,7 +323,7 @@ impl Problem
for statement in statements.iter_mut()
.filter(|statement| statement.proof_status == ProofStatus::AssumedProven)
{
display_statement(statement, &format_context);
display_statement(statement);
println!("");
}
}
@@ -286,7 +336,7 @@ impl Problem
statement.proof_status = ProofStatus::ToProveNow;
print!("\x1b[s");
display_statement(statement, &format_context);
display_statement(statement);
print!("\x1b[u");
use std::io::Write as _;
@@ -309,7 +359,7 @@ impl Problem
// TODO: make configurable again
let (proof_result, proof_time_seconds) =
run_vampire(&tptp_problem_to_prove_next_statement,
Some(&["--mode", "casc", "--cores", "8", "--time_limit", "15"]))?;
Some(&["--mode", "casc", "--cores", "8", "--time_limit", "300"]))?;
match self.next_unproven_statement_do_mut(
|statement|
@@ -323,7 +373,7 @@ impl Problem
self.shell.borrow_mut().erase_line();
display_statement(statement, &format_context);
display_statement(statement);
match proof_result
{
@@ -591,6 +641,22 @@ impl crate::traits::AssignVariableDeclarationDomain for Problem
}
}
impl crate::traits::VariableDeclarationDomain for Problem
{
fn variable_declaration_domain(&self,
variable_declaration: &std::rc::Rc<foliage::VariableDeclaration>)
-> Option<crate::Domain>
{
self.variable_declaration_domains.borrow().iter().find_map(
|(x, domain)|
match x == variable_declaration
{
true => Some(*domain),
false => None,
})
}
}
impl<'a, 'b> FormatContext<'a, 'b>
{
fn variable_declaration_id(&self,