diff --git a/src/format.rs b/src/format.rs index 3f71646..8cf3991 100644 --- a/src/format.rs +++ b/src/format.rs @@ -12,6 +12,9 @@ impl std::fmt::Debug for crate::project::StatementKind => write!(format, "completion(constraint)"), crate::project::StatementKind::Assumption => write!(format, "assumption"), crate::project::StatementKind::Assertion => write!(format, "assertion"), + crate::project::StatementKind::Lemma(None) => write!(format, "lemma"), + crate::project::StatementKind::Lemma(Some(crate::project::ProofDirection::Forward)) => write!(format, "lemma(forward)"), + crate::project::StatementKind::Lemma(Some(crate::project::ProofDirection::Backward)) => write!(format, "lemma(backward)"), } } } diff --git a/src/format_tptp.rs b/src/format_tptp.rs index eae4ecf..54715c0 100644 --- a/src/format_tptp.rs +++ b/src/format_tptp.rs @@ -1,10 +1,3 @@ -#[derive(Clone, Copy, Eq, Hash, PartialEq)] -pub enum ProofDirection -{ - Forward, - Backward, -} - pub trait DisplayTPTP<'a, DisplayType> where DisplayType: 'a + std::fmt::Debug + std::fmt::Display { @@ -12,12 +5,14 @@ pub trait DisplayTPTP<'a, DisplayType> } pub fn is_statement_kind_conjecture(statement_kind: &crate::project::StatementKind, - proof_direction: ProofDirection) -> bool + proof_direction: crate::project::ProofDirection) -> bool { match (proof_direction, statement_kind) { - (ProofDirection::Forward, crate::project::StatementKind::Assertion) => true, - (ProofDirection::Backward, crate::project::StatementKind::Completion(_)) => true, + (crate::project::ProofDirection::Forward, crate::project::StatementKind::Assertion) => true, + (crate::project::ProofDirection::Backward, crate::project::StatementKind::Completion(_)) => true, + (_, crate::project::StatementKind::Lemma(None)) => true, + (proof_direction, crate::project::StatementKind::Lemma(Some(proof_direction_lemma))) => proof_direction == *proof_direction_lemma, _ => false, } } @@ -242,13 +237,13 @@ struct FormulaDisplay<'a>(&'a foliage::Formula); struct StatementKindDisplay<'a> { statement_kind: &'a crate::project::StatementKind, - proof_direction: ProofDirection, + proof_direction: crate::project::ProofDirection, } pub struct ProjectDisplay<'a> { project: &'a crate::project::Project, conjecture: &'a crate::project::Statement, - proof_direction: ProofDirection, + proof_direction: crate::project::ProofDirection, } impl<'a> DisplayTPTP<'a, VariableDeclarationDisplay<'a>> for foliage::VariableDeclaration @@ -284,7 +279,7 @@ impl<'a> DisplayTPTP<'a, FormulaDisplay<'a>> for foliage::Formula } fn display_statement_kind_tptp<'a>(statement_kind: &'a crate::project::StatementKind, - proof_direction: ProofDirection) + proof_direction: crate::project::ProofDirection) -> StatementKindDisplay<'a> { StatementKindDisplay @@ -295,7 +290,7 @@ fn display_statement_kind_tptp<'a>(statement_kind: &'a crate::project::Statement } pub fn display_project_with_conjecture_tptp<'a>(project: &'a crate::Project, - conjecture: &'a crate::project::Statement, proof_direction: ProofDirection) + conjecture: &'a crate::project::Statement, proof_direction: crate::project::ProofDirection) -> ProjectDisplay<'a> { ProjectDisplay @@ -588,10 +583,17 @@ impl<'a> std::fmt::Debug for StatementKindDisplay<'a> { (crate::project::StatementKind::Axiom, _) => write!(format, "axiom, axiom"), (crate::project::StatementKind::Assumption, _) => write!(format, "assumption, axiom"), - (crate::project::StatementKind::Completion(_), ProofDirection::Forward) => write!(format, "completion, axiom"), - (crate::project::StatementKind::Completion(_), ProofDirection::Backward) => write!(format, "completion, conjecture"), - (crate::project::StatementKind::Assertion, ProofDirection::Forward) => write!(format, "assertion, conjecture"), - (crate::project::StatementKind::Assertion, ProofDirection::Backward) => write!(format, "assertion, axiom"), + (crate::project::StatementKind::Completion(_), crate::project::ProofDirection::Forward) => write!(format, "completion, axiom"), + (crate::project::StatementKind::Completion(_), crate::project::ProofDirection::Backward) => write!(format, "completion, conjecture"), + (crate::project::StatementKind::Assertion, crate::project::ProofDirection::Forward) => write!(format, "assertion, conjecture"), + (crate::project::StatementKind::Assertion, crate::project::ProofDirection::Backward) => write!(format, "assertion, axiom"), + (crate::project::StatementKind::Lemma(None), _) => write!(format, "lemma, conjecture"), + (crate::project::StatementKind::Lemma(Some(proof_direction_lemma)), proof_direction) => + match proof_direction == *proof_direction_lemma + { + true => write!(format, "lemma, conjecture"), + false => Ok(()), + }, } } } diff --git a/src/main.rs b/src/main.rs index 511a92c..99196fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,7 +20,7 @@ fn backup_file_path(file_path: &std::path::Path) -> Result(project: &'a ask_dracula::Project, - proof_direction: ask_dracula::format_tptp::ProofDirection) + proof_direction: ask_dracula::project::ProofDirection) -> Option<&'a ask_dracula::project::Statement> { for block in &project.blocks @@ -38,7 +38,7 @@ fn find_conjecture<'a>(project: &'a ask_dracula::Project, } fn find_conjecture_mut<'a>(project: &'a mut ask_dracula::Project, - proof_direction: ask_dracula::format_tptp::ProofDirection) + proof_direction: ask_dracula::project::ProofDirection) -> Option<&'a mut ask_dracula::project::Statement> { for block in &mut project.blocks @@ -149,9 +149,9 @@ fn main() -> Result<(), Box> let proof_directions = match matches.value_of("proof-direction").unwrap() { - "forward" => vec![ask_dracula::format_tptp::ProofDirection::Forward], - "backward" => vec![ask_dracula::format_tptp::ProofDirection::Backward], - "both" => vec![ask_dracula::format_tptp::ProofDirection::Forward, ask_dracula::format_tptp::ProofDirection::Backward], + "forward" => vec![ask_dracula::project::ProofDirection::Forward], + "backward" => vec![ask_dracula::project::ProofDirection::Backward], + "both" => vec![ask_dracula::project::ProofDirection::Forward, ask_dracula::project::ProofDirection::Backward], proof_direction => panic!("unrecognized proof direction “{}”", proof_direction), }; diff --git a/src/parse.rs b/src/parse.rs index 7d5307d..34573c9 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -42,6 +42,11 @@ fn statement_kind(i: &str) -> IResult<&str, crate::project::StatementKind> |_| crate::project::StatementKind::Axiom, ), map + ( + tag("completion(constraint):"), + |_| crate::project::StatementKind::Completion(crate::project::CompletionTarget::Constraint), + ), + map ( preceded ( @@ -71,13 +76,23 @@ fn statement_kind(i: &str) -> IResult<&str, crate::project::StatementKind> ), map ( - tag("completion(constraint):"), - |_| crate::project::StatementKind::Completion(crate::project::CompletionTarget::Constraint), + tag("assumption:"), + |_| crate::project::StatementKind::Assumption, ), map ( - tag("assumption:"), - |_| crate::project::StatementKind::Assumption, + tag("lemma(forward):"), + |_| crate::project::StatementKind::Lemma(Some(crate::project::ProofDirection::Forward)), + ), + map + ( + tag("lemma(backward):"), + |_| crate::project::StatementKind::Lemma(Some(crate::project::ProofDirection::Backward)), + ), + map + ( + tag("lemma:"), + |_| crate::project::StatementKind::Lemma(None), ), map ( diff --git a/src/project.rs b/src/project.rs index b85c5c1..54f2e68 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1,3 +1,10 @@ +#[derive(Clone, Copy, Eq, Hash, PartialEq)] +pub enum ProofDirection +{ + Forward, + Backward, +} + #[derive(Eq, Hash, PartialEq)] pub enum CompletionTarget { @@ -10,6 +17,7 @@ pub enum StatementKind { Axiom, Completion(CompletionTarget), + Lemma(Option), Assumption, Assertion, }