From fc499e4e8d6900b30d025b1fb80e0837fd1616d9 Mon Sep 17 00:00:00 2001 From: Zachary Bonagura Date: Mon, 9 Dec 2024 21:34:03 -0500 Subject: [PATCH 1/6] Added not_place_holder function Added not_place_holder function --- aris/src/expr.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/aris/src/expr.rs b/aris/src/expr.rs index 21f57a99..40fddb55 100644 --- a/aris/src/expr.rs +++ b/aris/src/expr.rs @@ -441,6 +441,10 @@ impl Expr { pub fn apply(func: Expr, args: &[Expr]) -> Expr { Expr::Apply { func: Box::new(func), args: args.to_vec() } } + /// Helper for constructing `Not` nodes + pub fn not_place_holder() -> Expr { + Expr::Not { operand: Box::new(Expr::var("_")) } + } /// Construct an error message placeholder for an implication pub fn impl_place_holder() -> Expr { Expr::implies(Expr::var("_"), Expr::var("_")) @@ -454,11 +458,11 @@ impl Expr { Expr::Assoc { op, exprs: exprs.to_vec() } } /// Construct an error message placeholder for an associative operator - pub fn assocplaceholder(op: Op) -> Expr { + pub fn assoc_place_holder(op: Op) -> Expr { Expr::assoc(op, &[Expr::var("_"), Expr::var("_"), Expr::var("...")]) } /// Construct an error message placeholder for a quantifier - pub fn quant_placeholder(kind: QuantKind) -> Expr { + pub fn quant_place_holder(kind: QuantKind) -> Expr { Expr::Quant { kind, name: "_".to_owned(), body: Box::new(Expr::var("_")) } } /// Helper for constructing `Forall` nodes From 1f0eb23025c4d7df85267021a3df3808a82f38b1 Mon Sep 17 00:00:00 2001 From: Zachary Bonagura Date: Mon, 9 Dec 2024 21:35:28 -0500 Subject: [PATCH 2/6] New layout for rules New layout for rules, consisting of new Misc. Inference category with Boolean Inference, Conditional Inference, Biconditional Inference, and Quantifier Inference. As well as moving special rules and induction category to top level --- web-app/src/components/proof_widget/mod.rs | 117 ++++++++++++++------- 1 file changed, 79 insertions(+), 38 deletions(-) diff --git a/web-app/src/components/proof_widget/mod.rs b/web-app/src/components/proof_widget/mod.rs index 3aea749d..16644493 100644 --- a/web-app/src/components/proof_widget/mod.rs +++ b/web-app/src/components/proof_widget/mod.rs @@ -166,60 +166,101 @@ impl ProofWidget { /// /// [lib]: https://github.com/vsn4ik/bootstrap-submenu fn render_rules_menu(&self, ctx: &Context, jref:

::JustificationReference, cur_rule_name: &str) -> Html { - let equivalence_classes = [RuleClassification::BooleanEquivalence, RuleClassification::ConditionalEquivalence, RuleClassification::BiconditionalEquivalence, RuleClassification::QuantifierEquivalence]; - - let render_rules = |rules: Vec| { - rules - .into_iter() - .map(|rule| { - let pjref = Coproduct::inject(jref); - let image_src = format!("{}/{}.png", if theme() == "dark" { "proofImages_dark" } else { "proofImages_light" }, rule.get_name()); - html! { - - } - }) - .collect::>() - }; - - let render_class = |rule_class: RuleClassification| { - let rules = render_rules(rule_class.rules().collect()); + let equivalence_classes = [ + RuleClassification::BooleanEquivalence, + RuleClassification::ConditionalEquivalence, + RuleClassification::BiconditionalEquivalence, + RuleClassification::QuantifierEquivalence, + ]; + + let misc_inference_classes = [ + RuleClassification::BooleanInference, + RuleClassification::ConditionalInference, + RuleClassification::BiconditionalInference, + RuleClassification::QuantifierInference, + ]; + + let special_rule_names = ["Reiteration", "Resolution", "Truth-Functional Consequence"]; + + let render_rule_button = |rule: Rule| { + let pjref = Coproduct::inject(jref); + let image_src = format!( + "{}/{}.png", + if theme() == "dark" { "proofImages_dark" } else { "proofImages_light" }, + rule.get_name() + ); html! { -

+ } }; - - let equivalence_submenu = equivalence_classes.iter().map(|&class| render_class(class)).collect::>(); - let non_equivalence_menu = RuleClassification::iter().filter(|class| !equivalence_classes.contains(class)).map(render_class).collect::>(); - + + let render_rules_from_class = |class: RuleClassification| html! { + + }; + + let special_rules = RuleClassification::iter() + .flat_map(|c| c.rules()) + .filter(|r| special_rule_names.contains(&r.get_name().as_str())) + .map(render_rule_button); + + let induction_category = RuleClassification::iter() + .find(|c| c.to_string() == "Induction") + .map(render_rules_from_class); + + let misc_inference_submenu = misc_inference_classes + .iter() + .map(|&c| render_rules_from_class(c)); + + let equivalence_submenu = equivalence_classes + .iter() + .map(|&c| render_rules_from_class(c)); + + let other_menus = RuleClassification::iter() + .filter(|c| { + !special_rule_names.contains(&c.to_string().as_str()) + && c.to_string() != "Induction" + && !equivalence_classes.contains(c) + && !misc_inference_classes.contains(c) + && c.to_string() != "Special" + }) + .map(render_rules_from_class); + html! {
} } + + fn render_justification_widget(&self, ctx: &Context, jref:

::JustificationReference) -> Html { let just = self.prf.lookup_justification_or_die(&jref).expect("proofref should exist in self.prf"); From 29901b0fcab38fccd224351982dc769f71d84fda Mon Sep 17 00:00:00 2001 From: Zachary Bonagura Date: Mon, 9 Dec 2024 21:37:16 -0500 Subject: [PATCH 3/6] Reorganized rules into new inference categories, new rules Reorganized rules into new inference categories for Boolean Inference, Conditional Inference, Biconditional Inference, Quantifier Inference. New Special rule type. New induction rule type. New rules and rule enhancements --- aris/src/proofs/java_shallow_proof.rs | 2 +- aris/src/proofs/lined_proof.rs | 4 +- aris/src/proofs/proof_tests.rs | 290 ++++- aris/src/rules.rs | 1414 +++++++++++++++++-------- bindings/java/src/java_rule.rs | 9 +- 5 files changed, 1211 insertions(+), 508 deletions(-) diff --git a/aris/src/proofs/java_shallow_proof.rs b/aris/src/proofs/java_shallow_proof.rs index f2dc2654..5448d30f 100644 --- a/aris/src/proofs/java_shallow_proof.rs +++ b/aris/src/proofs/java_shallow_proof.rs @@ -28,7 +28,7 @@ impl Proof for JavaShallowProof { Some(r.clone()) } fn lookup_step(&self, r: &Self::JustificationReference) -> Option, Self::SubproofReference>> { - Some(Justification(r.clone(), RuleM::Reit, vec![], vec![])) + Some(Justification(r.clone(), RuleM::Reiteration, vec![], vec![])) } fn lookup_subproof(&self, r: &Self::SubproofReference) -> Option { Some(r.clone()) diff --git a/aris/src/proofs/lined_proof.rs b/aris/src/proofs/lined_proof.rs index 5cbcf11a..9a94a186 100644 --- a/aris/src/proofs/lined_proof.rs +++ b/aris/src/proofs/lined_proof.rs @@ -117,13 +117,13 @@ where let line: Option> = self.lines.get(i).cloned(); match line { None => { - let r = if is_premise { Inl(self.proof.add_premise(const_true)) } else { Inr(Inl(self.proof.add_step(Justification(const_true, RuleM::Reit, vec![], vec![])))) }; + let r = if is_premise { Inl(self.proof.add_premise(const_true)) } else { Inr(Inl(self.proof.add_step(Justification(const_true, RuleM::Reiteration, vec![], vec![])))) }; self.lines.push(Line { raw_expr: "".into(), is_premise, reference: r, subreference: None }); } Some(line) => { let r = match (is_premise, line.reference.clone()) { (true, Inl(pr)) => Inl(self.proof.add_premise_relative(const_true, &pr, true)), - (false, Inr(Inl(jr))) => Inr(Inl(self.proof.add_step_relative(Justification(const_true, RuleM::Reit, vec![], vec![]), &Coproduct::inject(jr), true))), + (false, Inr(Inl(jr))) => Inr(Inl(self.proof.add_step_relative(Justification(const_true, RuleM::Reiteration, vec![], vec![]), &Coproduct::inject(jr), true))), (_, Inr(Inr(void))) => match void {}, (b, r) => panic!("LinedProof::add_line, is_premise was {b}, but the line reference was {r:?}"), }; diff --git a/aris/src/proofs/proof_tests.rs b/aris/src/proofs/proof_tests.rs index 959d6f68..4c2854a4 100644 --- a/aris/src/proofs/proof_tests.rs +++ b/aris/src/proofs/proof_tests.rs @@ -62,14 +62,17 @@ macro_rules! generate_tests { macro_rules! enumerate_subproofless_tests { ($x:ty, $y:ident) => { generate_tests! { $x, $y; - test_andelim, test_contelim, test_orintro, test_reit, test_andintro, + test_andelim, test_contelim, test_orintro, test_reiteration, test_andintro, test_contradictionintro, test_notelim, test_impelim, test_commutation_bool, test_commutation_bicon, test_association_bool, test_association_bicon, - test_demorgan, test_idempotence, test_doublenegation, - test_distribution, test_complement, test_identity, test_annihilation, - test_inverse, test_absorption, test_reduction, test_adjacency, test_resolution, - test_tautcon, test_empty_rule, test_modus_tollens, test_hypothetical_syllogism, - test_disjunctive_syllogism, test_constructive_dilemma, test_halfdemorgan, + test_demorgan, test_idempotence, test_doublenegation, test_distribution, + test_complement, test_identity, test_annihilation, test_inverse, test_absorption, + test_reduction, test_adjacency, test_resolution, test_tautcon, test_empty_rule, + test_modus_tollens, test_hypothetical_syllogism, test_disjunctive_syllogism, + test_constructive_dilemma, test_destructive_dilemma, test_halfdemorgan, + test_strengthen_antecedent, test_weaken_consequent, test_con_intro_negation, + test_con_elim_negation, test_bicon_intro, test_bicon_intro_negation, + test_bicon_elim, test_bicon_elim_negation, test_exclusion, test_excluded_middle, test_weak_induction, test_strong_induction, test_bicon_contraposition, } @@ -112,7 +115,7 @@ where let r4 = prf.add_subproof(); prf.with_mut_subproof(&r4, |sub| { sub.add_premise(p("C")); - sub.add_step(Justification(p("A & B"), RuleM::Reit, vec![i(r3.clone())], vec![])); + sub.add_step(Justification(p("A & B"), RuleM::Reiteration, vec![i(r3.clone())], vec![])); }); let r5 = prf.add_step(Justification(p("C -> (A & B)"), RuleM::ImpIntro, vec![], vec![r4.clone()])); assert_eq!(prf.lookup_premise(&r1), Some(p("A"))); @@ -163,13 +166,13 @@ pub fn test_orintro() -> (P, Vec>, Vec>) { (prf, vec![i(r2)], vec![i(r3), i(r4)]) } -pub fn test_reit() -> (P, Vec>, Vec>) { +pub fn test_reiteration() -> (P, Vec>, Vec>) { use self::coproduct_inject as i; use crate::parser::parse_unwrap as p; let mut prf = P::new(); let r1 = prf.add_premise(p("A")); - let r2 = prf.add_step(Justification(p("A"), RuleM::Reit, vec![i(r1.clone())], vec![])); - let r3 = prf.add_step(Justification(p("B"), RuleM::Reit, vec![i(r1)], vec![])); + let r2 = prf.add_step(Justification(p("A"), RuleM::Reiteration, vec![i(r1.clone())], vec![])); + let r3 = prf.add_step(Justification(p("B"), RuleM::Reiteration, vec![i(r1)], vec![])); (prf, vec![i(r2)], vec![i(r3)]) } @@ -286,7 +289,7 @@ where let r4 = prf .with_mut_subproof(&r5, |sub1| { let _r3 = sub1.add_premise(p("A")); - let r4 = sub1.add_step(Justification(p("B"), RuleM::Reit, vec![i(r2.clone())], vec![])); + let r4 = sub1.add_step(Justification(p("B"), RuleM::Reiteration, vec![i(r2.clone())], vec![])); println!("{sub1:?}"); r4 }) @@ -295,7 +298,7 @@ where let r7 = prf .with_mut_subproof(&r8, |sub2| { let _r6 = sub2.add_premise(p("A")); - let r7 = sub2.add_step(Justification(p("A"), RuleM::Reit, vec![i(r1.clone())], vec![])); + let r7 = sub2.add_step(Justification(p("A"), RuleM::Reiteration, vec![i(r1.clone())], vec![])); println!("{sub2:?}"); r7 }) @@ -329,17 +332,17 @@ pub fn test_orelim() -> (P, Vec>, Vec>) { let r4 = prf.add_subproof(); prf.with_mut_subproof(&r4, |sub1| { let _r2 = sub1.add_premise(p("A")); - let _r3 = sub1.add_step(Justification(p("C"), RuleM::Reit, vec![], vec![])); + let _r3 = sub1.add_step(Justification(p("C"), RuleM::Reiteration, vec![], vec![])); }); let r7 = prf.add_subproof(); prf.with_mut_subproof(&r7, |sub2| { let _r5 = sub2.add_premise(p("B")); - let _r6 = sub2.add_step(Justification(p("C"), RuleM::Reit, vec![], vec![])); + let _r6 = sub2.add_step(Justification(p("C"), RuleM::Reiteration, vec![], vec![])); }); let r10 = prf.add_subproof(); prf.with_mut_subproof(&r10, |sub3| { let _r8 = sub3.add_premise(p("B")); - let _r9 = sub3.add_step(Justification(p("D"), RuleM::Reit, vec![], vec![])); + let _r9 = sub3.add_step(Justification(p("D"), RuleM::Reiteration, vec![], vec![])); }); let r11 = prf.add_step(Justification(p("C"), RuleM::OrElim, vec![i(r1.clone())], vec![r4.clone(), r7.clone()])); let r12 = prf.add_step(Justification(p("D"), RuleM::OrElim, vec![i(r1.clone())], vec![r4.clone(), r7.clone()])); @@ -373,21 +376,21 @@ where let r14 = prf.add_subproof(); prf.with_mut_subproof(&r14, |sub2| { sub2.add_premise(p("A")); - sub2.add_step(Justification(p("B"), RuleM::Reit, vec![], vec![])); - sub2.add_step(Justification(p("C"), RuleM::Reit, vec![], vec![])); + sub2.add_step(Justification(p("B"), RuleM::Reiteration, vec![], vec![])); + sub2.add_step(Justification(p("C"), RuleM::Reiteration, vec![], vec![])); }); let r15 = prf.add_subproof(); prf.with_mut_subproof(&r15, |sub2| { sub2.add_premise(p("B")); - sub2.add_step(Justification(p("A"), RuleM::Reit, vec![], vec![])); - sub2.add_step(Justification(p("C"), RuleM::Reit, vec![], vec![])); + sub2.add_step(Justification(p("A"), RuleM::Reiteration, vec![], vec![])); + sub2.add_step(Justification(p("C"), RuleM::Reiteration, vec![], vec![])); }); let r16 = prf.add_step(Justification(p("A <-> B"), RuleM::BiconditionalIntro, vec![], vec![r14.clone(), r15.clone()])); let r17 = prf.add_step(Justification(p("A <-> C"), RuleM::BiconditionalIntro, vec![], vec![r14.clone(), r15.clone()])); let r18 = prf.add_subproof(); prf.with_mut_subproof(&r18, |sub2| { sub2.add_premise(p("P")); - sub2.add_step(Justification(p("Q"), RuleM::Reit, vec![], vec![])); + sub2.add_step(Justification(p("Q"), RuleM::Reiteration, vec![], vec![])); }); let r19 = prf.add_step(Justification(p("P <-> Q"), RuleM::BiconditionalIntro, vec![i(r3)], vec![r18.clone()])); (prf, vec![i(r7), i(r11), i(r16), i(r19)], vec![i(r8), i(r9), i(r12), i(r13), i(r17)]) @@ -419,21 +422,21 @@ where let r14 = prf.add_subproof(); prf.with_mut_subproof(&r14, |sub2| { sub2.add_premise(p("A")); - sub2.add_step(Justification(p("B"), RuleM::Reit, vec![], vec![])); - sub2.add_step(Justification(p("C"), RuleM::Reit, vec![], vec![])); + sub2.add_step(Justification(p("B"), RuleM::Reiteration, vec![], vec![])); + sub2.add_step(Justification(p("C"), RuleM::Reiteration, vec![], vec![])); }); let r15 = prf.add_subproof(); prf.with_mut_subproof(&r15, |sub2| { sub2.add_premise(p("B")); - sub2.add_step(Justification(p("A"), RuleM::Reit, vec![], vec![])); - sub2.add_step(Justification(p("C"), RuleM::Reit, vec![], vec![])); + sub2.add_step(Justification(p("A"), RuleM::Reiteration, vec![], vec![])); + sub2.add_step(Justification(p("C"), RuleM::Reiteration, vec![], vec![])); }); let r16 = prf.add_step(Justification(p("A === B"), RuleM::EquivalenceIntro, vec![], vec![r14.clone(), r15.clone()])); let r17 = prf.add_step(Justification(p("A === C"), RuleM::EquivalenceIntro, vec![], vec![r14.clone(), r15.clone()])); let r18 = prf.add_subproof(); prf.with_mut_subproof(&r18, |sub2| { sub2.add_premise(p("P")); - sub2.add_step(Justification(p("Q"), RuleM::Reit, vec![], vec![])); + sub2.add_step(Justification(p("Q"), RuleM::Reiteration, vec![], vec![])); }); let r19 = prf.add_step(Justification(p("P === Q"), RuleM::EquivalenceIntro, vec![i(r3)], vec![r18.clone()])); (prf, vec![i(r7), i(r8), i(r9), i(r11), i(r16), i(r19)], vec![i(r12), i(r13), i(r17)]) @@ -494,7 +497,7 @@ where let r10 = prf.add_subproof(); let r11 = prf .with_mut_subproof(&r10, |sub| { - let r11 = sub.add_step(Justification(p("r(c)"), RuleM::Reit, vec![i(r3.clone())], vec![])); + let r11 = sub.add_step(Justification(p("r(c)"), RuleM::Reiteration, vec![i(r3.clone())], vec![])); println!("contained {:?}", sub.contained_justifications(true)); println!("reachable {:?}", sub.transitive_dependencies(i(r11.clone()))); println!("reachable-contained {:?}", sub.transitive_dependencies(i(r11.clone())).difference(&sub.contained_justifications(true)).collect::>()); @@ -509,7 +512,7 @@ where let (r17, r18) = sub1 .with_mut_subproof(&r14, |sub2| { let r15 = sub2.add_subproof(); - let r17 = sub2.with_mut_subproof(&r15, |sub3| sub3.add_step(Justification(p("s(a, b)"), RuleM::Reit, vec![], vec![]))).unwrap(); + let r17 = sub2.with_mut_subproof(&r15, |sub3| sub3.add_step(Justification(p("s(a, b)"), RuleM::Reiteration, vec![], vec![]))).unwrap(); let r18 = sub2.add_step(Justification(p("forall y s(a, y)"), RuleM::ForallIntro, vec![], vec![r15])); (r17, r18) }) @@ -524,7 +527,7 @@ where .with_mut_subproof(&r20, |sub| { let r21 = sub.add_premise(p("a")); - sub.add_step(Justification(p("a"), RuleM::Reit, vec![i(r21)], vec![])) + sub.add_step(Justification(p("a"), RuleM::Reiteration, vec![i(r21)], vec![])) }) .unwrap(); let r23 = prf.add_step(Justification(p("forall x x"), RuleM::ForallIntro, vec![], vec![r20])); @@ -542,7 +545,7 @@ where let mut prf = P::new(); let r1 = prf.add_premise(p("p(a)")); - let r2 = prf.add_step(Justification(p("p(b) & p(b)"), RuleM::Reit, vec![], vec![])); + let r2 = prf.add_step(Justification(p("p(b) & p(b)"), RuleM::Reiteration, vec![], vec![])); let r3 = prf.add_step(Justification(p("exists x p(x)"), RuleM::ExistsIntro, vec![i(r1.clone())], vec![])); let r4 = prf.add_step(Justification(p("exists x p(a)"), RuleM::ExistsIntro, vec![i(r1.clone())], vec![])); let r5 = prf.add_step(Justification(p("exists x p(b)"), RuleM::ExistsIntro, vec![i(r1)], vec![])); @@ -1039,15 +1042,16 @@ pub fn test_resolution() -> (P, Vec>, Vec>) { let r1 = prf.add_step(Justification(p("a1 | a2 | b1 | b2"), RuleM::Resolution, vec![i(p1.clone()), i(p2.clone())], vec![])); let r2 = prf.add_step(Justification(p("a1 | a2"), RuleM::Resolution, vec![i(p1.clone()), i(p3.clone())], vec![])); let r3 = prf.add_step(Justification(p("_|_"), RuleM::Resolution, vec![i(p3.clone()), i(p4)], vec![])); - let r4 = prf.add_step(Justification(p("a1 & a2"), RuleM::Resolution, vec![i(p3.clone()), i(p6)], vec![])); + let r4 = prf.add_step(Justification(p("a1 & a2"), RuleM::Resolution, vec![i(p3.clone()), i(p6.clone())], vec![])); let r5 = prf.add_step(Justification(p("a1 | a2 | c | b1 | b2"), RuleM::Resolution, vec![i(p1.clone()), i(p2.clone())], vec![])); - let r6 = prf.add_step(Justification(p("a1 | a2 | b1"), RuleM::Resolution, vec![i(p1), i(p2)], vec![])); + let r6 = prf.add_step(Justification(p("a1 | a2 | b1"), RuleM::Resolution, vec![i(p1.clone()), i(p2.clone())], vec![])); let r7 = prf.add_step(Justification(p("a1 | a2"), RuleM::Resolution, vec![i(p5.clone()), i(p3.clone())], vec![])); - let r8 = prf.add_step(Justification(p("a1 | a2"), RuleM::Resolution, vec![i(p3), i(p5.clone())], vec![])); + let r8 = prf.add_step(Justification(p("a1 | a2"), RuleM::Resolution, vec![i(p3.clone()), i(p5.clone())], vec![])); let r9 = prf.add_step(Justification(p("a1 | a2"), RuleM::Resolution, vec![i(p5.clone()), i(p5)], vec![])); + let r10 = prf.add_step(Justification(p("a1 | a2 | b1 | b2 | z | d | e | f"), RuleM::Resolution, vec![i(p1.clone()), i(p2.clone())], vec![])); - (prf, vec![i(r1), i(r2), i(r3), i(r4)], vec![i(r5), i(r6), i(r7), i(r8), i(r9)]) + (prf, vec![i(r1), i(r2), i(r3), i(r4)], vec![i(r5), i(r6), i(r7), i(r8), i(r9), i(r10)]) } pub fn test_tautcon() -> (P, Vec>, Vec>) { @@ -1103,6 +1107,14 @@ pub fn test_modus_tollens() -> (P, Vec>, Vec>) { let r3 = prf.add_premise(p("P")); let r4 = prf.add_premise(p("~A")); let r5 = prf.add_premise(p("A -> A")); + + let r15 = prf.add_premise(p("P -> ~Q")); + let r16 = prf.add_premise(p("Q")); + let r19 = prf.add_premise(p("~P -> Q")); + let r20 = prf.add_premise(p("~Q")); + let r23 = prf.add_premise(p("~P -> ~Q")); + let r24 = prf.add_premise(p("Q")); + let r6 = prf.add_step(Justification(p("~P"), RuleM::ModusTollens, vec![i(r1.clone()), i(r2.clone())], vec![])); let r7 = prf.add_step(Justification(p("~P"), RuleM::ModusTollens, vec![i(r2.clone()), i(r1.clone())], vec![])); let r8 = prf.add_step(Justification(p("~B"), RuleM::ModusTollens, vec![i(r1.clone()), i(r2.clone())], vec![])); @@ -1112,7 +1124,15 @@ pub fn test_modus_tollens() -> (P, Vec>, Vec>) { let r12 = prf.add_step(Justification(p("Q"), RuleM::ModusTollens, vec![i(r2.clone()), i(r4.clone())], vec![])); let r13 = prf.add_step(Justification(p("~A"), RuleM::ModusTollens, vec![i(r4), i(r5)], vec![])); let r14 = prf.add_step(Justification(p("~P"), RuleM::ModusTollens, vec![i(r2), i(r1)], vec![])); - (prf, vec![i(r6), i(r7), i(r13), i(r14)], vec![i(r8), i(r9), i(r10), i(r11), i(r12)]) + + let r17 = prf.add_step(Justification(p("~P"), RuleM::ModusTollens, vec![i(r15.clone()), i(r16.clone())], vec![])); + let r18 = prf.add_step(Justification(p("~P"), RuleM::ModusTollens, vec![i(r16.clone()), i(r15.clone())], vec![])); + let r21 = prf.add_step(Justification(p("P"), RuleM::ModusTollens, vec![i(r19.clone()), i(r20.clone())], vec![])); + let r22 = prf.add_step(Justification(p("P"), RuleM::ModusTollens, vec![i(r20.clone()), i(r19.clone())], vec![])); + let r25 = prf.add_step(Justification(p("P"), RuleM::ModusTollens, vec![i(r23.clone()), i(r24.clone())], vec![])); + let r26 = prf.add_step(Justification(p("P"), RuleM::ModusTollens, vec![i(r24.clone()), i(r23.clone())], vec![])); + + (prf, vec![i(r6), i(r7), i(r13), i(r14), i(r17), i(r18), i(r21), i(r22), i(r25), i(r26)], vec![i(r8), i(r9), i(r10), i(r11), i(r12)]) } pub fn test_hypothetical_syllogism() -> (P, Vec>, Vec>) { @@ -1175,6 +1195,34 @@ pub fn test_constructive_dilemma() -> (P, Vec>, Vec> (prf, vec![i(r6), i(r7)], vec![i(r8), i(r9), i(r10), i(r11), i(r12), i(r13)]) } +pub fn test_destructive_dilemma() -> (P, Vec>, Vec>) { + use self::coproduct_inject as i; + use crate::parser::parse_unwrap as p; + let mut prf = P::new(); + let r1 = prf.add_premise(p("~R | ~S")); + let r2 = prf.add_premise(p("P -> R")); + let r3 = prf.add_premise(p("Q -> S")); + + let r4 = prf.add_step(Justification(p("~P | ~Q"), RuleM::DestructiveDilemma, vec![i(r1.clone()), i(r2.clone()), i(r3.clone())], vec![])); + let r5 = prf.add_step(Justification(p("~Q | ~P"), RuleM::DestructiveDilemma, vec![i(r1.clone()), i(r2.clone()), i(r3.clone())], vec![])); + let r6 = prf.add_step(Justification(p("~P | ~Q"), RuleM::DestructiveDilemma, vec![i(r1.clone()), i(r3.clone()), i(r2.clone())], vec![])); + let r7 = prf.add_step(Justification(p("~Q | ~P"), RuleM::DestructiveDilemma, vec![i(r1.clone()), i(r3.clone()), i(r2.clone())], vec![])); + let r8 = prf.add_step(Justification(p("~P | ~Q"), RuleM::DestructiveDilemma, vec![i(r2.clone()), i(r1.clone()), i(r3.clone())], vec![])); + let r9 = prf.add_step(Justification(p("~Q | ~P"), RuleM::DestructiveDilemma, vec![i(r2.clone()), i(r1.clone()), i(r3.clone())], vec![])); + let r10 = prf.add_step(Justification(p("~P | ~Q"), RuleM::DestructiveDilemma, vec![i(r2.clone()), i(r3.clone()), i(r1.clone())], vec![])); + let r11 = prf.add_step(Justification(p("~Q | ~P"), RuleM::DestructiveDilemma, vec![i(r2.clone()), i(r3.clone()), i(r1.clone())], vec![])); + let r12 = prf.add_step(Justification(p("~P | ~Q"), RuleM::DestructiveDilemma, vec![i(r3.clone()), i(r1.clone()), i(r2.clone())], vec![])); + let r13 = prf.add_step(Justification(p("~Q | ~P"), RuleM::DestructiveDilemma, vec![i(r3.clone()), i(r1.clone()), i(r2.clone())], vec![])); + let r14 = prf.add_step(Justification(p("~P | ~Q"), RuleM::DestructiveDilemma, vec![i(r3.clone()), i(r2.clone()), i(r1.clone())], vec![])); + let r15 = prf.add_step(Justification(p("~Q | ~P"), RuleM::DestructiveDilemma, vec![i(r3.clone()), i(r2.clone()), i(r1.clone())], vec![])); + + let r16 = prf.add_step(Justification(p("P | ~Q"), RuleM::DestructiveDilemma, vec![i(r1.clone()), i(r2.clone()), i(r3.clone())], vec![])); + let r17 = prf.add_step(Justification(p("Q | ~P"), RuleM::DestructiveDilemma, vec![i(r1.clone()), i(r2.clone()), i(r3.clone())], vec![])); + let r18 = prf.add_step(Justification(p("~P"), RuleM::DestructiveDilemma, vec![i(r1.clone()), i(r2.clone()), i(r3.clone())], vec![])); + + (prf, vec![i(r4), i(r5), i(r6), i(r7), i(r8), i(r9), i(r10), i(r11), i(r12), i(r13), i(r14), i(r15)], vec![i(r16), i(r17), i(r18)]) +} + pub fn test_halfdemorgan() -> (P, Vec>, Vec>) { use self::coproduct_inject as i; use crate::parser::parse_unwrap as p; @@ -1194,6 +1242,180 @@ pub fn test_halfdemorgan() -> (P, Vec>, Vec>) { (prf, vec![i(r4), i(r5), i(r6), i(r8), i(r9), i(r11)], vec![i(r7), i(r10)]) } +pub fn test_strengthen_antecedent() -> (P, Vec>, Vec>) { + use self::coproduct_inject as i; + use crate::parser::parse_unwrap as p; + let mut prf = P::new(); + let r1 = prf.add_premise(p("P -> R")); + let r2 = prf.add_premise(p("(P | Q) -> R")); + + let r3 = prf.add_step(Justification(p("(P & Q) -> R"), RuleM::StrengthenAntecedent, vec![i(r1.clone())], vec![])); + let r4 = prf.add_step(Justification(p("(Q & P) -> R"), RuleM::StrengthenAntecedent, vec![i(r1.clone())], vec![])); + let r5 = prf.add_step(Justification(p("P -> R"), RuleM::StrengthenAntecedent, vec![i(r2.clone())], vec![])); + let r6 = prf.add_step(Justification(p("Q -> R"), RuleM::StrengthenAntecedent, vec![i(r2.clone())], vec![])); + + let r7 = prf.add_step(Justification(p("Q -> R"), RuleM::StrengthenAntecedent, vec![i(r1.clone())], vec![])); + let r8 = prf.add_step(Justification(p("(P | Q | S) -> R"), RuleM::StrengthenAntecedent, vec![i(r2.clone())], vec![])); + let r9 = prf.add_step(Justification(p("S -> R"), RuleM::StrengthenAntecedent, vec![i(r2.clone())], vec![])); + + (prf, vec![i(r3), i(r4), i(r5), i(r6)], vec![i(r7), i(r8), i(r9)]) +} + +pub fn test_weaken_consequent() -> (P, Vec>, Vec>) { + use self::coproduct_inject as i; + use crate::parser::parse_unwrap as p; + let mut prf = P::new(); + let r1 = prf.add_premise(p("P -> (Q & R)")); + let r2 = prf.add_premise(p("P -> Q")); + + let r3 = prf.add_step(Justification(p("P -> Q"), RuleM::WeakenConsequent, vec![i(r1.clone())], vec![])); + let r4 = prf.add_step(Justification(p("P -> R"), RuleM::WeakenConsequent, vec![i(r1.clone())], vec![])); + let r5 = prf.add_step(Justification(p("P -> (Q | R)"), RuleM::WeakenConsequent, vec![i(r2.clone())], vec![])); + let r6 = prf.add_step(Justification(p("P -> (R | Q)"), RuleM::WeakenConsequent, vec![i(r2.clone())], vec![])); + + let r7 = prf.add_step(Justification(p("R -> P"), RuleM::WeakenConsequent, vec![i(r1.clone())], vec![])); + let r8 = prf.add_step(Justification(p("P -> (Q & R)"), RuleM::WeakenConsequent, vec![i(r2.clone())], vec![])); + let r9 = prf.add_step(Justification(p("P -> (Z | R)"), RuleM::WeakenConsequent, vec![i(r2.clone())], vec![])); + + (prf, vec![i(r3), i(r4), i(r5), i(r6)], vec![i(r7), i(r8), i(r9)]) +} + +pub fn test_con_intro_negation() -> (P, Vec>, Vec>) { + use self::coproduct_inject as i; + use crate::parser::parse_unwrap as p; + let mut prf = P::new(); + let r1 = prf.add_premise(p("~P")); + let r2 = prf.add_premise(p("Q")); + + let r3 = prf.add_step(Justification(p("P -> Q"), RuleM::ConIntroNegation, vec![i(r1.clone())], vec![])); + let r4 = prf.add_step(Justification(p("P -> Q"), RuleM::ConIntroNegation, vec![i(r2.clone())], vec![])); + + let r5 = prf.add_step(Justification(p("~P -> Q"), RuleM::ConIntroNegation, vec![i(r1.clone())], vec![])); + let r6 = prf.add_step(Justification(p("P -> ~Q"), RuleM::ConIntroNegation, vec![i(r1.clone())], vec![])); + let r7 = prf.add_step(Justification(p("~P -> Q"), RuleM::ConIntroNegation, vec![i(r2.clone())], vec![])); + let r8 = prf.add_step(Justification(p("P -> ~Q"), RuleM::ConIntroNegation, vec![i(r2.clone())], vec![])); + + (prf, vec![i(r3), i(r4)], vec![i(r5), i(r6), i(r7), i(r8)]) +} +pub fn test_con_elim_negation() -> (P, Vec>, Vec>) { + use self::coproduct_inject as i; + use crate::parser::parse_unwrap as p; + let mut prf = P::new(); + let r1 = prf.add_premise(p("~(P -> Q)")); + + let r2 = prf.add_premise(p("P -> Q")); + + let r3 = prf.add_step(Justification(p("P"), RuleM::ConElimNegation, vec![i(r1.clone())], vec![])); + let r4 = prf.add_step(Justification(p("~Q"), RuleM::ConElimNegation, vec![i(r1.clone())], vec![])); + + let r5 = prf.add_step(Justification(p("~P"), RuleM::ConElimNegation, vec![i(r1.clone())], vec![])); + let r6 = prf.add_step(Justification(p("Q"), RuleM::ConElimNegation, vec![i(r1.clone())], vec![])); + + let r7 = prf.add_step(Justification(p("P"), RuleM::ConElimNegation, vec![i(r2.clone())], vec![])); + let r8 = prf.add_step(Justification(p("~Q"), RuleM::ConElimNegation, vec![i(r2.clone())], vec![])); + + (prf, vec![i(r3), i(r4)], vec![i(r5), i(r6), i(r7), i(r8)]) +} +pub fn test_bicon_intro() -> (P, Vec>, Vec>) { + use self::coproduct_inject as i; + use crate::parser::parse_unwrap as p; + let mut prf = P::new(); + let r1 = prf.add_premise(p("P")); + let r2 = prf.add_premise(p("Q")); + + let r3 = prf.add_premise(p("~P")); + let r4 = prf.add_premise(p("~Q")); + + let r5 = prf.add_step(Justification(p("P <-> Q"), RuleM::BiconIntro, vec![i(r1.clone()), i(r2.clone())], vec![])); + let r6 = prf.add_step(Justification(p("P <-> Q"), RuleM::BiconIntro, vec![i(r3.clone()), i(r4.clone())], vec![])); + let r7 = prf.add_step(Justification(p("~P <-> ~Q"), RuleM::BiconIntro, vec![i(r3.clone()), i(r4.clone())], vec![])); + + let r8 = prf.add_step(Justification(p("P <-> ~Q"), RuleM::BiconIntro, vec![i(r1.clone()), i(r2.clone())], vec![])); + let r9 = prf.add_step(Justification(p("~P <-> Q"), RuleM::BiconIntro, vec![i(r1.clone()), i(r2.clone())], vec![])); + let r10 = prf.add_step(Justification(p("P <-> ~Q"), RuleM::BiconIntro, vec![i(r3.clone()), i(r4.clone())], vec![])); + let r11 = prf.add_step(Justification(p("~P <-> Q"), RuleM::BiconIntro, vec![i(r3.clone()), i(r4.clone())], vec![])); + + (prf, vec![i(r5), i(r6), i(r7)], vec![i(r8), i(r9), i(r10), i(r11)]) +} +pub fn test_bicon_intro_negation() -> (P, Vec>, Vec>) { + use self::coproduct_inject as i; + use crate::parser::parse_unwrap as p; + let mut prf = P::new(); + let r1 = prf.add_premise(p("~P")); + let r2 = prf.add_premise(p("Q")); + + let r3 = prf.add_premise(p("P")); + let r4 = prf.add_premise(p("~Q")); + + let r5 = prf.add_step(Justification(p("~(P <-> Q)"), RuleM::BiconIntroNegation, vec![i(r1.clone()), i(r2.clone())], vec![])); + let r6 = prf.add_step(Justification(p("~(P <-> Q)"), RuleM::BiconIntroNegation, vec![i(r3.clone()), i(r4.clone())], vec![])); + + let r7 = prf.add_step(Justification(p("P <-> Q"), RuleM::BiconIntroNegation, vec![i(r1.clone()), i(r2.clone())], vec![])); + let r8 = prf.add_step(Justification(p("P <-> Q"), RuleM::BiconIntroNegation, vec![i(r3.clone()), i(r4.clone())], vec![])); + let r9 = prf.add_step(Justification(p("~(P <-> Q)"), RuleM::BiconIntroNegation, vec![i(r1.clone()), i(r4.clone())], vec![])); + let r10 = prf.add_step(Justification(p("~(P <-> Q)"), RuleM::BiconIntroNegation, vec![i(r2.clone()), i(r3.clone())], vec![])); + + (prf, vec![i(r5), i(r6)], vec![i(r7), i(r8), i(r9), i(r10)]) +} +pub fn test_bicon_elim() -> (P, Vec>, Vec>) { + use self::coproduct_inject as i; + use crate::parser::parse_unwrap as p; + let mut prf = P::new(); + let r1 = prf.add_premise(p("P <-> Q")); + let r2 = prf.add_premise(p("~P")); + let r3 = prf.add_premise(p("~Q")); + + let r4 = prf.add_step(Justification(p("~Q"), RuleM::BiconElim, vec![i(r1.clone()), i(r2.clone())], vec![])); + let r5 = prf.add_step(Justification(p("~P"), RuleM::BiconElim, vec![i(r1.clone()), i(r3.clone())], vec![])); + + let r6 = prf.add_step(Justification(p("Q"), RuleM::BiconElim, vec![i(r1.clone()), i(r2.clone())], vec![])); + let r7 = prf.add_step(Justification(p("P"), RuleM::BiconElim, vec![i(r1.clone()), i(r3.clone())], vec![])); + let r8 = prf.add_step(Justification(p("~Q"), RuleM::BiconElim, vec![i(r1.clone()), i(r3.clone())], vec![])); + let r9 = prf.add_step(Justification(p("~P"), RuleM::BiconElim, vec![i(r1.clone()), i(r2.clone())], vec![])); + + (prf, vec![i(r4), i(r5)], vec![i(r6), i(r7), i(r8), i(r9)]) +} +pub fn test_bicon_elim_negation() -> (P, Vec>, Vec>) { + use self::coproduct_inject as i; + use crate::parser::parse_unwrap as p; + let mut prf = P::new(); + let r1 = prf.add_premise(p("~(P <-> Q)")); + let r2 = prf.add_premise(p("P")); + let r3 = prf.add_premise(p("Q")); + + let r4 = prf.add_step(Justification(p("~Q"), RuleM::BiconElimNegation, vec![i(r1.clone()), i(r2.clone())], vec![])); + let r5 = prf.add_step(Justification(p("~P"), RuleM::BiconElimNegation, vec![i(r1.clone()), i(r3.clone())], vec![])); + + let r6 = prf.add_step(Justification(p("Q"), RuleM::BiconElimNegation, vec![i(r1.clone()), i(r2.clone())], vec![])); + let r7 = prf.add_step(Justification(p("P"), RuleM::BiconElimNegation, vec![i(r1.clone()), i(r3.clone())], vec![])); + let r8 = prf.add_step(Justification(p("~Q"), RuleM::BiconElimNegation, vec![i(r1.clone()), i(r3.clone())], vec![])); + let r9 = prf.add_step(Justification(p("~P"), RuleM::BiconElimNegation, vec![i(r1.clone()), i(r2.clone())], vec![])); + + (prf, vec![i(r4), i(r5)], vec![i(r6), i(r7), i(r8), i(r9)]) +} + +pub fn test_exclusion() -> (P, Vec>, Vec>) { + use self::coproduct_inject as i; + use crate::parser::parse_unwrap as p; + let mut prf = P::new(); + let r1 = prf.add_premise(p("~(P & Q)")); + let r2 = prf.add_premise(p("P")); + let r3 = prf.add_premise(p("Q")); + let r4 = prf.add_premise(p("~(P & ~Q)")); + let r5 = prf.add_premise(p("~(~P & Q)")); + + let r6 = prf.add_step(Justification(p("~Q"), RuleM::Exclusion, vec![i(r1.clone()), i(r2.clone())], vec![])); + let r7 = prf.add_step(Justification(p("~Q"), RuleM::Exclusion, vec![i(r2.clone()), i(r1.clone())], vec![])); + let r8 = prf.add_step(Justification(p("~P"), RuleM::Exclusion, vec![i(r1.clone()), i(r3.clone())], vec![])); + let r9 = prf.add_step(Justification(p("~P"), RuleM::Exclusion, vec![i(r3.clone()), i(r1.clone())], vec![])); + let r10 = prf.add_step(Justification(p("Q"), RuleM::Exclusion, vec![i(r4.clone()), i(r2.clone())], vec![])); + let r11 = prf.add_step(Justification(p("Q"), RuleM::Exclusion, vec![i(r2.clone()), i(r4.clone())], vec![])); + let r12 = prf.add_step(Justification(p("P"), RuleM::Exclusion, vec![i(r5.clone()), i(r3.clone())], vec![])); + let r13 = prf.add_step(Justification(p("P"), RuleM::Exclusion, vec![i(r3.clone()), i(r5.clone())], vec![])); + + (prf, vec![i(r6), i(r7), i(r8), i(r9), i(r10), i(r11), i(r12), i(r13)], vec![]) +} + pub fn test_excluded_middle() -> (P, Vec>, Vec>) { use self::coproduct_inject as i; use crate::parser::parse_unwrap as p; diff --git a/aris/src/rules.rs b/aris/src/rules.rs index 89a618d2..1b7c65f3 100644 --- a/aris/src/rules.rs +++ b/aris/src/rules.rs @@ -74,7 +74,6 @@ use frunk_core::coproduct::Coproduct::Inr; use frunk_core::Coprod; use itertools::Itertools; use maplit::btreeset; -use maplit::hashset; use petgraph::algo::tarjan_scc; use petgraph::graphmap::DiGraphMap; use strum_macros::*; @@ -82,7 +81,6 @@ use strum_macros::*; #[allow(missing_docs)] #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum PrepositionalInference { - Reit, AndIntro, AndElim, OrIntro, @@ -108,6 +106,44 @@ pub enum PredicateInference { ExistsElim, } +#[allow(missing_docs)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum BooleanInference { + DisjunctiveSyllogism, + Exclusion, + ExcludedMiddle, + HalfDeMorgan, +} + +#[allow(missing_docs)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum ConditionalInference { + ModusTollens, + HypotheticalSyllogism, + ConstructiveDilemma, + DestructiveDilemma, + StrengthenAntecedent, + WeakenConsequent, + ConIntroNegation, + ConElimNegation, + +} + +#[allow(missing_docs)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum BiconditionalInference { + BiconIntro, + BiconIntroNegation, + BiconElim, + BiconElimNegation, +} + +#[allow(missing_docs)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum QuantifierInference { + QuantInference, +} + #[allow(missing_docs)] #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum BooleanEquivalence { @@ -156,25 +192,6 @@ pub enum BiconditionalEquivalence { KnightsAndKnaves, } -#[allow(missing_docs)] -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum RedundantPrepositionalInference { - ModusTollens, - HypotheticalSyllogism, - DisjunctiveSyllogism, - ExcludedMiddle, - ConstructiveDilemma, - HalfDeMorgan, - QuantifierInference, -} - -#[allow(missing_docs)] -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum AutomationRelatedRules { - Resolution, - TruthFunctionalConsequence, -} - #[allow(missing_docs)] #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum QuantifierEquivalence { @@ -187,6 +204,14 @@ pub enum QuantifierEquivalence { PrenexLaws, } +#[allow(missing_docs)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum Special { + Reiteration, + Resolution, + TruthFunctionalConsequence, +} + #[allow(missing_docs)] #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum Induction { @@ -211,7 +236,7 @@ pub struct EmptyRule; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct SharedChecks(T); -pub type Rule = SharedChecks; +pub type Rule = SharedChecks; /// Conveniences for constructing rules of the appropriate type, primarily for testing. /// The non-standard naming conventions here are because a module is being used to pretend to be an enum. @@ -259,7 +284,6 @@ pub mod RuleM { // If the parens are omitted, $value:tt only captures SharedChecks, without the (...) // I haven't yet found a way to use macro_rules! to convert between expr and pat. declare_rules! { - [Reit, "REITERATION", (SharedChecks(Inl(PrepositionalInference::Reit)))], [AndIntro, "CONJUNCTION", (SharedChecks(Inl(PrepositionalInference::AndIntro)))], [AndElim, "SIMPLIFICATION", (SharedChecks(Inl(PrepositionalInference::AndElim)))], [OrIntro, "ADDITION", (SharedChecks(Inl(PrepositionalInference::OrIntro)))], @@ -280,65 +304,79 @@ pub mod RuleM { [ExistsIntro, "EXISTENTIAL_GENERALIZATION", (SharedChecks(Inr(Inl(PredicateInference::ExistsIntro))))], [ExistsElim, "EXISTENTIAL_INSTANTIATION", (SharedChecks(Inr(Inl(PredicateInference::ExistsElim))))], - [Association, "ASSOCIATION", (SharedChecks(Inr(Inr(Inl(BooleanEquivalence::Association)))))], - [Commutation, "COMMUTATION", (SharedChecks(Inr(Inr(Inl(BooleanEquivalence::Commutation)))))], - [Idempotence, "IDEMPOTENCE", (SharedChecks(Inr(Inr(Inl(BooleanEquivalence::Idempotence)))))], - [DeMorgan, "DE_MORGAN", (SharedChecks(Inr(Inr(Inl(BooleanEquivalence::DeMorgan)))))], - [Distribution, "DISTRIBUTION", (SharedChecks(Inr(Inr(Inl(BooleanEquivalence::Distribution)))))], - [DoubleNegation, "DOUBLENEGATION_EQUIV", (SharedChecks(Inr(Inr(Inl(BooleanEquivalence::DoubleNegation)))))], - [Complement, "COMPLEMENT", (SharedChecks(Inr(Inr(Inl(BooleanEquivalence::Complement)))))], - [Identity, "IDENTITY", (SharedChecks(Inr(Inr(Inl(BooleanEquivalence::Identity)))))], - [Annihilation, "ANNIHILATION", (SharedChecks(Inr(Inr(Inl(BooleanEquivalence::Annihilation)))))], - [Inverse, "INVERSE", (SharedChecks(Inr(Inr(Inl(BooleanEquivalence::Inverse)))))], - [Absorption, "ABSORPTION", (SharedChecks(Inr(Inr(Inl(BooleanEquivalence::Absorption)))))], - [Reduction, "REDUCTION", (SharedChecks(Inr(Inr(Inl(BooleanEquivalence::Reduction)))))], - [Adjacency, "ADJACENCY", (SharedChecks(Inr(Inr(Inl(BooleanEquivalence::Adjacency)))))], - - [Implication, "IMPLICATION", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalEquivalence::Implication))))))], - [Contraposition, "CONTRAPOSITION", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalEquivalence::Contraposition))))))], - [Exportation, "Exportation", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalEquivalence::Exportation))))))], - [ConditionalDistribution, "CONDITIONAL_DISTRIBUTION", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalEquivalence::ConditionalDistribution))))))], - [ConditionalAbsorption, "CONDITIONAL_ABSORPTION", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalEquivalence::ConditionalAbsorption))))))], - [ConditionalReduction, "CONDITIONAL_REDUCTION", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalEquivalence::ConditionalReduction))))))], - [ConditionalIdempotence, "CONDITIONAL_IDEMPOTENCE", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalEquivalence::ConditionalIdempotence))))))], - [ConditionalComplement, "CONDITIONAL_COMPLEMENT", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalEquivalence::ConditionalComplement))))))], - [ConditionalIdentity, "CONDITIONAL_IDENTITY", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalEquivalence::ConditionalIdentity))))))], - [ConditionalAnnihilation, "CONDITIONAL_ANNIHILATION", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalEquivalence::ConditionalAnnihilation))))))], - - [BiEquivalence, "BICONDITIONAL_EQUIVALENCE", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiEquivalence)))))))], - [BiconditionalContraposition, "BICONDITIONAL_CONTRAPOSITION", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalContraposition)))))))], - [BiconditionalCommutation, "BICONDITIONAL_COMMUTATION", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalCommutation)))))))], - [BiconditionalAssociation, "BICONDITIONAL_ASSOCIATION", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalAssociation)))))))], - [BiconditionalReduction, "BICONDITIONAL_REDUCTION", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalReduction)))))))], - [BiconditionalComplement, "BICONDITIONAL_COMPLEMENT", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalComplement)))))))], - [BiconditionalIdentity, "BICONDITIONAL_IDENTITY", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalIdentity)))))))], - [BiconditionalNegation, "BICONDITIONAL_NEGATION", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalNegation)))))))], - [BiconditionalSubstitution, "BICONDITIONAL_SUBSTITUTION", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalSubstitution)))))))], - [KnightsAndKnaves, "KNIGHTS_AND_KNAVES", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::KnightsAndKnaves)))))))], - - [ModusTollens, "MODUS_TOLLENS", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inl(RedundantPrepositionalInference::ModusTollens))))))))], - [HypotheticalSyllogism, "HYPOTHETICAL_SYLLOGISM", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inl(RedundantPrepositionalInference::HypotheticalSyllogism))))))))], - [DisjunctiveSyllogism, "DISJUNCTIVE_SYLLOGISM", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inl(RedundantPrepositionalInference::DisjunctiveSyllogism))))))))], - [ExcludedMiddle, "EXCLUDED_MIDDLE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inl(RedundantPrepositionalInference::ExcludedMiddle))))))))], - [ConstructiveDilemma, "CONSTRUCTIVE_DILEMMA", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inl(RedundantPrepositionalInference::ConstructiveDilemma))))))))], - [HalfDeMorgan, "HALF_DE_MORGAN", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inl(RedundantPrepositionalInference::HalfDeMorgan))))))))], - [QuantifierInference, "QUANTIFIER_INFERENCE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inl(RedundantPrepositionalInference::QuantifierInference))))))))], - - [Resolution, "RESOLUTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(AutomationRelatedRules::Resolution)))))))))], - [TruthFunctionalConsequence, "TRUTHFUNCTIONAL_CONSEQUENCE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(AutomationRelatedRules::TruthFunctionalConsequence)))))))))], - - [QuantifierNegation, "QUANTIFIER_NEGATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::QuantifierNegation))))))))))], - [NullQuantification, "NULL_QUANTIFICATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::NullQuantification))))))))))], - [ReplacingBoundVars, "REPLACING_BOUND_VARS", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::ReplacingBoundVars))))))))))], - [SwappingQuantifiers, "SWAPPING_QUANTIFIERS", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::SwappingQuantifiers))))))))))], - [AristoteleanSquare, "ARISTOTELEAN_SQUARE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::AristoteleanSquare))))))))))], - [QuantifierDistribution, "QUANTIFIER_DISTRIBUTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::QuantifierDistribution))))))))))], - [PrenexLaws, "PRENEX_LAWS", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::PrenexLaws))))))))))], - - [WeakInduction, "WEAK_INDUCTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(Induction::Weak)))))))))))], - [StrongInduction, "STRONG_INDUCTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(Induction::Strong)))))))))))], - - [EmptyRule, "EMPTY_RULE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(super::EmptyRule))))))))))))] + [DisjunctiveSyllogism, "DISJUNCTIVE_SYLLOGISM", (SharedChecks(Inr(Inr(Inl(BooleanInference::DisjunctiveSyllogism)))))], + [Exclusion, "EXCLUSION", (SharedChecks(Inr(Inr(Inl(BooleanInference::Exclusion)))))], + [ExcludedMiddle, "EXCLUDED_MIDDLE", (SharedChecks(Inr(Inr(Inl(BooleanInference::ExcludedMiddle)))))], + [HalfDeMorgan, "HALF_DE_MORGAN", (SharedChecks(Inr(Inr(Inl(BooleanInference::HalfDeMorgan)))))], + + [ModusTollens, "MODUS_TOLLENS", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalInference::ModusTollens))))))], + [HypotheticalSyllogism, "HYPOTHETICAL_SYLLOGISM", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalInference::HypotheticalSyllogism))))))], + [ConstructiveDilemma, "CONSTRUCTIVE_DILEMMA", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalInference::ConstructiveDilemma))))))], + [DestructiveDilemma, "DESTRUCTIVE_DILEMMA", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalInference::DestructiveDilemma))))))], + [StrengthenAntecedent, "STRENGTHEN_ANTECEDENT", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalInference::StrengthenAntecedent))))))], + [WeakenConsequent, "WEAKEN_CONSEQUENT", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalInference::WeakenConsequent))))))], + [ConIntroNegation, "CON_INTRO_NEGATION", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalInference::ConIntroNegation))))))], + [ConElimNegation, "CON_ELIM_NEGATION", (SharedChecks(Inr(Inr(Inr(Inl(ConditionalInference::ConElimNegation))))))], + + [BiconIntro, "BICON_INTRO", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalInference::BiconIntro)))))))], + [BiconIntroNegation, "BICON_INTRO_NEGATION", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalInference::BiconIntroNegation)))))))], + [BiconElim, "BICON_ELIM", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalInference::BiconElim)))))))], + [BiconElimNegation, "BICON_ELIM_NEGATION", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalInference::BiconElimNegation)))))))], + + [QuantifierInference, "QUANTIFIER_INFERENCE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierInference::QuantInference))))))))], + + [Association, "ASSOCIATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BooleanEquivalence::Association)))))))))], + [Commutation, "COMMUTATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BooleanEquivalence::Commutation)))))))))], + [Idempotence, "IDEMPOTENCE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BooleanEquivalence::Idempotence)))))))))], + [DeMorgan, "DE_MORGAN", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BooleanEquivalence::DeMorgan)))))))))], + [Distribution, "DISTRIBUTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BooleanEquivalence::Distribution)))))))))], + [DoubleNegation, "DOUBLENEGATION_EQUIV", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BooleanEquivalence::DoubleNegation)))))))))], + [Complement, "COMPLEMENT", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BooleanEquivalence::Complement)))))))))], + [Identity, "IDENTITY", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BooleanEquivalence::Identity)))))))))], + [Annihilation, "ANNIHILATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BooleanEquivalence::Annihilation)))))))))], + [Inverse, "INVERSE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BooleanEquivalence::Inverse)))))))))], + [Absorption, "ABSORPTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BooleanEquivalence::Absorption)))))))))], + [Reduction, "REDUCTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BooleanEquivalence::Reduction)))))))))], + [Adjacency, "ADJACENCY", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BooleanEquivalence::Adjacency)))))))))], + + [Implication, "IMPLICATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(ConditionalEquivalence::Implication))))))))))], + [Contraposition, "CONTRAPOSITION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(ConditionalEquivalence::Contraposition))))))))))], + [Exportation, "Exportation", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(ConditionalEquivalence::Exportation))))))))))], + [ConditionalDistribution, "CONDITIONAL_DISTRIBUTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(ConditionalEquivalence::ConditionalDistribution))))))))))], + [ConditionalAbsorption, "CONDITIONAL_ABSORPTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(ConditionalEquivalence::ConditionalAbsorption))))))))))], + [ConditionalReduction, "CONDITIONAL_REDUCTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(ConditionalEquivalence::ConditionalReduction))))))))))], + [ConditionalIdempotence, "CONDITIONAL_IDEMPOTENCE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(ConditionalEquivalence::ConditionalIdempotence))))))))))], + [ConditionalComplement, "CONDITIONAL_COMPLEMENT", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(ConditionalEquivalence::ConditionalComplement))))))))))], + [ConditionalIdentity, "CONDITIONAL_IDENTITY", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(ConditionalEquivalence::ConditionalIdentity))))))))))], + [ConditionalAnnihilation, "CONDITIONAL_ANNIHILATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(ConditionalEquivalence::ConditionalAnnihilation))))))))))], + + [BiEquivalence, "BICONDITIONAL_EQUIVALENCE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiEquivalence)))))))))))], + [BiconditionalContraposition, "BICONDITIONAL_CONTRAPOSITION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalContraposition)))))))))))], + [BiconditionalCommutation, "BICONDITIONAL_COMMUTATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalCommutation)))))))))))], + [BiconditionalAssociation, "BICONDITIONAL_ASSOCIATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalAssociation)))))))))))], + [BiconditionalReduction, "BICONDITIONAL_REDUCTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalReduction)))))))))))], + [BiconditionalComplement, "BICONDITIONAL_COMPLEMENT", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalComplement)))))))))))], + [BiconditionalIdentity, "BICONDITIONAL_IDENTITY", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalIdentity)))))))))))], + [BiconditionalNegation, "BICONDITIONAL_NEGATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalNegation)))))))))))], + [BiconditionalSubstitution, "BICONDITIONAL_SUBSTITUTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::BiconditionalSubstitution)))))))))))], + [KnightsAndKnaves, "KNIGHTS_AND_KNAVES", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BiconditionalEquivalence::KnightsAndKnaves)))))))))))], + + [QuantifierNegation, "QUANTIFIER_NEGATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::QuantifierNegation))))))))))))], + [NullQuantification, "NULL_QUANTIFICATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::NullQuantification))))))))))))], + [ReplacingBoundVars, "REPLACING_BOUND_VARS", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::ReplacingBoundVars))))))))))))], + [SwappingQuantifiers, "SWAPPING_QUANTIFIERS", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::SwappingQuantifiers))))))))))))], + [AristoteleanSquare, "ARISTOTELEAN_SQUARE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::AristoteleanSquare))))))))))))], + [QuantifierDistribution, "QUANTIFIER_DISTRIBUTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::QuantifierDistribution))))))))))))], + [PrenexLaws, "PRENEX_LAWS", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::PrenexLaws))))))))))))], + + [Reiteration, "REITERATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(Special::Reiteration)))))))))))))], + [Resolution, "RESOLUTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(Special::Resolution)))))))))))))], + [TruthFunctionalConsequence, "TRUTHFUNCTIONAL_CONSEQUENCE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(Special::TruthFunctionalConsequence)))))))))))))], + + [WeakInduction, "WEAK_INDUCTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(Induction::Weak))))))))))))))], + [StrongInduction, "STRONG_INDUCTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(Induction::Strong))))))))))))))], + + [EmptyRule, "EMPTY_RULE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(super::EmptyRule)))))))))))))))] } } @@ -348,8 +386,14 @@ pub mod RuleM { pub enum RuleClassification { Introduction, Elimination, - #[strum(to_string = "Misc. Inference")] - MiscInference, + #[strum(to_string = "Boolean Inference")] + BooleanInference, + #[strum(to_string = "Conditional Inference")] + ConditionalInference, + #[strum(to_string = "Biconditional Inference")] + BiconditionalInference, + #[strum(to_string = "Quantifier Inference")] + QuantifierInference, #[strum(to_string = "Boolean Equivalence")] BooleanEquivalence, #[strum(to_string = "Conditional Equivalence")] @@ -358,6 +402,8 @@ pub enum RuleClassification { BiconditionalEquivalence, #[strum(to_string = "Quantifier Equivalence")] QuantifierEquivalence, + Special, + Induction, } impl RuleClassification { @@ -481,7 +527,6 @@ impl RuleT for PrepositionalInference { fn get_name(&self) -> String { use PrepositionalInference::*; match self { - Reit => "Reiteration", AndIntro => "∧ Introduction", AndElim => "∧ Elimination", OrIntro => "∨ Introduction", @@ -504,9 +549,6 @@ impl RuleT for PrepositionalInference { use RuleClassification::*; let mut ret = HashSet::new(); match self { - Reit => { - ret.insert(MiscInference); - } AndIntro | OrIntro | ImpIntro | NotIntro | ContradictionIntro | BiconditionalIntro | EquivalenceIntro => { ret.insert(Introduction); } @@ -519,7 +561,7 @@ impl RuleT for PrepositionalInference { fn num_deps(&self) -> Option { use PrepositionalInference::*; match self { - Reit | AndElim | OrIntro | OrElim | NotElim | ContradictionElim => Some(1), + AndElim | OrIntro | OrElim | NotElim | ContradictionElim => Some(1), ContradictionIntro | ImpElim | BiconditionalElim | EquivalenceElim => Some(2), NotIntro | ImpIntro => Some(0), AndIntro | BiconditionalIntro | EquivalenceIntro => None, // AndIntro can have arbitrarily many conjuncts in one application @@ -529,7 +571,7 @@ impl RuleT for PrepositionalInference { use PrepositionalInference::*; match self { NotIntro | ImpIntro => Some(1), - Reit | AndElim | OrIntro | NotElim | ContradictionElim | ContradictionIntro | ImpElim | AndIntro | BiconditionalElim | EquivalenceElim => Some(0), + AndElim | OrIntro | NotElim | ContradictionElim | ContradictionIntro | ImpElim | AndIntro | BiconditionalElim | EquivalenceElim => Some(0), OrElim | BiconditionalIntro | EquivalenceIntro => None, } } @@ -539,14 +581,6 @@ impl RuleT for PrepositionalInference { use PrepositionalInference::*; use ProofCheckError::*; match self { - Reit => { - let prem = p.lookup_expr_or_die(&deps[0])?; - if prem == conclusion { - Ok(()) - } else { - Err(DoesNotOccur(conclusion, prem)) - } - } AndIntro => { if deps.len() == 1 { let single_dep_expr = p.lookup_expr_or_die(&deps[0])?; @@ -570,7 +604,7 @@ impl RuleT for PrepositionalInference { } Ok(()) } else { - Err(ConclusionOfWrongForm(Expr::assocplaceholder(Op::And))) + Err(ConclusionOfWrongForm(Expr::assoc_place_holder(Op::And))) } } AndElim => { @@ -601,7 +635,7 @@ impl RuleT for PrepositionalInference { } } } else { - Err(DepDoesNotExist(Expr::assocplaceholder(Op::And), true)) + Err(DepDoesNotExist(Expr::assoc_place_holder(Op::And), true)) } } OrIntro => { @@ -618,7 +652,7 @@ impl RuleT for PrepositionalInference { } Ok(()) } else { - Err(ConclusionOfWrongForm(Expr::assocplaceholder(Op::Or))) + Err(ConclusionOfWrongForm(Expr::assoc_place_holder(Op::Or))) } } OrElim => { @@ -641,7 +675,7 @@ impl RuleT for PrepositionalInference { } Ok(()) } else { - Err(DepDoesNotExist(Expr::assocplaceholder(Op::Or), true)) + Err(DepDoesNotExist(Expr::assoc_place_holder(Op::Or), true)) } } ImpIntro => { @@ -771,7 +805,7 @@ impl RuleT for PrepositionalInference { AnyOrderResult::WrongOrder } }, - || DepDoesNotExist(Expr::assocplaceholder(Op::Bicon), true), + || DepDoesNotExist(Expr::assoc_place_holder(Op::Bicon), true), ) } EquivalenceIntro | BiconditionalIntro => { @@ -808,7 +842,7 @@ impl RuleT for PrepositionalInference { slab.entry(*right.clone()).or_insert_with(|| next()); g.add_edge(slab[left], slab[right], ()); } - _ => return Err(OneOf(btreeset![DepOfWrongForm(prem.clone(), Expr::assocplaceholder(oper)), DepOfWrongForm(prem.clone(), Expr::impl_place_holder()),])), + _ => return Err(OneOf(btreeset![DepOfWrongForm(prem.clone(), Expr::assoc_place_holder(oper)), DepOfWrongForm(prem.clone(), Expr::impl_place_holder()),])), } } for sproof in sproofs.iter() { @@ -847,7 +881,7 @@ impl RuleT for PrepositionalInference { } } } - Err(ConclusionOfWrongForm(Expr::assocplaceholder(oper))) + Err(ConclusionOfWrongForm(Expr::assoc_place_holder(oper))) } EquivalenceElim => { let prem1 = p.lookup_expr_or_die(&deps[0])?; @@ -869,7 +903,7 @@ impl RuleT for PrepositionalInference { AnyOrderResult::WrongOrder } }, - || DepDoesNotExist(Expr::assocplaceholder(Op::Equiv), true), + || DepDoesNotExist(Expr::assoc_place_holder(Op::Equiv), true), ) } } @@ -968,7 +1002,7 @@ impl RuleT for PredicateInference { } Err(Other(format!("Couldn't find a subproof line that unifies with the conclusion ({conclusion})."))) } else { - Err(ConclusionOfWrongForm(Expr::quant_placeholder(QuantKind::Forall))) + Err(ConclusionOfWrongForm(Expr::quant_place_holder(QuantKind::Forall))) } } ForallElim => { @@ -977,7 +1011,7 @@ impl RuleT for PredicateInference { unifies_wrt_var::

(body, &conclusion, name)?; Ok(()) } else { - Err(DepOfWrongForm(prem, Expr::quant_placeholder(QuantKind::Forall))) + Err(DepOfWrongForm(prem, Expr::quant_place_holder(QuantKind::Forall))) } } ExistsIntro => { @@ -986,7 +1020,7 @@ impl RuleT for PredicateInference { unifies_wrt_var::

(body, &prem, name)?; Ok(()) } else { - Err(ConclusionOfWrongForm(Expr::quant_placeholder(QuantKind::Exists))) + Err(ConclusionOfWrongForm(Expr::quant_place_holder(QuantKind::Exists))) } } ExistsElim => { @@ -1019,7 +1053,7 @@ impl RuleT for PredicateInference { return Err(Other(format!("Premise {subprem} doesn't unify with the body of dependency {prem}"))); } } else { - return Err(DepOfWrongForm(prem, Expr::quant_placeholder(QuantKind::Exists))); + return Err(DepOfWrongForm(prem, Expr::quant_place_holder(QuantKind::Exists))); } }; for (r, expr) in sproof.exprs().into_iter().map(|r| sproof.lookup_expr_or_die(&r).map(|e| (r, e))).collect::, _>>()? { @@ -1040,153 +1074,775 @@ impl RuleT for PredicateInference { } } -fn check_by_normalize_first_expr(p: &P, deps: Vec>, conclusion: Expr, commutative: bool, normalize_fn: F, restriction: &str) -> Result<(), ProofCheckError, P::SubproofReference>> -where - F: Fn(Expr) -> Expr, -{ - let mut premise = p.lookup_expr_or_die(&deps[0])?; - let mut conclusion_mut = conclusion; - if commutative { - premise = premise.sort_commutative_ops(restriction); - conclusion_mut = conclusion_mut.sort_commutative_ops(restriction); +impl RuleT for BooleanInference { + fn get_name(&self) -> String { + use BooleanInference::*; + match self { + DisjunctiveSyllogism => "Disjunctive Syllogism", + Exclusion => "Exclusion", + ExcludedMiddle => "Excluded Middle", + HalfDeMorgan => "Half DeMorgan", + } + .into() } - let mut p = normalize_fn(premise.clone()); - let mut q = normalize_fn(conclusion_mut); - if commutative { - p = p.sort_commutative_ops(restriction); - q = q.sort_commutative_ops(restriction); + fn get_classifications(&self) -> HashSet { + [RuleClassification::BooleanInference].iter().cloned().collect() } - if p == q { - Ok(()) - } else { - Err(ProofCheckError::Other(format!("{p} and {q} are not equal. {:?}", premise))) + fn num_deps(&self) -> Option { + use BooleanInference::*; + match self { + DisjunctiveSyllogism | Exclusion => Some(2), + ExcludedMiddle => Some(0), + HalfDeMorgan => Some(1), + } } -} - -fn check_by_normalize_first_expr_one_way(p: &P, deps: Vec>, conclusion: Expr, normalize_fn: F) -> Result<(), ProofCheckError, P::SubproofReference>> -where - F: Fn(Expr) -> Expr, -{ - let premise = p.lookup_expr_or_die(&deps[0])?; - let p = normalize_fn(premise.clone()); - if p == conclusion.clone() { - Ok(()) - } else { - Err(ProofCheckError::Other(format!("{p} and {conclusion} are not equal. {:?}", premise))) + fn num_subdeps(&self) -> Option { + Some(0) } -} + fn check(self, proof: &P, conclusion: Expr, deps: Vec>, sdeps: Vec) -> Result<(), ProofCheckError, P::SubproofReference>> { + use ProofCheckError::*; + use BooleanInference::*; -fn check_by_normalize_multiple_possibilities(p: &P, deps: Vec>, conclusion: Expr, normalize_fn: F) -> Result<(), ProofCheckError, P::SubproofReference>> -where - F: Fn(Expr) -> Vec, -{ - let premise = p.lookup_expr_or_die(&deps[0])?; + assert!(sdeps.is_empty()); + match self { + DisjunctiveSyllogism => { + let dep_0 = proof.lookup_expr_or_die(&deps[0])?; + let dep_1 = proof.lookup_expr_or_die(&deps[1])?; - // Generate all possible transformed premises and conclusions - let premise_possibilities = normalize_fn(premise); - let conclusion_possibilities = normalize_fn(conclusion); + let is_disjunctive_case = |disj, negation, conclusion| { + if let Expr::Assoc { op: Op::Or, exprs } = disj { + if exprs.len() == 2 { + let (p, q) = (&exprs[0], &exprs[1]); - // Check if any conclusion possibility matches a premise possibility - for premise_expr in premise_possibilities.iter() { - for conclusion_expr in conclusion_possibilities.iter() { - if premise_expr == conclusion_expr { - return Ok(()); // If a match is found, return success + match (p, q, negation, conclusion) { + // Case 1: P | Q, ~P concludes Q + (p_expr, q_expr, Expr::Not { operand }, conclusion) if p_expr == &*operand && q_expr == conclusion => true, + // Case 2: P | Q, ~Q concludes P + (p_expr, q_expr, Expr::Not { operand }, conclusion) if q_expr == &*operand && p_expr == conclusion => true, + // Case 3: ~P | Q, P concludes Q + (Expr::Not { operand }, q_expr, p_expr, conclusion) if **operand == p_expr && q_expr == conclusion => true, + // Case 4: P | ~Q, Q concludes P + (p_expr, Expr::Not { operand }, q_expr, conclusion) if **operand == q_expr && p_expr == conclusion => true, + _ => false, + } + } else { + false + } + } else { + false + } + }; + + // Check if dep_0 or dep_1 is the disjunction, and apply the disjunctive syllogism rule + if is_disjunctive_case(dep_0.clone(), dep_1.clone(), &conclusion) || is_disjunctive_case(dep_1, dep_0, &conclusion) { + Ok(()) + } else { + Err(ProofCheckError::Other("Conclusion does not logically follow from premises".to_string())) + } } - } - } + Exclusion => { + let dep_0 = proof.lookup_expr_or_die(&deps[0])?; + let dep_1 = proof.lookup_expr_or_die(&deps[1])?; - Err(ProofCheckError::Other("None of the possible normalized premises match the conclusion.".to_string())) -} + let is_exclusion_case = |neg_conj, premise, conclusion| { + if let Expr::Not { operand } = neg_conj { + if let Expr::Assoc { op: Op::And, exprs } = operand.as_ref() { + if exprs.len() == 2 { + let (p, q) = (&exprs[0], &exprs[1]); + + match (p, q, premise, conclusion) { + // Case 1: !(P & Q), P concludes ~Q + (p_expr, q_expr, premise_expr, Expr::Not { operand: concl_q }) if *p_expr == premise_expr && q_expr == &*concl_q => true, + // Case 2: !(P & Q), Q concludes ~P + (p_expr, q_expr, premise_expr, Expr::Not { operand: concl_p }) if *q_expr == premise_expr && p_expr == &*concl_p => true, + // Case 3: !(P & ~Q), P concludes Q + (p_expr, Expr::Not { operand: q_expr }, premise_expr, conclusion_expr) if *p_expr == premise_expr && **q_expr == conclusion_expr => true, + // Case 4: !(!P & Q), Q concludes P + (Expr::Not { operand: p_expr }, q_expr, premise_expr, conclusion_expr) if *q_expr == premise_expr && **p_expr == conclusion_expr => true, + _ => false, + } + } else { + false + } + } else { + false + } + } else { + false + } + }; -fn check_by_rewrite_rule_confl(p: &P, deps: Vec>, conclusion: Expr, commutative: bool, rule: &RewriteRule, restriction: &str) -> Result<(), ProofCheckError, P::SubproofReference>> { - check_by_normalize_first_expr(p, deps, conclusion, commutative, |e| rule.reduce(e), restriction) -} + if is_exclusion_case(dep_0.clone(), dep_1.clone(), conclusion.clone()) || is_exclusion_case(dep_1, dep_0, conclusion) { + Ok(()) + } else { + Err(ProofCheckError::Other("Conclusion does not logically follow from premises".to_string())) + } + } + ExcludedMiddle => { + // A | ~A + let wrong_form_err = ConclusionOfWrongForm(Expr::var("_") | !Expr::var("_")); + let operands = match conclusion { + Expr::Assoc { op: Op::Or, exprs } => exprs, + _ => return Err(wrong_form_err), + }; -// fn check_by_rewrite_rule_non_confl(p: &P, deps: Vec>, conclusion: Expr, commutative: bool, rule: &RewriteRule, restriction: &str) -> Result<(), ProofCheckError, P::SubproofReference>> { -// let premise = p.lookup_expr_or_die(&deps[0])?; -// let premise_set = rule.reduce_set(premise.clone()); -// let conclusion_set = rule.reduce_set(conclusion.clone()); -// let (premise_set, conclusion_set) = if commutative { -// let sort_ops = |set: HashSet| set.into_iter().map(|expr| expr.sort_commutative_ops(restriction)).collect(); -// (sort_ops(premise_set), sort_ops(conclusion_set)) -// } else { -// (premise_set, conclusion_set) -// }; -// // The premise and conclusion are equal if the set intersection is nonempty -// let is_eq = premise_set.intersection(&conclusion_set).next().is_some(); -// if is_eq { -// Ok(()) -// } else { -// Err(ProofCheckError::Other(format!("{premise} and {conclusion} are not equal."))) -// } -// } + let (a, not_a) = match operands.as_slice() { + [a, not_a] => (a, not_a), + _ => return Err(wrong_form_err), + }; -impl RuleT for BooleanEquivalence { + let not_a_0 = not_a.clone(); + let not_a_1 = !(a.clone()); + + if not_a_0 == not_a_1 { + Ok(()) + } else { + Err(DoesNotOccur(not_a_0, not_a_1)) + } + } + HalfDeMorgan => check_by_normalize_multiple_possibilities(proof, deps, conclusion, |e| e.normalize_halfdemorgans()), + } + } +} + +impl RuleT for ConditionalInference { fn get_name(&self) -> String { - use BooleanEquivalence::*; + use ConditionalInference::*; match self { - DeMorgan => "DeMorgan", - Association => "Association", - Commutation => "Commutation", - Idempotence => "Idempotence", - Distribution => "Distribution", - DoubleNegation => "Double Negation", - Complement => "Complement", - Identity => "Identity", - Annihilation => "Annihilation", - Inverse => "Inverse", - Absorption => "Absorption", - Reduction => "Reduction", - Adjacency => "Adjacency", + ModusTollens => "Modus Tollens", + HypotheticalSyllogism => "Hypothetical Syllogism", + ConstructiveDilemma => "Constructive Dilemma", + DestructiveDilemma => "Destructive Dilemma", + StrengthenAntecedent => "Strengthening the Antecedent", + WeakenConsequent => "Weakening the Consequent", + ConIntroNegation => "Conditional Introduction Negation", + ConElimNegation => "Conditional Elimination Negation" } .into() } fn get_classifications(&self) -> HashSet { - [RuleClassification::BooleanEquivalence].iter().cloned().collect() + [RuleClassification::ConditionalInference].iter().cloned().collect() } fn num_deps(&self) -> Option { - Some(1) - } // all equivalence rules rewrite a single statement - fn num_subdeps(&self) -> Option { - Some(0) - } - fn check(self, p: &P, conclusion: Expr, deps: Vec>, _sdeps: Vec) -> Result<(), ProofCheckError, P::SubproofReference>> { - use BooleanEquivalence::*; + use ConditionalInference::*; match self { - DeMorgan => check_by_normalize_first_expr(p, deps, conclusion, false, |e| e.normalize_demorgans(), "none"), - Association => check_by_normalize_first_expr(p, deps, conclusion, false, |e| e.combine_associative_ops("bool"), "bool"), - Commutation => check_by_normalize_first_expr(p, deps, conclusion, false, |e| e.sort_commutative_ops("bool"), "bool"), - Idempotence => check_by_normalize_first_expr(p, deps, conclusion, true, |e| e.normalize_idempotence(), "none"), - DoubleNegation => check_by_rewrite_rule_confl(p, deps, conclusion, false, &equivs::DOUBLE_NEGATION, "none"), - // Distribution and Reduction have outputs containing binops that need commutative sorting - // because we can't expect people to know the specific order of outputs that our definition - // of the rules uses - Distribution => check_by_rewrite_rule_confl(p, deps, conclusion, true, &equivs::DISTRIBUTION, "none"), - Complement => check_by_normalize_first_expr(p, deps, conclusion, true, |e| e.normalize_complement(), "none"), - Identity => check_by_rewrite_rule_confl(p, deps, conclusion, false, &equivs::IDENTITY, "none"), - Annihilation => check_by_rewrite_rule_confl(p, deps, conclusion, false, &equivs::ANNIHILATION, "none"), - Inverse => check_by_rewrite_rule_confl(p, deps, conclusion, false, &equivs::INVERSE, "none"), - Absorption => check_by_normalize_first_expr(p, deps, conclusion, true, |e| e.normalize_absorption(), "none"), - Reduction => check_by_normalize_first_expr(p, deps, conclusion, true, |e| e.normalize_reduction(), "none"), - Adjacency => check_by_normalize_first_expr(p, deps, conclusion, true, |e| e.normalize_adjacency(), "none"), + ModusTollens | HypotheticalSyllogism => Some(2), + ConstructiveDilemma | DestructiveDilemma => Some(3), + StrengthenAntecedent | WeakenConsequent | ConIntroNegation | ConElimNegation => Some(1), } } -} + fn num_subdeps(&self) -> Option { + Some(0) + } + fn check(self, proof: &P, conclusion: Expr, deps: Vec>, sdeps: Vec) -> Result<(), ProofCheckError, P::SubproofReference>> { + use ProofCheckError::*; + use ConditionalInference::*; -impl RuleT for ConditionalEquivalence { - fn get_name(&self) -> String { - use ConditionalEquivalence::*; + assert!(sdeps.is_empty()); match self { - Implication => "Implication", - Contraposition => "Contraposition", - Exportation => "Exportation", - ConditionalDistribution => "Conditional Distribution", - ConditionalAbsorption => "Conditional Absorption", - ConditionalReduction => "Conditional Reduction", - ConditionalIdempotence => "Conditional Idempotence", - ConditionalComplement => "Conditional Complement", - ConditionalIdentity => "Conditional Identity", - ConditionalAnnihilation => "Conditional Annihilation", + ModusTollens => { + let dep_0 = proof.lookup_expr_or_die(&deps[0])?; + let dep_1 = proof.lookup_expr_or_die(&deps[1])?; + + let is_modus_tollens_case = |implication, negation, conclusion| { + if let Expr::Impl { left, right } = implication { + match (left.as_ref(), right.as_ref(), negation, conclusion) { + // Case 1: P -> Q, ~Q concludes ~P + (p, q, Expr::Not { operand }, Expr::Not { operand: concl_p }) if q == &*operand && p == &*concl_p => true, + // Case 2: P -> ~Q, Q concludes ~P + (p, Expr::Not { operand: q }, neg_q, Expr::Not { operand: concl_p }) if **q == neg_q && p == &*concl_p => true, + // Case 3: ~P -> Q, ~Q concludes P + (Expr::Not { operand: p }, q, Expr::Not { operand: neg_q }, concl_p) if *q == *neg_q && **p == concl_p => true, + // Case 4: ~P -> ~Q, Q concludes P + (Expr::Not { operand: p }, Expr::Not { operand: q }, neg_q, concl_p) if **q == neg_q && **p == concl_p => true, + _ => false, + } + } else { + false + } + }; + + // Check if dep_0 or dep_1 is the implication, and apply the Modus Tollens rule + if is_modus_tollens_case(dep_0.clone(), dep_1.clone(), conclusion.clone()) || is_modus_tollens_case(dep_1, dep_0, conclusion) { + Ok(()) + } else { + Err(ProofCheckError::Other("Conclusion does not logically follow from premises".to_string())) + } + } + HypotheticalSyllogism => { + // P -> Q, Q -> R + // -------------- + // P -> R + let dep_0 = proof.lookup_expr_or_die(&deps[0])?; + let dep_1 = proof.lookup_expr_or_die(&deps[1])?; + either_order( + &dep_0, + &dep_1, + |dep_0, dep_1| { + if let (Expr::Impl { left: p_0, right: q_0 }, Expr::Impl { left: q_1, right: r_0 }, Expr::Impl { left: p_1, right: r_1 }) = (dep_0, dep_1, &conclusion) { + if p_0 != p_1 { + AnyOrderResult::Err(DoesNotOccur(*p_0.clone(), *p_1.clone())) + } else if q_0 != q_1 { + AnyOrderResult::Err(DoesNotOccur(*q_0.clone(), *q_1.clone())) + } else if r_0 != r_1 { + AnyOrderResult::Err(DoesNotOccur(*r_0.clone(), *r_1.clone())) + } else { + AnyOrderResult::Ok + } + } else { + AnyOrderResult::WrongOrder + } + }, + || DepDoesNotExist(Expr::impl_place_holder(), true), + ) + } + ConstructiveDilemma => { + // P -> Q, R -> S, P | R + // --------------------- + // Q | S + let deps = deps.into_iter().map(|dep| proof.lookup_expr_or_die(&dep)).collect::, _>>()?; + any_order( + &deps, + |deps| { + let (dep_0, dep_1, dep_2) = deps.iter().collect_tuple().unwrap(); + if let (Expr::Impl { left: p_0, right: q_0 }, Expr::Impl { left: r_0, right: s_0 }, Expr::Assoc { op: Op::Or, exprs: p_r }, Expr::Assoc { op: Op::Or, exprs: q_s }) = (dep_0, dep_1, dep_2, &conclusion) { + let p_0 = *p_0.clone(); + let q_0 = *q_0.clone(); + let r_0 = *r_0.clone(); + let s_0 = *s_0.clone(); + let dep_2 = (*dep_2).clone(); + let conclusion = conclusion.clone(); + + let (p_1, r_1) = match p_r.iter().collect_tuple() { + Some((p_1, r_1)) => (p_1, r_1), + None => return AnyOrderResult::Err(DoesNotOccur(p_0 | r_0, dep_2)), + }; + let (q_1, s_1) = match q_s.iter().collect_tuple() { + Some((q_1, s_1)) => (q_1, s_1), + None => return AnyOrderResult::Err(DoesNotOccur(q_0 | s_0, conclusion)), + }; + + let p_1 = p_1.clone(); + let q_1 = q_1.clone(); + let r_1 = r_1.clone(); + let s_1 = s_1.clone(); + + if p_0 != p_1 { + AnyOrderResult::Err(DoesNotOccur(p_0, p_1)) + } else if q_0 != q_1 { + AnyOrderResult::Err(DoesNotOccur(q_0, q_1)) + } else if r_0 != r_1 { + AnyOrderResult::Err(DoesNotOccur(r_0, r_1)) + } else if s_0 != s_1 { + AnyOrderResult::Err(DoesNotOccur(s_0, s_1)) + } else { + AnyOrderResult::Ok + } + } else { + AnyOrderResult::WrongOrder + } + }, + || OneOf(btreeset![DepDoesNotExist(Expr::impl_place_holder(), true), DepDoesNotExist(Expr::assoc_place_holder(Op::Or), true),]), + ) + } + DestructiveDilemma => { + // ~R | ~S, P -> R, Q -> S + // ----------------------- + // ~P | ~Q OR ~Q | ~P + let deps = deps.into_iter().map(|dep| proof.lookup_expr_or_die(&dep)).collect::, _>>()?; + any_order( + &deps, + |deps| { + let (dep_0, dep_1, dep_2) = deps.iter().collect_tuple().unwrap(); + if let (Expr::Assoc { op: Op::Or, exprs: neg_rs }, Expr::Impl { left: p_0, right: r_0 }, Expr::Impl { left: q_0, right: s_0 }, Expr::Assoc { op: Op::Or, exprs: neg_pq }) = (dep_0, dep_1, dep_2, &conclusion) { + let p_0 = *p_0.clone(); + let q_0 = *q_0.clone(); + let r_0 = *r_0.clone(); + let s_0 = *s_0.clone(); + let dep_0 = (*dep_0).clone(); + let conclusion = conclusion.clone(); + + let (neg_r, neg_s) = match neg_rs.iter().collect_tuple() { + Some((neg_r, neg_s)) => (neg_r, neg_s), + None => return AnyOrderResult::Err(DoesNotOccur(Expr::assoc_place_holder(Op::Or), dep_0)), + }; + + let neg_p_set = neg_pq.iter().collect::>(); + + let neg_r = neg_r.clone(); + let neg_s = neg_s.clone(); + + if let Expr::Not { operand: r_1 } = neg_r { + if r_0 != *r_1 { + return AnyOrderResult::Err(DoesNotOccur(r_0, *r_1)); + } + } else { + return AnyOrderResult::WrongOrder; + } + + if let Expr::Not { operand: s_1 } = neg_s { + if s_0 != *s_1 { + return AnyOrderResult::Err(DoesNotOccur(s_0, *s_1)); + } + } else { + return AnyOrderResult::WrongOrder; + } + + let expected_neg_p = Expr::Not { operand: Box::new(p_0.clone()) }; + let expected_neg_q = Expr::Not { operand: Box::new(q_0.clone()) }; + + if !neg_p_set.contains(&expected_neg_p) || !neg_p_set.contains(&expected_neg_q) { + return AnyOrderResult::Err(DoesNotOccur(Expr::assoc_place_holder(Op::Or), conclusion)); + } + + AnyOrderResult::Ok + } else { + AnyOrderResult::WrongOrder + } + }, + || OneOf(btreeset![DepDoesNotExist(Expr::assoc_place_holder(Op::Or), true), DepDoesNotExist(Expr::impl_place_holder(), true),]), + ) + } + StrengthenAntecedent => { + let dep_0 = proof.lookup_expr_or_die(&deps[0])?; + if let Expr::Impl { left, right } = dep_0.clone() { + // Case 1: Premise: P -> R, Conclusion: (P & Q) -> R or (Q & P) -> R + if let Expr::Impl { left: strengthened_left, right: strengthened_right } = conclusion.clone() { + if *right == *strengthened_right { + if let Expr::Assoc { op: Op::And, exprs } = strengthened_left.as_ref() { + if exprs.contains(&*left) { + return Ok(()); + } + } + } + } + + // Case 2: Premise: (P | Q) -> R, Conclusion: P -> R or Q -> R + if let Expr::Impl { left: conclusion_left, right: conclusion_right } = conclusion { + if *right == *conclusion_right { + if let Expr::Assoc { op: Op::Or, exprs } = left.as_ref() { + if exprs.contains(&*conclusion_left) { + return Ok(()); + } + } + } + } + } + + Err(ProofCheckError::Other("Conclusion does not follow from the Strengthening the Antecedent rule.".to_string())) + } + WeakenConsequent => { + let dep_0 = proof.lookup_expr_or_die(&deps[0])?; + if let Expr::Impl { left, right } = dep_0.clone() { + // Case 1 and 2: Premise: P -> (Q & R), Conclusion: P -> Q or P -> R + if let Expr::Impl { left: conclusion_left, right: conclusion_right } = conclusion.clone() { + if *left == *conclusion_left { + if let Expr::Assoc { op: Op::And, exprs } = right.as_ref() { + if exprs.contains(&*conclusion_right) { + return Ok(()); + } + } + } + } + + // Case 3 and 4: Premise: P -> Q, Conclusion: P -> (Q | R) or P -> (R | Q) + if let Expr::Impl { left: conclusion_left, right: conclusion_right } = conclusion { + if *left == *conclusion_left { + if let Expr::Assoc { op: Op::Or, exprs } = conclusion_right.as_ref() { + if exprs.contains(&*right) { + return Ok(()); + } + } + } + } + } + + Err(ProofCheckError::Other("Conclusion does not follow from the Weaken the Consequent rule.".to_string())) + } + ConIntroNegation => { + let premise = proof.lookup_expr_or_die(&deps[0])?; + + if let Expr::Impl { ref left, ref right } = conclusion { + // Case 1: Premise: ~P, Conclusion: P -> Q + if let Expr::Not { ref operand } = premise { + if **operand == **left && !matches!(**right, Expr::Not { .. }) { + return Ok(()); + } + } + + // Case 2: Premise: Q, Conclusion: P -> Q + if premise == **right && !matches!(**left, Expr::Not { .. }) { + return Ok(()); + } + } + + Err(ProofCheckError::Other( + "Conclusion does not follow from the Conditional Introduction Negation rule.".to_string(), + )) + } + + ConElimNegation => { + let premise = proof.lookup_expr_or_die(&deps[0])?; + + if let Expr::Not { ref operand } = premise { + if let Expr::Impl { ref left, ref right } = **operand { + // Case 1: Premise: ~(P -> Q), Conclusion: P + if conclusion == **left { + return Ok(()); + } + + // Case 2: Premise: ~(P -> Q), Conclusion: ~Q + if conclusion == (Expr::Not { operand: Box::new(*right.clone()) }) { + return Ok(()); + } + } + } + + Err(ProofCheckError::Other("Conclusion does not follow from the Conditional Elimination Negation rule.".to_string())) + } + } + } +} + +impl RuleT for BiconditionalInference { + fn get_name(&self) -> String { + use BiconditionalInference::*; + match self { + BiconIntro => "Biconditional Introduction", + BiconIntroNegation => "Biconditional Introduction Negation", + BiconElim => "Biconditional Elimination", + BiconElimNegation => "Biconditional Elimination Negation", + } + .into() + } + fn get_classifications(&self) -> HashSet { + [RuleClassification::BiconditionalInference].iter().cloned().collect() + } + fn num_deps(&self) -> Option { + use BiconditionalInference::*; + match self { + BiconIntro | BiconIntroNegation | BiconElim | BiconElimNegation => Some(2), + } + } + fn num_subdeps(&self) -> Option { + Some(0) + } + fn check(self, proof: &P, conclusion: Expr, deps: Vec>, sdeps: Vec) -> Result<(), ProofCheckError, P::SubproofReference>> { + use crate::rules::ProofCheckError::*; + use BiconditionalInference::*; + + assert!(sdeps.is_empty()); + match self { + BiconIntro => { + let prem1 = proof.lookup_expr_or_die(&deps[0])?; + let prem2 = proof.lookup_expr_or_die(&deps[1])?; + + either_order( + &prem1, + &prem2, + |i, j| { + match (i, j) { + // Case 1: Both premises are variables (P and Q) + (Expr::Var { name: ref left }, Expr::Var { name: ref right }) => { + if conclusion == Expr::assoc(Op::Bicon, &[Expr::var(left), Expr::var(right)]) { + return AnyOrderResult::Ok; + } + } + // Case 2: Both premises are negations (~P and ~Q) + ( + Expr::Not { operand: ref left }, + Expr::Not { operand: ref right }, + ) => { + if conclusion == Expr::assoc(Op::Bicon, &[*left.clone(), *right.clone()]) + || conclusion + == Expr::assoc( + Op::Bicon, + &[Expr::Not { operand: left.clone() }, Expr::Not { operand: right.clone() }], + ) + { + return AnyOrderResult::Ok; + } + } + _ => {} + } + + AnyOrderResult::Err(DoesNotOccur(conclusion.clone(), Expr::assoc_place_holder(Op::Bicon))) + }, + || DepDoesNotExist(Expr::assoc_place_holder(Op::Bicon), true), + ) + }, + BiconIntroNegation => { + let prem1 = proof.lookup_expr_or_die(&deps[0])?; + let prem2 = proof.lookup_expr_or_die(&deps[1])?; + + either_order( + &prem1, + &prem2, + |i, j| { + match (i, j) { + // Case 1: Premises: ~P and Q, Conclusion: ~(P <-> Q) + ( + Expr::Not { operand: ref left }, + Expr::Var { name: ref right }, + ) => { + if conclusion + == (Expr::Not { + operand: Box::new(Expr::assoc(Op::Bicon, &[*left.clone(), Expr::var(right)])), + }) + { + return AnyOrderResult::Ok; + } + } + // Case 2: Premises are P and ~Q, Conclusion: ~(P <-> Q) + ( + Expr::Var { name: ref left }, + Expr::Not { operand: ref right }, + ) => { + if conclusion + == (Expr::Not { + operand: Box::new(Expr::assoc(Op::Bicon, &[Expr::var(left), *right.clone()])), + }) + { + return AnyOrderResult::Ok; + } + } + _ => {} + } + + AnyOrderResult::Err(DoesNotOccur( + conclusion.clone(), + Expr::not_place_holder(), + )) + }, + || DepDoesNotExist(Expr::not_place_holder(), true), + ) + }, + BiconElim => { + let prem1 = proof.lookup_expr_or_die(&deps[0])?; + let prem2 = proof.lookup_expr_or_die(&deps[1])?; + + either_order( + &prem1, + &prem2, + |i, j| { + if let Expr::Assoc { ref op, ref exprs } = i { + if *op == Op::Bicon && exprs.len() == 2 { + let left = &exprs[0]; + let right = &exprs[1]; + + if let Expr::Not { ref operand } = j { + if **operand == *left && conclusion == (Expr::Not { operand: Box::new(right.clone()) }) { + return AnyOrderResult::Ok; + } else if **operand == *right && conclusion == (Expr::Not { operand: Box::new(left.clone()) }) { + return AnyOrderResult::Ok; + } else { + return AnyOrderResult::Err(DoesNotOccur(j.clone(), conclusion.clone())); + } + } + } + } + AnyOrderResult::WrongOrder + }, + || DepDoesNotExist(Expr::assoc_place_holder(Op::Bicon), true), + ) + }, + BiconElimNegation => { + let prem1 = proof.lookup_expr_or_die(&deps[0])?; + let prem2 = proof.lookup_expr_or_die(&deps[1])?; + + either_order( + &prem1, + &prem2, + |i, j| { + if let Expr::Not { ref operand } = i { + if let Expr::Assoc { ref op, ref exprs } = **operand { + if *op == Op::Bicon && exprs.len() == 2 { + let left = &exprs[0]; + let right = &exprs[1]; + + if *left == *j { + if conclusion == (Expr::Not { operand: Box::new(right.clone()) }) { + return AnyOrderResult::Ok; + } else { + return AnyOrderResult::Err(DoesNotOccur(conclusion.clone(), right.clone())); + } + } + + if *right == *j { + if conclusion == (Expr::Not { operand: Box::new(left.clone()) }) { + return AnyOrderResult::Ok; + } else { + return AnyOrderResult::Err(DoesNotOccur(conclusion.clone(), left.clone())); + } + } + } + } + } + AnyOrderResult::WrongOrder + }, + || DepDoesNotExist(Expr::not_place_holder(), true), + ) + } + } + } +} + +impl RuleT for QuantifierInference { + fn get_name(&self) -> String { + use QuantifierInference::*; + match self { + QuantInference => "Quantifier Inference", + } + .into() + } + fn get_classifications(&self) -> HashSet { + [RuleClassification::QuantifierInference].iter().cloned().collect() + } + fn num_deps(&self) -> Option { + use QuantifierInference::*; + match self { + QuantInference => Some(1), + } + } + fn num_subdeps(&self) -> Option { + Some(0) + } + fn check(self, proof: &P, conclusion: Expr, deps: Vec>, sdeps: Vec) -> Result<(), ProofCheckError, P::SubproofReference>> { + use QuantifierInference::*; + + assert!(sdeps.is_empty()); + match self { + QuantInference => check_by_normalize_first_expr_one_way(proof, deps, conclusion, |e| e.quantifier_inference()), + } + } +} + +fn check_by_normalize_first_expr(p: &P, deps: Vec>, conclusion: Expr, commutative: bool, normalize_fn: F, restriction: &str) -> Result<(), ProofCheckError, P::SubproofReference>> +where + F: Fn(Expr) -> Expr, +{ + let mut premise = p.lookup_expr_or_die(&deps[0])?; + let mut conclusion_mut = conclusion; + if commutative { + premise = premise.sort_commutative_ops(restriction); + conclusion_mut = conclusion_mut.sort_commutative_ops(restriction); + } + let mut p = normalize_fn(premise.clone()); + let mut q = normalize_fn(conclusion_mut); + if commutative { + p = p.sort_commutative_ops(restriction); + q = q.sort_commutative_ops(restriction); + } + if p == q { + Ok(()) + } else { + Err(ProofCheckError::Other(format!("{p} and {q} are not equal. {:?}", premise))) + } +} + +fn check_by_normalize_first_expr_one_way(p: &P, deps: Vec>, conclusion: Expr, normalize_fn: F) -> Result<(), ProofCheckError, P::SubproofReference>> +where + F: Fn(Expr) -> Expr, +{ + let premise = p.lookup_expr_or_die(&deps[0])?; + let p = normalize_fn(premise.clone()); + if p == conclusion.clone() { + Ok(()) + } else { + Err(ProofCheckError::Other(format!("{p} and {conclusion} are not equal. {:?}", premise))) + } +} + +fn check_by_normalize_multiple_possibilities(p: &P, deps: Vec>, conclusion: Expr, normalize_fn: F) -> Result<(), ProofCheckError, P::SubproofReference>> +where + F: Fn(Expr) -> Vec, +{ + let premise = p.lookup_expr_or_die(&deps[0])?; + + let premise_possibilities = normalize_fn(premise); + let conclusion_possibilities = normalize_fn(conclusion); + + for premise_expr in premise_possibilities.iter() { + for conclusion_expr in conclusion_possibilities.iter() { + if premise_expr == conclusion_expr { + return Ok(()); + } + } + } + + Err(ProofCheckError::Other(format!("None of the possible normalized premises match the conclusion."))) +} + +fn check_by_rewrite_rule_confl(p: &P, deps: Vec>, conclusion: Expr, commutative: bool, rule: &RewriteRule, restriction: &str) -> Result<(), ProofCheckError, P::SubproofReference>> { + check_by_normalize_first_expr(p, deps, conclusion, commutative, |e| rule.reduce(e), restriction) +} + +impl RuleT for BooleanEquivalence { + fn get_name(&self) -> String { + use BooleanEquivalence::*; + match self { + DeMorgan => "DeMorgan", + Association => "Association", + Commutation => "Commutation", + Idempotence => "Idempotence", + Distribution => "Distribution", + DoubleNegation => "Double Negation", + Complement => "Complement", + Identity => "Identity", + Annihilation => "Annihilation", + Inverse => "Inverse", + Absorption => "Absorption", + Reduction => "Reduction", + Adjacency => "Adjacency", + } + .into() + } + fn get_classifications(&self) -> HashSet { + [RuleClassification::BooleanEquivalence].iter().cloned().collect() + } + fn num_deps(&self) -> Option { + Some(1) + } // all equivalence rules rewrite a single statement + fn num_subdeps(&self) -> Option { + Some(0) + } + fn check(self, p: &P, conclusion: Expr, deps: Vec>, _sdeps: Vec) -> Result<(), ProofCheckError, P::SubproofReference>> { + use BooleanEquivalence::*; + match self { + DeMorgan => check_by_normalize_first_expr(p, deps, conclusion, false, |e| e.normalize_demorgans(), "none"), + Association => check_by_normalize_first_expr(p, deps, conclusion, false, |e| e.combine_associative_ops("bool"), "bool"), + Commutation => check_by_normalize_first_expr(p, deps, conclusion, false, |e| e.sort_commutative_ops("bool"), "bool"), + Idempotence => check_by_normalize_first_expr(p, deps, conclusion, true, |e| e.normalize_idempotence(), "none"), + DoubleNegation => check_by_rewrite_rule_confl(p, deps, conclusion, false, &equivs::DOUBLE_NEGATION, "none"), + // Distribution and Reduction have outputs containing binops that need commutative sorting + // because we can't expect people to know the specific order of outputs that our definition + // of the rules uses + Distribution => check_by_rewrite_rule_confl(p, deps, conclusion, true, &equivs::DISTRIBUTION, "none"), + Complement => check_by_normalize_first_expr(p, deps, conclusion, true, |e| e.normalize_complement(), "none"), + Identity => check_by_rewrite_rule_confl(p, deps, conclusion, false, &equivs::IDENTITY, "none"), + Annihilation => check_by_rewrite_rule_confl(p, deps, conclusion, false, &equivs::ANNIHILATION, "none"), + Inverse => check_by_rewrite_rule_confl(p, deps, conclusion, false, &equivs::INVERSE, "none"), + Absorption => check_by_normalize_first_expr(p, deps, conclusion, true, |e| e.normalize_absorption(), "none"), + Reduction => check_by_normalize_first_expr(p, deps, conclusion, true, |e| e.normalize_reduction(), "none"), + Adjacency => check_by_normalize_first_expr(p, deps, conclusion, true, |e| e.normalize_adjacency(), "none"), + } + } +} + +impl RuleT for ConditionalEquivalence { + fn get_name(&self) -> String { + use ConditionalEquivalence::*; + match self { + Implication => "Implication", + Contraposition => "Contraposition", + Exportation => "Exportation", + ConditionalDistribution => "Conditional Distribution", + ConditionalAbsorption => "Conditional Absorption", + ConditionalReduction => "Conditional Reduction", + ConditionalIdempotence => "Conditional Idempotence", + ConditionalComplement => "Conditional Complement", + ConditionalIdentity => "Conditional Identity", + ConditionalAnnihilation => "Conditional Annihilation", } .into() } @@ -1259,232 +1915,83 @@ impl RuleT for BiconditionalEquivalence { } } -impl RuleT for RedundantPrepositionalInference { +impl RuleT for QuantifierEquivalence { fn get_name(&self) -> String { - use RedundantPrepositionalInference::*; + use QuantifierEquivalence::*; match self { - ModusTollens => "Modus Tollens", - HypotheticalSyllogism => "Hypothetical Syllogism", - DisjunctiveSyllogism => "Disjunctive Syllogism", - ExcludedMiddle => "Excluded Middle", - ConstructiveDilemma => "Constructive Dilemma", - HalfDeMorgan => "Half DeMorgan", - QuantifierInference => "Quantifier Inference", + QuantifierNegation => "Quantifier Negation", + NullQuantification => "Null Quantification", + ReplacingBoundVars => "Replacing Bound Variables", + SwappingQuantifiers => "Swapping Quantifiers of Same Type", + AristoteleanSquare => "Aristotelean Square of Opposition", + QuantifierDistribution => "Quantifier Distribution", + PrenexLaws => "Prenex Laws", } .into() } fn get_classifications(&self) -> HashSet { - [RuleClassification::MiscInference].iter().cloned().collect() + [RuleClassification::QuantifierEquivalence].iter().cloned().collect() } fn num_deps(&self) -> Option { - use RedundantPrepositionalInference::*; - match self { - ModusTollens | HypotheticalSyllogism | DisjunctiveSyllogism => Some(2), - ExcludedMiddle => Some(0), - ConstructiveDilemma => Some(3), - HalfDeMorgan | QuantifierInference => Some(1), - } - } + Some(1) + } // all equivalence rules rewrite a single statement fn num_subdeps(&self) -> Option { Some(0) } - fn check(self, proof: &P, conclusion: Expr, deps: Vec>, sdeps: Vec) -> Result<(), ProofCheckError, P::SubproofReference>> { - use ProofCheckError::*; - use RedundantPrepositionalInference::*; - - assert!(sdeps.is_empty()); + fn check(self, p: &P, conclusion: Expr, deps: Vec>, _sdeps: Vec) -> Result<(), ProofCheckError, P::SubproofReference>> { + use QuantifierEquivalence::*; match self { - ModusTollens => { - // P -> Q, ~Q - // ---------- - // ~P - let dep_0 = proof.lookup_expr_or_die(&deps[0])?; - let dep_1 = proof.lookup_expr_or_die(&deps[1])?; - either_order( - &dep_0, - &dep_1, - |dep_0, dep_1| { - if let Expr::Impl { left: p, right: q } = dep_0 { - let not_p = !(*p.clone()); - let not_q = !(*q.clone()); - if not_q != *dep_1 { - AnyOrderResult::Err(DoesNotOccur(not_q, dep_1.clone())) - } else if not_p != conclusion { - AnyOrderResult::Err(DoesNotOccur(not_p, conclusion.clone())) - } else { - AnyOrderResult::Ok - } - } else { - AnyOrderResult::WrongOrder - } - }, - || DepDoesNotExist(Expr::impl_place_holder(), true), - ) - } - HypotheticalSyllogism => { - // P -> Q, Q -> R - // -------------- - // P -> R - let dep_0 = proof.lookup_expr_or_die(&deps[0])?; - let dep_1 = proof.lookup_expr_or_die(&deps[1])?; - either_order( - &dep_0, - &dep_1, - |dep_0, dep_1| { - if let (Expr::Impl { left: p_0, right: q_0 }, Expr::Impl { left: q_1, right: r_0 }, Expr::Impl { left: p_1, right: r_1 }) = (dep_0, dep_1, &conclusion) { - if p_0 != p_1 { - AnyOrderResult::Err(DoesNotOccur(*p_0.clone(), *p_1.clone())) - } else if q_0 != q_1 { - AnyOrderResult::Err(DoesNotOccur(*q_0.clone(), *q_1.clone())) - } else if r_0 != r_1 { - AnyOrderResult::Err(DoesNotOccur(*r_0.clone(), *r_1.clone())) - } else { - AnyOrderResult::Ok - } - } else { - AnyOrderResult::WrongOrder - } - }, - || DepDoesNotExist(Expr::impl_place_holder(), true), - ) - } - DisjunctiveSyllogism => { - let dep_0 = proof.lookup_expr_or_die(&deps[0])?; - let dep_1 = proof.lookup_expr_or_die(&deps[1])?; - - let is_disjunctive_case = |disj, negation, conclusion| { - if let Expr::Assoc { op: Op::Or, exprs } = disj { - if exprs.len() == 2 { - let (p, q) = (&exprs[0], &exprs[1]); - - match (p, q, negation, conclusion) { - // Case 1: P | Q, ~P concludes Q - (p_expr, q_expr, Expr::Not { operand }, conclusion) if p_expr == &*operand && q_expr == conclusion => true, - // Case 2: P | Q, ~Q concludes P - (p_expr, q_expr, Expr::Not { operand }, conclusion) if q_expr == &*operand && p_expr == conclusion => true, - // Case 3: ~P | Q, P concludes Q - (Expr::Not { operand }, q_expr, p_expr, conclusion) if **operand == p_expr && q_expr == conclusion => true, - // Case 4: P | ~Q, Q concludes P - (p_expr, Expr::Not { operand }, q_expr, conclusion) if **operand == q_expr && p_expr == conclusion => true, - _ => false, - } - } else { - false - } - } else { - false - } - }; - - // Check if dep_0 or dep_1 is the disjunction, and apply the disjunctive syllogism rule - if is_disjunctive_case(dep_0.clone(), dep_1.clone(), &conclusion) || is_disjunctive_case(dep_1, dep_0, &conclusion) { - Ok(()) - } else { - Err(ProofCheckError::Other("Conclusion does not logically follow from premises".to_string())) - } - } - ExcludedMiddle => { - // A | ~A - let wrong_form_err = ConclusionOfWrongForm(Expr::var("_") | !Expr::var("_")); - let operands = match conclusion { - Expr::Assoc { op: Op::Or, exprs } => exprs, - _ => return Err(wrong_form_err), - }; - - let (a, not_a) = match operands.as_slice() { - [a, not_a] => (a, not_a), - _ => return Err(wrong_form_err), - }; - - let not_a_0 = not_a.clone(); - let not_a_1 = !(a.clone()); - - if not_a_0 == not_a_1 { - Ok(()) - } else { - Err(DoesNotOccur(not_a_0, not_a_1)) - } - } - ConstructiveDilemma => { - // P -> Q, R -> S, P | R - // --------------------- - // Q | S - let deps = deps.into_iter().map(|dep| proof.lookup_expr_or_die(&dep)).collect::, _>>()?; - any_order( - &deps, - |deps| { - let (dep_0, dep_1, dep_2) = deps.iter().collect_tuple().unwrap(); - if let (Expr::Impl { left: p_0, right: q_0 }, Expr::Impl { left: r_0, right: s_0 }, Expr::Assoc { op: Op::Or, exprs: p_r }, Expr::Assoc { op: Op::Or, exprs: q_s }) = (dep_0, dep_1, dep_2, &conclusion) { - let p_0 = *p_0.clone(); - let q_0 = *q_0.clone(); - let r_0 = *r_0.clone(); - let s_0 = *s_0.clone(); - let dep_2 = (*dep_2).clone(); - let conclusion = conclusion.clone(); - - let (p_1, r_1) = match p_r.iter().collect_tuple() { - Some((p_1, r_1)) => (p_1, r_1), - None => return AnyOrderResult::Err(DoesNotOccur(p_0 | r_0, dep_2)), - }; - let (q_1, s_1) = match q_s.iter().collect_tuple() { - Some((q_1, s_1)) => (q_1, s_1), - None => return AnyOrderResult::Err(DoesNotOccur(q_0 | s_0, conclusion)), - }; - - let p_1 = p_1.clone(); - let q_1 = q_1.clone(); - let r_1 = r_1.clone(); - let s_1 = s_1.clone(); - - if p_0 != p_1 { - AnyOrderResult::Err(DoesNotOccur(p_0, p_1)) - } else if q_0 != q_1 { - AnyOrderResult::Err(DoesNotOccur(q_0, q_1)) - } else if r_0 != r_1 { - AnyOrderResult::Err(DoesNotOccur(r_0, r_1)) - } else if s_0 != s_1 { - AnyOrderResult::Err(DoesNotOccur(s_0, s_1)) - } else { - AnyOrderResult::Ok - } - } else { - AnyOrderResult::WrongOrder - } - }, - || OneOf(btreeset![DepDoesNotExist(Expr::impl_place_holder(), true), DepDoesNotExist(Expr::assocplaceholder(Op::Or), true),]), - ) - } - HalfDeMorgan => check_by_normalize_multiple_possibilities(proof, deps, conclusion, |e| e.normalize_halfdemorgans()), - QuantifierInference => check_by_normalize_first_expr_one_way(proof, deps, conclusion, |e| e.quantifier_inference()), + QuantifierNegation => check_by_normalize_first_expr(p, deps, conclusion, false, Expr::negate_quantifiers, "none"), + NullQuantification => check_by_normalize_first_expr(p, deps, conclusion, false, Expr::normalize_null_quantifiers, "none"), + ReplacingBoundVars => check_by_normalize_first_expr(p, deps, conclusion, false, Expr::replacing_bound_vars, "none"), + SwappingQuantifiers => check_by_normalize_first_expr(p, deps, conclusion, false, Expr::swap_quantifiers, "none"), + AristoteleanSquare => check_by_normalize_first_expr(p, deps, conclusion, false, Expr::aristotelean_square, "none"), + QuantifierDistribution => check_by_normalize_first_expr(p, deps, conclusion, false, Expr::quantifier_distribution, "none"), + PrenexLaws => check_by_normalize_first_expr(p, deps, conclusion, false, Expr::normalize_prenex_laws, "none"), } } } -impl RuleT for AutomationRelatedRules { +impl RuleT for Special { fn get_name(&self) -> String { + use Special::*; match self { - AutomationRelatedRules::Resolution => "Resolution", - AutomationRelatedRules::TruthFunctionalConsequence => "Truth-Functional Consequence", + Reiteration => "Reiteration", + Resolution => "Resolution", + TruthFunctionalConsequence => "Truth-Functional Consequence", } .into() } fn get_classifications(&self) -> HashSet { - [RuleClassification::MiscInference].iter().cloned().collect() + [RuleClassification::Special].iter().cloned().collect() } fn num_deps(&self) -> Option { + use Special::*; match self { - AutomationRelatedRules::Resolution => Some(2), - AutomationRelatedRules::TruthFunctionalConsequence => None, + Reiteration => Some(1), + Resolution => Some(2), + TruthFunctionalConsequence => None, } } fn num_subdeps(&self) -> Option { + use Special::*; match self { - AutomationRelatedRules::Resolution | AutomationRelatedRules::TruthFunctionalConsequence => Some(0), + Reiteration | Resolution | TruthFunctionalConsequence => Some(0), } } fn check(self, p: &P, conclusion: Expr, deps: Vec>, _sdeps: Vec) -> Result<(), ProofCheckError, P::SubproofReference>> { + use crate::rules::ProofCheckError::DoesNotOccur; + use Special::*; match self { - AutomationRelatedRules::Resolution => { + Reiteration => { + let prem = p.lookup_expr_or_die(&deps[0])?; + if prem == conclusion { + Ok(()) + } else { + Err(DoesNotOccur(conclusion, prem)) + } + } + Resolution => { let prem0 = p.lookup_expr_or_die(&deps[0])?; let prem1 = p.lookup_expr_or_die(&deps[1])?; let mut premise_disjuncts = HashSet::new(); @@ -1492,8 +1999,14 @@ impl RuleT for AutomationRelatedRules { premise_disjuncts.extend(prem1.disjuncts()); let conclusion_disjuncts = conclusion.disjuncts().into_iter().collect::>(); let mut remainder = premise_disjuncts.difference(&conclusion_disjuncts).cloned().collect::>(); - //println!("resolution remainder of {:?} and {:?} is {:?}", premise_disjuncts, conclusion_disjuncts, remainder); remainder.sort(); + + // Ensure conclusion terms are in premises + if !conclusion_disjuncts.is_subset(&premise_disjuncts) { + return Err(ProofCheckError::Other(format!("Conclusion contains terms that are not in the premises: {:?}", conclusion_disjuncts.difference(&premise_disjuncts).collect::>()))); + } + + // Ensure remainder forms a contradiction match &remainder[..] { [e1, e2] => do_expressions_contradict::

(e1, e2), _ => { @@ -1506,7 +2019,7 @@ impl RuleT for AutomationRelatedRules { } } } - AutomationRelatedRules::TruthFunctionalConsequence => { + TruthFunctionalConsequence => { // Closure for making CNF conversion errors let cnf_error = || ProofCheckError::Other("Failed converting to CNF; the propositions for this rule should not use quantifiers, arithmetic, or application.".to_string()); @@ -1553,43 +2066,6 @@ impl RuleT for AutomationRelatedRules { } } -impl RuleT for QuantifierEquivalence { - fn get_name(&self) -> String { - use QuantifierEquivalence::*; - match self { - QuantifierNegation => "Quantifier Negation", - NullQuantification => "Null Quantification", - ReplacingBoundVars => "Replacing Bound Variables", - SwappingQuantifiers => "Swapping Quantifiers of Same Type", - AristoteleanSquare => "Aristotelean Square of Opposition", - QuantifierDistribution => "Quantifier Distribution", - PrenexLaws => "Prenex Laws", - } - .into() - } - fn get_classifications(&self) -> HashSet { - [RuleClassification::QuantifierEquivalence].iter().cloned().collect() - } - fn num_deps(&self) -> Option { - Some(1) - } // all equivalence rules rewrite a single statement - fn num_subdeps(&self) -> Option { - Some(0) - } - fn check(self, p: &P, conclusion: Expr, deps: Vec>, _sdeps: Vec) -> Result<(), ProofCheckError, P::SubproofReference>> { - use QuantifierEquivalence::*; - match self { - QuantifierNegation => check_by_normalize_first_expr(p, deps, conclusion, false, Expr::negate_quantifiers, "none"), - NullQuantification => check_by_normalize_first_expr(p, deps, conclusion, false, Expr::normalize_null_quantifiers, "none"), - ReplacingBoundVars => check_by_normalize_first_expr(p, deps, conclusion, false, Expr::replacing_bound_vars, "none"), - SwappingQuantifiers => check_by_normalize_first_expr(p, deps, conclusion, false, Expr::swap_quantifiers, "none"), - AristoteleanSquare => check_by_normalize_first_expr(p, deps, conclusion, false, Expr::aristotelean_square, "none"), - QuantifierDistribution => check_by_normalize_first_expr(p, deps, conclusion, false, Expr::quantifier_distribution, "none"), - PrenexLaws => check_by_normalize_first_expr(p, deps, conclusion, false, Expr::normalize_prenex_laws, "none"), - } - } -} - impl RuleT for Induction { fn get_name(&self) -> String { match self { @@ -1600,7 +2076,7 @@ impl RuleT for Induction { } fn get_classifications(&self) -> HashSet { - hashset![RuleClassification::MiscInference] + [RuleClassification::Induction].iter().cloned().collect() } fn num_deps(&self) -> Option { @@ -1618,7 +2094,7 @@ impl RuleT for Induction { // Check conclusion let (quantified_var, property) = match &conclusion { Expr::Quant { kind: QuantKind::Forall, name, body } => (name, &**body), - _ => return Err(ProofCheckError::ConclusionOfWrongForm(Expr::quant_placeholder(QuantKind::Forall))), + _ => return Err(ProofCheckError::ConclusionOfWrongForm(Expr::quant_place_holder(QuantKind::Forall))), }; match self { @@ -1639,7 +2115,7 @@ impl RuleT for Induction { let (induction_var, induction_impl) = if let Expr::Quant { kind: QuantKind::Forall, name, body } = inductive_case { (name, &**body) } else { - return AnyOrderResult::Err(ProofCheckError::DepOfWrongForm(inductive_case.clone(), Expr::quant_placeholder(QuantKind::Forall))); + return AnyOrderResult::Err(ProofCheckError::DepOfWrongForm(inductive_case.clone(), Expr::quant_place_holder(QuantKind::Forall))); }; if crate::expr::free_vars(&conclusion).contains(induction_var) { return AnyOrderResult::Err(ProofCheckError::Other(format!("Induction variable '{induction_var}' is a free variable in the conclusion"))); @@ -1667,7 +2143,7 @@ impl RuleT for Induction { // ---- // ∀ quantified_var, property(quantified_var) let prem = p.lookup_expr_or_die(&deps[0])?; - let (n, e) = if let Expr::Quant { kind: QuantKind::Forall, name, body } = prem { (name, *body) } else { return Err(ProofCheckError::DepOfWrongForm(prem, Expr::quant_placeholder(QuantKind::Forall))) }; + let (n, e) = if let Expr::Quant { kind: QuantKind::Forall, name, body } = prem { (name, *body) } else { return Err(ProofCheckError::DepOfWrongForm(prem, Expr::quant_place_holder(QuantKind::Forall))) }; let (e, property_n) = if let Expr::Impl { left, right } = e { (*left, *right) } else { return Err(ProofCheckError::DepOfWrongForm(e, Expr::impl_place_holder())) }; if crate::expr::free_vars(&conclusion).contains(&n) { return Err(ProofCheckError::Other(format!("Variable '{n}' is free in '{conclusion}'"))); @@ -1676,7 +2152,7 @@ impl RuleT for Induction { if property_n != expected_property_n { return Err(ProofCheckError::DepOfWrongForm(property_n, expected_property_n)); } - let (x, e) = if let Expr::Quant { kind: QuantKind::Forall, name, body } = e { (name, *body) } else { return Err(ProofCheckError::DepOfWrongForm(e, Expr::quant_placeholder(QuantKind::Forall))) }; + let (x, e) = if let Expr::Quant { kind: QuantKind::Forall, name, body } = e { (name, *body) } else { return Err(ProofCheckError::DepOfWrongForm(e, Expr::quant_place_holder(QuantKind::Forall))) }; let (x_lt_n, property_x) = if let Expr::Impl { left, right } = e { (*left, *right) } else { diff --git a/bindings/java/src/java_rule.rs b/bindings/java/src/java_rule.rs index f112cc22..1efb51c3 100644 --- a/bindings/java/src/java_rule.rs +++ b/bindings/java/src/java_rule.rs @@ -67,11 +67,16 @@ pub extern "system" fn Java_edu_rpi_aris_rules_Rule_getRuleType(env: JNIEnv, obj let ty = match classification { Introduction => env.call_static_method("java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", &[cls, jv("INTRO")?])?, Elimination => env.call_static_method("java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", &[cls, jv("ELIM")?])?, - BooleanEquivalence => env.call_static_method("java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", &[cls, jv("BOOL_EQUIVALENCE")?])?, + BooleanInference => env.call_static_method("java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", &[cls, jv("BOOLEAN_INFERENCE")?])?, + ConditionalInference => env.call_static_method("java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", &[cls, jv("CONDITIONAL_INFERENCE")?])?, + BiconditionalInference => env.call_static_method("java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", &[cls, jv("BICONDITIONAL_INFERENCE")?])?, + QuantifierInference => env.call_static_method("java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", &[cls, jv("QUANTIFIER_INFERENCE")?])?, + BooleanEquivalence => env.call_static_method("java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", &[cls, jv("BOOLEAN_EQUIVALENCE")?])?, ConditionalEquivalence => env.call_static_method("java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", &[cls, jv("CONDITIONAL_EQUIVALENCE")?])?, BiconditionalEquivalence => env.call_static_method("java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", &[cls, jv("BICONDITIONAL_EQUIVALENCE")?])?, QuantifierEquivalence => env.call_static_method("java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", &[cls, jv("QUANTIFIER_EQUIVALENCE")?])?, - MiscInference => env.call_static_method("java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", &[cls, jv("MISC_INFERENCE")?])?, + Special => env.call_static_method("java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", &[cls, jv("SPECIAL")?])?, + Induction => env.call_static_method("java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", &[cls, jv("INDUCTION")?])?, }; env.set_object_array_element(types, i as _, ty.l()?)?; } From e1af18468ec61400185bf490ef755c168130bdbe Mon Sep 17 00:00:00 2001 From: Zachary Bonagura Date: Mon, 9 Dec 2024 21:59:48 -0500 Subject: [PATCH 4/6] Tooltip images for all rules, both light and dark Tooltip images for all rules, both light and dark --- aris/src/proofs/proof_tests.rs | 10 +- aris/src/proofs/xml_interop.rs | 6 +- web-app/src/components/proof_widget/mod.rs | 87 ++++++------------ .../Biconditional Elimination Negation.png | Bin 0 -> 18154 bytes .../Biconditional Elimination.png | Bin 0 -> 16613 bytes .../Biconditional Introduction Negation.png | Bin 0 -> 17823 bytes .../Biconditional Introduction.png | Bin 0 -> 15452 bytes .../Conditional Elimination Negation.png | Bin 0 -> 14159 bytes .../Conditional Introduction Negation.png | Bin 0 -> 11428 bytes .../proofImages_dark/Destructive Dilemma.png | Bin 0 -> 9502 bytes .../Disjunctive Syllogism.png | Bin 17264 -> 17252 bytes web-app/static/proofImages_dark/Exclusion.png | Bin 0 -> 21267 bytes .../static/proofImages_dark/Modus Tollens.png | Bin 4259 -> 18270 bytes .../Strengthening the Antecedent.png | Bin 0 -> 25803 bytes .../Weakening the Consequent.png | Bin 0 -> 26268 bytes .../Biconditional Elimination Negation.png | Bin 0 -> 16759 bytes .../Biconditional Elimination.png | Bin 0 -> 15187 bytes .../Biconditional Introduction Negation.png | Bin 0 -> 16116 bytes .../Biconditional Introduction.png | Bin 0 -> 13797 bytes .../Conditional Elimination Negation.png | Bin 0 -> 12742 bytes .../Conditional Introduction Negation.png | Bin 0 -> 10033 bytes .../proofImages_light/Destructive Dilemma.png | Bin 0 -> 8058 bytes .../Disjunctive Syllogism.png | Bin 16796 -> 16772 bytes .../static/proofImages_light/Exclusion.png | Bin 0 -> 18504 bytes .../proofImages_light/Modus Tollens.png | Bin 4109 -> 16090 bytes .../Strengthening the Antecedent.png | Bin 0 -> 23413 bytes .../Weakening the Consequent.png | Bin 0 -> 24146 bytes 27 files changed, 36 insertions(+), 67 deletions(-) create mode 100644 web-app/static/proofImages_dark/Biconditional Elimination Negation.png create mode 100644 web-app/static/proofImages_dark/Biconditional Elimination.png create mode 100644 web-app/static/proofImages_dark/Biconditional Introduction Negation.png create mode 100644 web-app/static/proofImages_dark/Biconditional Introduction.png create mode 100644 web-app/static/proofImages_dark/Conditional Elimination Negation.png create mode 100644 web-app/static/proofImages_dark/Conditional Introduction Negation.png create mode 100644 web-app/static/proofImages_dark/Destructive Dilemma.png create mode 100644 web-app/static/proofImages_dark/Exclusion.png create mode 100644 web-app/static/proofImages_dark/Strengthening the Antecedent.png create mode 100644 web-app/static/proofImages_dark/Weakening the Consequent.png create mode 100644 web-app/static/proofImages_light/Biconditional Elimination Negation.png create mode 100644 web-app/static/proofImages_light/Biconditional Elimination.png create mode 100644 web-app/static/proofImages_light/Biconditional Introduction Negation.png create mode 100644 web-app/static/proofImages_light/Biconditional Introduction.png create mode 100644 web-app/static/proofImages_light/Conditional Elimination Negation.png create mode 100644 web-app/static/proofImages_light/Conditional Introduction Negation.png create mode 100644 web-app/static/proofImages_light/Destructive Dilemma.png create mode 100644 web-app/static/proofImages_light/Exclusion.png create mode 100644 web-app/static/proofImages_light/Strengthening the Antecedent.png create mode 100644 web-app/static/proofImages_light/Weakening the Consequent.png diff --git a/aris/src/proofs/proof_tests.rs b/aris/src/proofs/proof_tests.rs index 4c2854a4..0842d697 100644 --- a/aris/src/proofs/proof_tests.rs +++ b/aris/src/proofs/proof_tests.rs @@ -1286,7 +1286,7 @@ pub fn test_con_intro_negation() -> (P, Vec>, Vec>) let mut prf = P::new(); let r1 = prf.add_premise(p("~P")); let r2 = prf.add_premise(p("Q")); - + let r3 = prf.add_step(Justification(p("P -> Q"), RuleM::ConIntroNegation, vec![i(r1.clone())], vec![])); let r4 = prf.add_step(Justification(p("P -> Q"), RuleM::ConIntroNegation, vec![i(r2.clone())], vec![])); @@ -1302,7 +1302,7 @@ pub fn test_con_elim_negation() -> (P, Vec>, Vec>) { use crate::parser::parse_unwrap as p; let mut prf = P::new(); let r1 = prf.add_premise(p("~(P -> Q)")); - + let r2 = prf.add_premise(p("P -> Q")); let r3 = prf.add_step(Justification(p("P"), RuleM::ConElimNegation, vec![i(r1.clone())], vec![])); @@ -1354,7 +1354,7 @@ pub fn test_bicon_intro_negation() -> (P, Vec>, Vec> let r8 = prf.add_step(Justification(p("P <-> Q"), RuleM::BiconIntroNegation, vec![i(r3.clone()), i(r4.clone())], vec![])); let r9 = prf.add_step(Justification(p("~(P <-> Q)"), RuleM::BiconIntroNegation, vec![i(r1.clone()), i(r4.clone())], vec![])); let r10 = prf.add_step(Justification(p("~(P <-> Q)"), RuleM::BiconIntroNegation, vec![i(r2.clone()), i(r3.clone())], vec![])); - + (prf, vec![i(r5), i(r6)], vec![i(r7), i(r8), i(r9), i(r10)]) } pub fn test_bicon_elim() -> (P, Vec>, Vec>) { @@ -1372,7 +1372,7 @@ pub fn test_bicon_elim() -> (P, Vec>, Vec>) { let r7 = prf.add_step(Justification(p("P"), RuleM::BiconElim, vec![i(r1.clone()), i(r3.clone())], vec![])); let r8 = prf.add_step(Justification(p("~Q"), RuleM::BiconElim, vec![i(r1.clone()), i(r3.clone())], vec![])); let r9 = prf.add_step(Justification(p("~P"), RuleM::BiconElim, vec![i(r1.clone()), i(r2.clone())], vec![])); - + (prf, vec![i(r4), i(r5)], vec![i(r6), i(r7), i(r8), i(r9)]) } pub fn test_bicon_elim_negation() -> (P, Vec>, Vec>) { @@ -1390,7 +1390,7 @@ pub fn test_bicon_elim_negation() -> (P, Vec>, Vec>) let r7 = prf.add_step(Justification(p("P"), RuleM::BiconElimNegation, vec![i(r1.clone()), i(r3.clone())], vec![])); let r8 = prf.add_step(Justification(p("~Q"), RuleM::BiconElimNegation, vec![i(r1.clone()), i(r3.clone())], vec![])); let r9 = prf.add_step(Justification(p("~P"), RuleM::BiconElimNegation, vec![i(r1.clone()), i(r2.clone())], vec![])); - + (prf, vec![i(r4), i(r5)], vec![i(r6), i(r7), i(r8), i(r9)]) } diff --git a/aris/src/proofs/xml_interop.rs b/aris/src/proofs/xml_interop.rs index 069137c3..692a970d 100644 --- a/aris/src/proofs/xml_interop.rs +++ b/aris/src/proofs/xml_interop.rs @@ -124,8 +124,8 @@ pub fn proof_from_xml(r: R) -> Result<(P, ProofMetaData), Str on_current_proof! { proof, { let p = proof.add_subproof(); subproofs.insert(seen_premises[0].clone(), p.clone()); lines_to_subs.insert(last_linenum.clone(), p) } } } rulename => { - let rule = RuleM::from_serialized_name(rulename).unwrap_or(RuleM::Reit); // TODO: explicit RuleM::NoSelectionMade? - //println!("{:?}", rule); + let rule = RuleM::from_serialized_name(rulename).unwrap_or(RuleM::Reiteration); // TODO: explicit RuleM::NoSelectionMade? + //println!("{:?}", rule); let deps = seen_premises.iter().filter_map(|x| line_refs.get(x)).cloned().collect::>(); let sdeps = seen_premises.iter().filter_map(|x| lines_to_subs.get(x)).cloned().collect::>(); //println!("{:?} {:?}", line_refs, subproofs); @@ -343,7 +343,7 @@ mod tests { let sub_lines = sub.lines(); let Justification(e1, r1, d1, s1) = prf.lookup_pj(&Coproduct::inject(*sub_lines[0].get::<

::JustificationReference, _>().unwrap())).unwrap().get::, _>().unwrap().clone(); assert_eq!(e1, Expr::var("A")); - assert_eq!(r1, RuleM::Reit); + assert_eq!(r1, RuleM::Reiteration); assert_eq!(d1.len(), 1); assert_eq!(s1.len(), 0); let Justification(e2, r2, d2, s2) = prf.lookup_pj(&Coproduct::inject(*lines[1].get::<

::JustificationReference, _>().unwrap())).unwrap().get::, _>().unwrap().clone(); diff --git a/web-app/src/components/proof_widget/mod.rs b/web-app/src/components/proof_widget/mod.rs index 16644493..dfb719c8 100644 --- a/web-app/src/components/proof_widget/mod.rs +++ b/web-app/src/components/proof_widget/mod.rs @@ -166,29 +166,15 @@ impl ProofWidget { /// /// [lib]: https://github.com/vsn4ik/bootstrap-submenu fn render_rules_menu(&self, ctx: &Context, jref:

::JustificationReference, cur_rule_name: &str) -> Html { - let equivalence_classes = [ - RuleClassification::BooleanEquivalence, - RuleClassification::ConditionalEquivalence, - RuleClassification::BiconditionalEquivalence, - RuleClassification::QuantifierEquivalence, - ]; - - let misc_inference_classes = [ - RuleClassification::BooleanInference, - RuleClassification::ConditionalInference, - RuleClassification::BiconditionalInference, - RuleClassification::QuantifierInference, - ]; - + let equivalence_classes = [RuleClassification::BooleanEquivalence, RuleClassification::ConditionalEquivalence, RuleClassification::BiconditionalEquivalence, RuleClassification::QuantifierEquivalence]; + + let misc_inference_classes = [RuleClassification::BooleanInference, RuleClassification::ConditionalInference, RuleClassification::BiconditionalInference, RuleClassification::QuantifierInference]; + let special_rule_names = ["Reiteration", "Resolution", "Truth-Functional Consequence"]; - + let render_rule_button = |rule: Rule| { let pjref = Coproduct::inject(jref); - let image_src = format!( - "{}/{}.png", - if theme() == "dark" { "proofImages_dark" } else { "proofImages_light" }, - rule.get_name() - ); + let image_src = format!("{}/{}.png", if theme() == "dark" { "proofImages_dark" } else { "proofImages_light" }, rule.get_name()); html! { -

+ } }; - - let special_rules = RuleClassification::iter() - .flat_map(|c| c.rules()) - .filter(|r| special_rule_names.contains(&r.get_name().as_str())) - .map(render_rule_button); - - let induction_category = RuleClassification::iter() - .find(|c| c.to_string() == "Induction") - .map(render_rules_from_class); - - let misc_inference_submenu = misc_inference_classes - .iter() - .map(|&c| render_rules_from_class(c)); - - let equivalence_submenu = equivalence_classes - .iter() - .map(|&c| render_rules_from_class(c)); - - let other_menus = RuleClassification::iter() - .filter(|c| { - !special_rule_names.contains(&c.to_string().as_str()) - && c.to_string() != "Induction" - && !equivalence_classes.contains(c) - && !misc_inference_classes.contains(c) - && c.to_string() != "Special" - }) - .map(render_rules_from_class); - + + let special_rules = RuleClassification::iter().flat_map(|c| c.rules()).filter(|r| special_rule_names.contains(&r.get_name().as_str())).map(render_rule_button); + + let induction_category = RuleClassification::iter().find(|c| c.to_string() == "Induction").map(render_rules_from_class); + + let misc_inference_submenu = misc_inference_classes.iter().map(|&c| render_rules_from_class(c)); + + let equivalence_submenu = equivalence_classes.iter().map(|&c| render_rules_from_class(c)); + + let other_menus = RuleClassification::iter().filter(|c| !special_rule_names.contains(&c.to_string().as_str()) && c.to_string() != "Induction" && !equivalence_classes.contains(c) && !misc_inference_classes.contains(c) && c.to_string() != "Special").map(render_rules_from_class); + html! {
} } - - fn render_justification_widget(&self, ctx: &Context, jref:

::JustificationReference) -> Html { let just = self.prf.lookup_justification_or_die(&jref).expect("proofref should exist in self.prf"); diff --git a/web-app/static/proofImages_dark/Biconditional Elimination Negation.png b/web-app/static/proofImages_dark/Biconditional Elimination Negation.png new file mode 100644 index 0000000000000000000000000000000000000000..00fbbd20296a8dac309ff374c1c05b2292f2924e GIT binary patch literal 18154 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 Iku(eWA9s{FYybcN literal 0 HcmV?d00001 diff --git a/web-app/static/proofImages_dark/Biconditional Elimination.png b/web-app/static/proofImages_dark/Biconditional Elimination.png new file mode 100644 index 0000000000000000000000000000000000000000..b8d411f4c21d1baf36caf28069660fbb109b281d GIT binary patch literal 16613 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 literal 0 HcmV?d00001 diff --git a/web-app/static/proofImages_dark/Biconditional Introduction Negation.png b/web-app/static/proofImages_dark/Biconditional Introduction Negation.png new file mode 100644 index 0000000000000000000000000000000000000000..26c24810ddfb7e591cf156804186e048f0f15536 GIT binary patch literal 17823 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 vR^7X*Kf3_(3h*>Ln%5`PJ literal 0 HcmV?d00001 diff --git a/web-app/static/proofImages_dark/Destructive Dilemma.png b/web-app/static/proofImages_dark/Destructive Dilemma.png new file mode 100644 index 0000000000000000000000000000000000000000..dad2d1d731ffd71307353ae6655a25e76f092063 GIT binary patch literal 9502 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 literal 0 HcmV?d00001 diff --git a/web-app/static/proofImages_dark/Disjunctive Syllogism.png b/web-app/static/proofImages_dark/Disjunctive Syllogism.png index 58533cc35a646068034d9e999ea0a04619d5184f..140109b676c57fb6c0f22da9b7725d5fff6117c9 100644 GIT binary patch literal 17252 zcma*P1yEeiy6zp^-Q6L$yM+OQYw+OiE`tYm2^O3X+}*<9E~rs_ zefIaiw{B5gYq6kNRkK$2`#isXnizFeISf=%)HiS5U?|ATXhM&mH*a7ykrAP1zL|Bd z&;zxFyr#;VH-3z7-h2vw^X3oq(x-zrZ@jqPyg4#`^F}1|%^M=u-0vD<&>x_<%IkZ) zd4t*Wx4{S@e4vM3L^M~DlX>&{_v>p{St|4jlBa@-EYbly0m57Sz0p`o=p_bESv^ln zGfyiK3wJB%;SCQL4<9=hA3G1X78kz=AD0L>FDn<92p3ms3*G$x=-}jHX=m;Gf9|k- zkYfw&@b6`Ok-1X3ou~5- z1v$k7`4ztF7YR@S{oO|R<^Av9YyQ*Xa)_T$7}UQRGft@pWnm9HjiFp zj20C}`bbYaMy)%VoMIosKsVRL))q+D3`SBm?5#CPuzCF5J!Vfd7m3A9qTj-zpe~U*BNRG-#c$Y>8d)NDeH~Oe62S#{W^QJ^<7#0lQK$;4xH=;vo`;V zsRjv3O9!KXrkeAT|c zvh3gZxPLU4%=FB|@sWJSmJj=GWEn;NbHuk*Jn7k`b@DHAd?WQto$pf9!|@vg!*D77 z+>AIi8r`3dTqScjr*pbZD+gQ-IIrCu(AgTu9vUmkzscdF9p0+nZ!bXBDztsweKj*R zLi0XZ3FGUIFEL$i>`5-~Art=?5uKxLH%I2fqG~={c~gHm&HQbq*_d63^JFjt-Ypey zBGh5Qit8ZoJ~dPQjt2ls3@rPB`VlA%dU-Z*TxllB5p)^O_~F2{6V@jr`1nCNyNL+% zu9Zl@sW%3n|I8o4aq%FInazLScvzGNJ^Jpie zRom5X)1Dl^2e#ePusa`Fe?cU=bIi@o){$MN#6&6}d#Ecs`3<6R?F`^^5X@DNFA^S8 z;z;Ltcif%CAKae0ji`CD@ADt)?Jqbot6F;LIMJo>z~!F%l?$UiHbbFa$89uBmAr`S zRQtxI@1Ff1w?1GleI=Xxr+s#^pNbU0CSafGlj)$Mr=P1g!W;@y2nd$dS2LiL~ zS{D(ac__m=YE+Y@psT18NxQqBq=55k(u5sDJNrylgwnn$c)X%3liz_7(}+3XQe$Zl zH>suPH8LUURZ7vGrS|1YFylvd=$%An_yQ3fWORl@ex(B@*ra3~ly=xmTCSzYU6%_4 zbb~m>v}H)>XtVS`9sr2acPm3V#1M@Aw!Mn2W&_*kO-eAuXd*PWVv5!OtpO493)*pl zrvufSah>1GN0=joW>W!6aA~xa&12KexVhS+7&}SI!lVj|IgxRn@ZEhkkQX0fv_}iE zW@G$)BWU0a%!4OpaR`UezafJPg&xZa9DJI5^_S$uf;uUNgqLhNbbWJSbzp-hgX6}qx&d|*}7Wbxp9SA$!4QUfi z&dd$1hV>wU^nUr?RxGujtvL8~@$a0jJG@gSvx7gy1%cgeRAK3_Z+Jr#TsW- zJ{+Eo@kvoZg{aI5^}=VIEa*EEZ)a~ZSvY*fNiMnVe68r_lYPLPFNr(rS7w)J%m4iR z|2_+Nqpbz*ACO(q5A}|x){dJE6l6N=y>gtl(ij%A&sQkSF<((Z6>gG~2Cb-gNPgSC&i+oHOgVX>6H%Kl`JwhQ_hz%8O*6|H?1MxMuo zj?X3Jt*?(Zdg1=#WGs~_IuY?=zaI9^>%B%)Pq4F@SKB(3fZYyPJYwsLVact}++Ryz zBoqAMj;H)E-2$ENltDLOT0Wp7{P$laB;wKMu!Q$$k2)4-Ynxm)x8##qyhu&Kc@e^_ zNi>bdX!D84(mNR{g%(T=zQ?k6tYQ?K9k_A?KU~!Yi0^O#ikzk)k{xc8-A_*+l>cm_ z1<=fYF;N*NN)75OyvG;XLk!QvNN&I{F7-bzOij;<*NTGy7aIKSSZ9u9;AJm#>McZZ zD6g!FkSa^ZGTBv&-NlWILqlk&GFgBWp8T_Nske;0clT}tJT0y3=6DxWJa+VL6)s_o zHKg7?VYbwY{laa>p9&BbFTQkr$8aG`(_OyQ`*GUh<{QG24?_LP3x?#A7iChnD2eo{ zHi2%`{CVVE_bY)%@E?TKmj%+Qo+n&Z)pa3mSQ-ZHh7iutAOw>x5!6kJ=>CzOn*N`g zLH$*5A8FXWaZ{395IYMpnZ1t1%^cXFl5KZxp@4dWtXPN9K~w`HFY##lep(p1ri&mo zu67$;u|L1u*B-~|LBL?6?-$|sLtddTgqfF&rQp+QvjufV_>E&f78Vz;2~}T@o24M~ z&NSK=cI1m8b^;*aNj8Kj1@LceTX*Zw5v5}R2ruEnl8dXnF_=4PA;Sa+&6>+Qgbn$! zH@#e}{;fUBv08uG7fuToxB6b0A2CnBWyXZkLHC;9jQC-o0C@f)((dPpLm7N;b<(yp zq`gs|hAJZ$IpEyZxj$Wqh>601+5yX0WK2#cLBlMY`-4*wvf>Kjvfv(G*M(bDtr@J( zFN)3GiTS{Szg@rVmlv6&_qSjU?bz+|-j$$$oQb4{cYT3Ks0Z(5&4uHTm&9%q>dvHFC?L9`}WkkdLrME!YH6}qM-ZP>?#*M zHhH{vrw5Buu_6oV>*6)?(;}TgZ+3RHLrg`zaKuo5 z{#01~Na|HrCmq=@wodGT#rzo}<@*vXvacU5SK*sno|+Ux&Z8GZD71Kxs((4sR0lm7 z_UBaGye|*OYULM|)7yTWX82%7ttK9K&Ik%!eq=ifOPCN1?qhXP zlNRft+Kmi$paim~0k-Cv!c8CWfM7Kp`|Fu1a(Siw5T80o2rI;|d=Jyo((-`{7)D|* zN66C{-urkJc41vWhorE`LBo*hT#14x2B93VI?of29Qw^s_N`K8@230%qb@)xb?>uc zIl5{Sw)^qde-pg_E`I;%9Q#L3_s^m8ngQua`RRIE26m$-df~kISeEi}>oz(XZdp);5hu3aj4O-6lo{Y6OG)|gIVB}jxeVnrO073^vuwN1k8hp?1-+Y>NO5Q-=}(5y zchc!Zr`-NCjA^5@E_>Z1EBo}H$09D;Eq7&5)y^UC$2n}|GC4!70WK@cadv4#`Gcu2 zfwumCYi}akpG&UbQK{UiG#ZvxgzrAi2gYYcVCOFkw0v2+sOgU}N=GjxdV$K3+58Tl zNCk>PzRlois+H)QP7Wy&130)>ewbIvUvM=!{8CNUDzhMcUR{2d$kiOdNT{O{JxC+& z0UbBf(XkJ8^$yK%Ni(mS8$0>uMi#6@i%7g0z4_i)?ggz{+k#81u zXEi9yqJUIHzdS^uIz!F?gB0*?WdY>((%4cEBZ)Un+7q6e^j`iCW`wc<#3%t+r%sGP zx-iOtlp2v?{N8?E|E?Zal-niIe9mXpR?%}$1Nup=Ai3S>sZ|_HFU08+FVjWLb zn}}AuU)iTJG;p>3Ux|>qPh-{cgOEQ6FkBI0X3qW2&L8f=pxG;qJMU3uCae-2SEP>SB?4B}ZzF!O1p8NZIyR5uy zy8>A^u%&7Q)#)4jZhPGnv=GD!DM`!kz5lmj^1olXzsGI=tqHKeJHR;H`FZ;4-o$>d zjn%3t&%qj0lNtNf=#ZPFTsPj)$?ikvqZ6Z(@7)zyPB0hQD}oRtzObI80dWmM>s1V8*U2p z*tBeEIolIt&eIvN*Ge$6E($^M_pMu1*U+|P#z!T@A?)9-l;JLcWO810u;UV%zqj{8 z{29)2_^C1+K1JGgiXPS9Cu$%DyGhFMx5pMgfOj}sKlHr>4FMag=*N@ssfVCuX1F6B!oEmwS2~^FL+LxK5jbigiB7qnhJsR~@G=8d=;6^$&_UbD420!&K56MPH$ue0ZkM1BJ1jiA%{YO77|lXV-v z`nTy0S!{ot1w346JL`jR9duPv?}9#sco9E~cV_2}cKd!Kz~eD7rAWuGQZB8zj#0)e zQH=J2$&y<%-C?G#wbv$ofJKs?J5$^4LQyNs2CT`9x*Em*xu-+#z7r5Kf|D;?=q+;% z{=o`-9SXLP139d{`-1KW6<-@BmVMEm2Q)b6yE3t*wqU0@&qYp0hDqBOi}DR_F^8z85N8OWs>tDALES=M1>%R+aXaVCV%Fn=W}U zSX^yuyEfZK5xUWwS%t%MK_)X0awyc`p!*ew|BsbU5(#D2v_gh7E7sFwUlbM%v zFRGKzI@I)^LcTD!aG{+#=e1gX31?$^?T-zv{Hh)In=4;GaiL7Stlh`ZFizLR4~>Xa zA}NBE(Be|gVzx+uzOt1f{?-4Ags+}*FxyG44}adFU>8kqtErA+$izW#$MD;au43Y> z3q7$wQURBZP!irR+m&A^ZXWnkFJ_**xP1d*kDAZoJ4uP_eTRYZ#C*gSy22O3X)ZHm zpU-vO6!z%zlR3}P)L=M$i5=!T;Hs#sAl>MK77})2I4#1NB)H|^^ljT(#<;Tl+X9eGSapTsVkjc2Q4UxIxfzTnr|aBA<7K^75n*cwqpoiC zzDjtPnO149oUpqip@s2RAVlx!S~DG}KT z+a3jV%|{V%+DeFCT?~B*=kpI)G7>xV`~HitFSFnR5`Z&IM^t7vlJUE!id~%@-7To2 z`gefx_xwJfq{aJ2&k&UIiTvX%#iSxzGfgBWS@a)nzw-36>B70lT_vUl=dpq%H-Uwg z_+-s(3i2C~gyh9zsphC8$C%)RyidWB57Y*&Ah;TX^$^h&um1W)$$^5n;2}t>#u*06 zg%LKt9r>to{K(U*L>#5~_o7EQfY))jXs1|6VCf@d_?S*Tg4A?S4JJ;#X`=`-%S5%4 zswOd3mn1nj*icvafr4O*Qenw?B4hyk$>?pAIFcO`(avJaKDN#y=DfQR1>>L%3>rwd zR3MwrA*NI%=c__0qwQKbO!nFX_6E>~jncUk&Yip;1|dv*^(aWTw$fHh6n;5FN&Z@( z6N9D%yS~@u`9ei(tqRHS<|tvK%YUaZ>hbGcavNl^FRp&#{=`ZZ?1N$7au^du={KtV zOf_?3@d6%%XHc z>W-Y2d?hytxL{xmycYOAWYibMi8<0v^0-!(ihN--M2TpfH*)FQ)Uc-|@^$vzzVbkJ zUA}agDs=L*kn=oRL%_Nv33q#aM2iv30>vl)gnE7^s$N~Z%{~yE@HQ6>k5F>J138Cb z`=_h@*S-g|FUh%5r^K4xECLV!U4)?5U}>x}X1c-BM5pKxo+c%W5CmbV$@O_fo8BtT zRgoMJfGrjx*@GYUeIqVdMRM2po%}Ldey^yLd|Po}wu+OtW>6>-Bpm+DKRDCa^AMYk zJ49UEwaecectAu6A77N=nVq}F%SU(=6mNqBQvKyx*87JLT^6%M?ie%O$l>0vyMgmA z9K!q(${ zxY}QWh74KSCTTEV0e!{q_~%c&v1d1BXxla_W{F$^rf7XL8|MEcyFjl#1QA5E;$?TLZxx zBmN!@DTzk;f!v|J=Y!=vy)C$RsMGFkiX)MEEn53K+QFF~GoUgQFuZ>PNm8!;WcWLL z035tYu>m&Wc#`ohdp&3PfP6kgOdizzMfpCw4vq~{}3Hc)%gx;#*YD}KUb17EeT$@?%b)63nULFt!?+bi%Ts(tzREk z0H1OIM5Hh^>#_6k%3PA(SD-P*3Dp7cdX5`UNH$;Jr~e^dyP8Jom)7>Qw9?B#XCJKG z8JhWUkSfB*w;+khACdmy{rxA}5-YcLH9YI>gTYwbIEDoRz*w|PoqQ|+|&@{q0AB1gdX{ex)^i;gL3bf znrl*Kejt>-hI(nh0V{GRPagrR_CHz)ENmU%l<=kkEZ1WIe z)Bn2G#qeO4dnvT@Hpw>f3)5?em6G+&+=a{b!s6zzVAIQBV@VU&Nw>jS4KlMN!YxFg zxTLs`Sxhq`asWE|*m;lafrnKl5O8m0=EHAl&!Z(23Q=#FvV1iQm0w1gJpQDVPLyXG znaP)Qx7^sb$JGkwuk~SHI2)9rG8*<*!oPpxA#)!gD3mgmxB6XJ+$D^{cp5AohXqK zLe;paqX31YtZtZ^BaB-)6nY}oF2 zlt?vM`#$DVCj{;Abfm3R@toZ`AwzL5gO@{S^`4)rGT4oy`B|-t>{3_iuSjqd>2Yt4 ziIa0ZF?B)S!rt3!l0?ag2IU{MPobWF`ASS_fT!X1OWnot^@6-5;=JP$xzD;6(HY^f zs?U1F?Okicvg2qEL%klR&~w>Yujru$!^7Azysr`wMqv zij;(I70TgZ{GbD6`DN@C$jmWcJ8VMu|n+Lc9e_N&n+9NNac9 zV#!Vk_wl9$Q~CZ0d1AME0P<=<^|Xoo>vjXi@#V8+>vNTqvdMv$mez|-Uzkpz^V(N> z?Ug3JPgyrv^=T!gCZ@c@Nv0Gl8-0k~JXsV<-pK59!{qx!4Yk^!uEf~!9u{I?kfLR- zddYAPBio^l(EW8HLrQ{0j;@)B`CCeI0bDgKig15YU8&!D7E8@$NVo)UwgDfJUxb^H zh~}OOW|NW)MQRXP(lsZm?gRo*=4&Zgn`3a3Em-|5;at!^^M^0WNi((4?HP!@bmT^k z{$9VBr}Hs=oKLz~?4UiPWGYTWZ3VN^Lo1em6g04(*v_q{M<%z?cEY^&acvSIG|{4 zTzvOUFcf!(6Fbr@2T(5*?`r8aHC}y*O9~hi-Lnm^LkEOnxOCd=Ep5GZwaMT7%NGFu z#25ZbyxoF~G`rc-^Cser27#2sn&CxBHrY@WLuvUE4O6T-K$kyd|AEG|xow>QGV}3l z7zzq30_=3MMGG}EGYNBs@(g};F%Qd3F*lSiXJ!6zBs0`|<^O~6N^H|K$S*h~hl|Ne zR=8+qH>HE?d7r6pNRlP5qBMQ1y5+Hz4p{oDU2(#BtF!uZW^`fy7jnlG$e}<{sPKK> zehALO1`3#N!+Jm4i>(UYspxz>HV#USO+?14JW#+ZFK79_>rPUo!w{RLg1G1bmXw%v z;P(xTM?uk1Ws-hxO^6O?%DEDT@N_7jI4H~4?=bIOVYvnw0l)2NxwF2_{LlldHd+(; zAJf^;K5NY$H%(}_AM17CSAM`fJ_G7vLkrzVENdB-`9LIvylX=9790lY+5*mL_C};S zyR`WeisNQIOj)We4-)fRAsSdF;}Dk9bR8N(fsyjSOTa! zveI3|yoAHmZ0#6iv-cjvaSpDWWTNNT z6QI^GaSye0*mEguk}A_JxL=WVKAZ1A*OwE(4%4n{*!L1QLI#U79c{ST+?b+l%rWw9 zdZsum{12qwlMlF8iKMefiPp$Cf^oz3D7;+fO@&-Bb$I1f+Yjd%+fm$IX6`0-yFB69APdgt@p6b*eML!_ z{a>X3804R%)Vd>Gx?c&US0g$Fwm%StsY#j~=&*Wd4@Qb6XJp5czlc4e|8ic(2<((- zXIe>jHcGe!mZwuVEIPdpUE&igRBH1t?C3`9VH0O^-l2KM{{7O7s{MT}iO{WsN=S1V zfek`d)*b3>BvR6NMbjem4E0N^AU- zws!F60k54<2crcLf5uSU2({i6!us{r#dLH7s8#8@jMa8o$rXI+tVaHJW$bvZ^?t+; zV7AGeJ5j>Pf+Ulk*Ee|si54g2Um$bCO55JKR?~hbINp0TonDcoBA%ySqP4k8F{dN$ zYI{p&O`_qYiHL%oA2kZqr4BuNb+*US$7(oCL+-|dFh1&Vj&xt?TvQm=gt0u(cL!Qv z``w(KRvLHBG}%xEaM_TFO{G{<^na@%(kRpSZ?^a56xpyIZeX8q6L49ZbP#f9q>RmW zni1>ok{5cP%zD4OQ#-=%?2=F(H{y2USLshuaRT)l3Y`~YuU(N@tGGjDJRP`=xqP`| z^%PN z+bz+xj#FQh$+VQ>OIf&T2>OrKRFlCaR(Fo)^NASBZ9aVbwKPSNoyL zqyp&z8%cySKg`s!AN}D>=ThS#1owxl=k>dW_{RBMgr^P}CvfjskS@XlxD0`sM+5pl zjW?cg)5HDicRb-{<`}Cjl7#+md~LQ-o8No*oF6bXk!QKoeM!^!1$jG1oO=yXy5)xAC|0Nh z_(SOT`6<>?<^GO9K&W=~@|zZe2rVUO;V)Zh=~;}lxNeTfoT(tJ&C`o4>@w-iZ~n&Q z%R`2N%uNDKoDB)m(q}?4&>OA*TJ*?{qHfI=*?^PKUmLi%6Q{k zN+uoz!+6?~glVK?-+>&yfLvf1O<%O23qHVDxBzZ?){UiuV3#5X^$Assri~O;>@)tq zwX{ntkaAdM8^83bw@=Y?;2l`P`1D-1Q#70UmvW%1ylHyyRyse|(Ut5{Lm-3obaqS@ zZ$vgfSulr5+yYuqe=p%Il$|gK!z>Lx6vxu7Im0>5?qS%}C2 z6JnxzRQL{-o-4%W6Tm`7Mjjb382fHVRhs*(B&7F6vi>%H8m}H#lVy(z_*=%?TfqMM z9!ubKIbpr?&UE_hRPVaSt-PQSw=O9wd~O-E&q%Y!`Nkh8F&2W$ESIs><+Cv?dJdwS z4~AUMC2e)rhCz<=;qSb|(|Vwv3NYh+NO2Jvm(#5wGphX^2wvHoy&>->^+hgR86fFHdEc)|XrfchV-jvUytirJ#>IM()5KIx zAZXekOS|@8#`ba*;w}2K)?iSli~WZ5r!Q|rvLd4-1k>!UAe&h%xi2d}))6dBlb$eQ zr=Wk9MI!v8Q;~%!sTWUk`9JCFfAT;emYBykbtGN@OT^Pz-+yONrJhR9xh!{y?)R;) z@JDymtF*SnaSSefFStBNN@cz6Y_sT((ilGXzK%022@%`F zXY6{xFFjTC_!~3)%U+NBV?#I-cW$d5KsyF?J2}NH8@1BtM+k9C0 z{K`*sic4+!57nr{CG~5tLKG~d%~Q1R2i7J6smZ6f^@SFnb>y}{J2jnyi0WkNg+;v+nW~WeiXq#6F3;2sPkW)06^JQXHfPwwRxPS9= zFmhMzU7@^dy8>_C=ILpWvOI$(Vwpa2hu42T@PGOqisb92ku|Estd=>lSTdi0v>~wmJ86e$G=WroIsl^&A7~pzjBzXkbqX= zPRN%1M>sOgd$^Q2w*E!giyxE#mRNpXv@Af=up>|Obf5%#h1U4zROztA+~ zN9YW^|5_4LyODA^FgKKX{w-!053hS5N^Kn_BLJmSux8*4PxmvOV+NVDglvLle#DK# zqQzWdm}`dZ=!tFovjZJvDkmU`!)2@5-%hF~KQ9)6%5!k=wrwY>sJ4`V#!6~wK)P;j zYdigT+aqbcr(2ci_Qy8Gi9tVswSt0WRtA02xT2cHq<07g#r3C=x2MA4*VjKMtv^S5T<9ZXR74)+!@e$_u5~^cpA&I~#apxIx83MqI@)@xb7BoVpT+>v zKcY1s-r&?`{Dyo=HpgEsX0}_1k7Hh6SN-GX*#DE4?erQ|;M|m3v#w90%^8<}Fgrmym9}MSY4Pr*X7{`w?s)=vqRVZB`5LD~z1a_1&`KFYyaDew zzvu&im1>i}yUIFjEmq?0=62Z!k_NTioKD?$kD&odIql#}mBZK;q zLI-Lkv|w!fC)9pI4LEbX42N$5`C`FKAZ;AF0{%N+Yh1utfalO)O*`orD(3S>2N0TU zP!euj_JfRL73#R%v(Png%+y&3M#racGSnX<;fXqwF>7=ZJZVnGDhS=OrbG7csnZ$5 zj6se{a8)U${c{JdB17V$R6L?zO#U(sX}P@rGiJY>9+=>3?;61tbN9iZFIb7T>#3Ha zO^A_Up`ipKX2poVJdh5bWSy*CUR2jk{cGoib_gSewD)^bTs*wbxz-V3b&SO+%>P6> z;z$O+U=8Ej3w;0cGa8yma(%n>g^^u6IG3&fu1n>lt~ljGga6rC7%oywG5Mr zIyoUXgeHPHy%3CT2gsH`#h@+yYbsk4)OY&7vRjFQ48DVA`G(@o0vz1j`#e=02gZ26 zy!*BN-icivp~KOPHP~E$hv?muSPzHTtT@%KjymKw{r8`W|AX27Ww;EcA&bM%Pz_8N z`5K@QTp{sY_KY))iMqv%2WfcL-+o$8j@&&MuGsK}q-Gx?%+g{HAx zjgfe(R@42^?VoTfu3=5iJo6~b*B^=G!u^SPV$-;(9F5wWph42iuAZrLRHwoGg62;Y z5>(Su`9l4eloC@M#@&OM)vxK|vkk3xi|X2yEJASw>SqLd5K4iECF_C$d zRjElEGdnae2ir6SZYEipJ#~~yJlYv}4q)(v@}Ky)!|p^KxXBU>91IE0Pu5chB=TMn4UdO6!}m~G-){=OTZUw1!y{gLV(rL?B-&-7(uVWoIvOGhKO)F zFH|aF4)Ty04DL+dA3UexaJmyY>9UqSMiP-i;QxN@oG_T$*>LKzm^@_0&w`@4oQTHJEG#bxrB-X(nkmH6U3ga&5$R^{3%>5hGSKwT>!(bk zF8AEP3jmh)zL8Ip|9MB$`tomY9Xh~{l|KU+Hl3bg{37BPw;;V|9 zc%qkZy4q@f1>IBB?I1bDWZl{Jb~Nz^+F~Eh96sG9NyK*+Gy%5FSo1PA9b_jrIn2g; z*PH%d4ljnGRV)6G?NL=<6DudGXDo@=Y4v8OMI<$`4bskFlTXrLY=MXs$cALbLf_I@ zwPuc#yoZ>~76H{tE}w9uDP@~ow>mt1vi((Xa&;TFj@uv)PXpU9jz_-^f&Q2Fom(%X)^WW#Uqsb`*Y(? zgM<-%bmrnd;@P>jc#U^p)bWfo4r3fQB8T-K`?-`Pl}|yljKkZ2u9hn$-9Mv8)rY4w z`Z>SY^`A*+m5a0*GJlIN->Z!@)_NUotc@EIxPxP2E5B6&IK^-@KmTXZ5Q8mPED8UU zk*vrf3E?5ZS6uv%1wgrbry~0;3890a9#$0c)LWH?Tt_%AS}jeWk6~T%v#VdUa~&qZ zU@z#sJVdifYqTN8=Oge8oKC7cYNg1JKjaA~ub?ECxeTADb7~Bbhj5eKY$pmYY?IRE z{}-v)c_<(>3mD06_jVVKy!E5>{~3EGOKi@AYUL`<>?=qD7|;86zHZp%eg(%V2%g0X z?%T!jp$@w8A?Df@&mCv$PM>0WuTC)cL{m%)Y3)?89f!>9Lo=z9(Jwne!#;GY+x_1; zXMF~P-D=^*@oz+GI`ySHfw*Eo(mYir9-gMpd2}1pG?&N$cF;W?MuBt#fUgVX5pb~I zLqg%Hfr+V+&`|GZj(kYoLY6ql5?+7`4~0FBGDZY`}44zsAqzbQO`l1#vv8@Pf` z8BrW6a9xGmM{ua=?=7wNqf^ha;%jpP0x&_ELV7Ko(@wa!llQ7w`{{qt#bY5~+X;@Q zhV3{Rtv)`GmigZs3=~rkC9Ys(Z{23J6=|#=acS5n;l6`G2jOCz2NTW_)%N}A$*=&2 zN?t5Rs_60ipijz)u*e0eCWY#qM$Adiq~kHUyz*&Jf05lp)Oe0WMxw^*?! zEbjdkk(29aCAgJzLrxeup*rr!Y|-@y5DWbS4URNdG-piV_?*-sum0&^lYOO)KZpKBZ)W5OwQWmCG< zDfn2ZYRCsDI{vyjk=hXWD)j{M#1A5Vg=sY|{D`3NfGWTBfS=+Z5lk{LJSDfo)YH3i zbIcXkkFBM#OD%qbI`y0yYwsjd=#WZ6K5Gl0SVeuqZ9M3z350q8&Et==B*a~~ z8BuqUqvO{bFYcyn{hu|+f;oeNbo6=`;I#*GL_6a$P*ykcjwpoLMaR^(ZdO*+cSl%4 zj7lp#TaX?Y-RVG6#FD;$57}6SFdWSE=SZR`Fv}~dgbf^inj0%G4=p7JTpT*%;--o- zN^jlQW})~4Z=X(noc!5CI~g55*JtIuaVV?|NbiYiTQyUVC%QXpZ9X3T8iOg%kVXXr zzZIZcW@+`$&9JoWNU}$%P!?N(G_LXTy89|*Uxcr@gQ%KuH5L9}cu0Sr{}Zm}7=#iY zM3e;?jfTOqHa}`|ay1(e1nyR-xp62NdeCLT+Na}!m_m<-x>Lt?`yboCd;C#iB-&8A zk0HkdcRihueZDicf_Pj|$b0KBIzH{w5>%>h1rI|vMo`o7<1FH8n)Mv^B;mOuUrbp$O-DWTzbDz!$V(;r73_Y4BH*xRbjRCy2ZSl|+^GW)09` zb%4;%?Dl>zm7$|vU|proF+a68KB>CCxQg_KWAXJgO;EX~6J8e65sQMD7@b)5!m)}c z_vBV6{)I)3N_LjI_l15&c!MB6&J>pRnEwllSX-j>-O*w9`&W3W7%u$YY>)AQh&`x`6)giJdPsP%m< zGjh7`f1MAo$O6E0)FU;=2*%t~BC0Y5D81c7Z_QD8qpjJG#i)B}oq^|_12KL%$%?@G zW>^xLd*NI0^eTEuHN^~4(hK{g5wKpBy~L_ayt<0|U~xdJL)vqmS! zajwQ60t_@Ow5XYK`c*>4Xp7h)urS!@0i{n<%gQMGEKd1JL^=Ddc(YLN4qMU&c`kZbdTb z14#zG+Z?V%g9}d+ytC4yIKKHs-r&&JH?*TCowv`h(y!g=$M&Hr&3Mtbs&PyU54*ix*?;hNe*`l&5NV2HEk=5gB0AbGQcBvN7O=Fp5#QBZ^gM2vEDX&%-;mRZ zf3w2!EO!`LZn6o-BBR-h6I^|$-H`o=FdcX=sZ73t+Iqa-;PgY$QPdkjxS#M6G||NK zc25`z=S5pjMbM*~4mbuo%>6-0T|HtU&vDjfi@v(LDkU_CcefOgzYozM@&z{aN6L}y zxyg<6e0EBzy{da*WC0Gv6xn?CnhQ9!_JQH((0+!1XUNQe|zZ zT%oF@b1ax;RYq=MArj^PcU!5kSL$3!30;p_YtuI?BjM2WDnYOz?K&TTMHNRS``ZFE zR}mmfPd)PfgLmqdPQAj;6=i<%N1T6%O8iYH8GOZ-;Ge}Y+m0T{(qE=D zAq&^yqjbzl*66~%ot$K&FD>3W;W1&H}OV6R#m1JU>f@W0TYncAo^w9ud*+LZk~At35fT&>6soL@gc@Yq2?YhM_8uOx=bc{T4B31z zlTlNIg7Tq-f(i}XPUbe2-v9T6-Qz54$b^so zbq04E2MafM69?!2IfsMoKTd*_SuzF%1rU^#5Yqq}o^K!+t1rGHfSm4?yyW$o&*>=ZN8O_I*Z~WQ2xdiQ~88rj=tjSv?Bkp!M#{fdiZh6Et!WoEUr*d z{PJ?(N!ImJ@ngJ`#bvJXUbQNftavq1TX)Tf;PRCvBHv@1ol$MA94A^8q_>4r< zXKVU~V!Ar2!0stqyN!vmQU=wr@V9-pW!J>i@3GnXS*>XaEG*OY z$-uV(A{MxinKE=PEWFQ&^HH|~`~5u6<)GIDj})~k(s}%%#zxDvzL?sk&Yk)&lpBBS zGMp$M8DguFVisXth+vJyD0oMIk_Irs4}&GH;MTMMm97YX)ixdcnc-j*7tIk7(UYfx zl%WXVcjmVJ_z)U{rZL8xXRPFpCPdLfi6oSW^KX_C1ZP-1M9ix5u^Kd*uDv5{hKc#ZiK(G*zCWwk#Flhj;F6a8awB0DuhVc^m0+#e z9%T%nJHCR*3$?)drW;N%t4<`d9*@aD#ME-L2WbGw8xE1w|s&X%M%|axVRBBwf zQBNEul~mMSKjT~98PyH}=bd!Snc6^8zW%#dErcbD5NLBb>n5U)*UDw(vlox7wZLDI zr9Lijn{N*j1dq>*VDsNT3&gLuY14n+Gw*3!I3Qj*-wA%SFv`?jG?ibBr>$PHV!B%Q zyjNh<-0>*>b@p)6W6e95Ku^+?cLy={?(bD8OUoBg?ZLFbE0VA39chG_ zsFr%Hmh~RFsLoy0pClXoLLB6q8o0@CEi83*JT&GiYB8|C)?m?#plyp)fR4t(x>|lN zmQWZC)9Bap<;_}uxQKVdN@PHmT%wD}OYGohiMNi(SN4pc6(lS(b%Li^eK?O?GZ(zt zia(+hUmvHkc|h^I9$;C2IHs~zlRPn$lYz?Oq8#3?J!;Q=uaR&4u>WTAi4?i{ay{0) zJEq9=WUeQnu!mS!HzF!a(`EzNi$TeFXWXOqdYb;nOrfJ9-}GhgtAtDP>9ULI6CU-V zb=WX_{)I&tEE`BE3%3~r4}5vzUT$^4=5bgJo66EM`-2eb?D?xCozEAYYn$$rX zAzz&pj8^qCa>eJG;rd6>z1R`Kz2Fj&zArJ*yovg2(H408~I5$ju5qk6_%Y^?1SB`ox%0PRCvVF^(1hSf8GL>ID~Zf^u^+L(ck%kHla zB7d-YYF58C61Okt)w<3qrC0EbP_d#&neCLikBn=A)*DRwRz36*i5C%JF5|se)$=yH zx~^o7B4%vu^45A;WY${Ie6cw;P7x9J$qa?8Q^l*8SHklfP7lrE>*)K7Gr z-h3n#3*hUm1|y{{*Qd^mpF`N_0sdB%V3}g6f;j)#1`DCN>5JZMQC_O1sE&tzfI_Xg z_KtJf8N6c&Gxj&-^MQz}CujOD*cLc}2A8WdS$&Z<1Wv1;LwyrVxqdi2b=1aFmpvu} z`GEeG5 z0kaVZ!VE$RU{jS3f^>A32JaDxI5J2Cz7u5tmXqi8HwJ}+KSvlJ5AuWkK4I&xbHl(O zbca(7P1@382N1>z95)eN5mNMplq5dfj5k^iWS(cN3}6EZX1&hb{Y2}Te^xz0`{#mj ztmN4aP{}hiDYzovBMJcO&*M6uj`f9tA57xtlEvax8WN$EL(tHhlMyyAKB>tu)FV$? z^uieZ-b{l3ZpVNbYIy1)jH@a6ZD!vxpF&EDnI{twp=OsO*K4X%)X%nE(w+(vD<&Pp z$jvOCokl;nMehVY$*IhS7I(zJDs**q%UA8V@VlwFQarL4tqLmcq)3tsrb`0+!?4_g zKaX$?C0{BG&v9qfIy~`I8u62pcP-;D#!5a+(-l&OFo24s{Mp@3ieTJ`0TTvJDe4yT4~R{8flN{MgUHK=%JdNvK-d? zZ;1|2uB&gVsHQeDnD5squ?9vmuX!1F%qXlhPZ{*ze9ubTJxL=9Ydnd3WkvzpoDpmL z7K1RBK6_2|>XEZZyo^K?$dhKyhJsm)gGGD1a1SRRQ5&qLhR;?S*iV--(z|v)Ql9ci zS4FXL+0McWctU42>pS=Ss5KMR+K&1`e_?~MX9$ovfnx&E@k|bV%MFbFV&oUh8usV9 zLKbYg%gUFYfK;*`gwgPhBQ3fSW`)O2x)!3!_xx3AjI-XNs7i`7VX9a4AyynJ6846P%k0Nw~__)NtQ~pX_K5}1Hm^6c)oyeY_JF{MNCNgV$E*>&n z)xgUqBle>bBepA}s@mTZtaZ=(vDj1?YHE;kg`9o6TCAYD+Iaow_q-;@^mtC!DUe6g zPf4_sxD&tQ>Be#Yy%j1pr?{4)8#$*J`RrSZ@omr(yZz)eUv8DOek-)#Q9y{8aQpUb zOWMxnXWHGNr_-5OxgO1FUQ&YbkX1SRapPm?>$P^rj~c{*DDu}q--o5)R4U{v@Bph>?hs4$wN#PD z2LTQe&yEe@Ks0V=8E4f|TsFeHU4pAGV`aPc0Xe;P16TdGk_5g+9{R#<(Bi%^Os;Ws zN@Xfh1D2;AL?Wg|zVsBh@g<4V>)$BOV$_)l!;7o;+hbM9Lbp^Z^_lm zHB?5&w~+zhpf92lh>na*X&}RAy77+h6RZ}uZeutMqa3Uzv(w3ShlPt>DH_Yu z;7>PtgU=M7Px55`5WhVvzko0Q;5?|Qse*ef^Lqn@JNYYZWLq;+;Iq`Vna)m-Fz4w zPwbzc0ee1gennA<+|8iBx!MW!aDLnt68d$dNizCzC1J&t-``Qjc?`LEUZ+*wbEj81 zClcNF*HBSt;C5YiflF>5Wja3f!Ps@(SRz$SlUj3gO5xD0iW47VKnPs!0u$HZ`zEz76H7@$ z{JBUilGk2yLzh(p;*+DJjg;KN;?LCl-(#W~O2;i*sMzT>JIh1|&2ijL-S+efv?vG0 zODd?TTP-Y(qL{IMJ`^a5UJ%kyCxEXkHYsSo8&doaukqK5Ks@>51`GlDU7dY6*ZEgj z(dqu|twYm`^)~R!!xp>MFBCui3%GTIiT%y!gzE#uP7K$qDHf5G3eAt9F2Ts`3+?#I z=!8M=COp(7g%sS}xH?MMtEj~Bk3GtLp&mA+oLB^YRxByeO~jAP9YC63(hatZ4dR@Z zb>GEuyom*dq9u<_hU%pfNYt*x^V?B8|A2xy$MmV8ez~8$E4{eam7%=8{6AxFmYKr3 zo#!1GzEm1<4SP5D(}muy^^VgHgS4m_^CU)%3py5?r!?b5RYKc^QZ(D;glnx*)WC~v z_{ueJ%<-Au1fZHL@Waf7^!1HfzE<}^jvAVthgHj6)xW?b^ouGc} z$()weu0~)TdO%PYXN2)Y{eaqi9LS-R!AaClFT4)*{enbs?-uv}y)5|ww$$t_~{F;JG& zH1tSr;3`sIwTx9L3+^)>y^K`*`E9y7J4qq&D93+0gq}0a)SN-lZ%FUu9w{8Ad-B^%H@-oF_ zB+GSJ3S)q@p`{j@n%cavSF5A!9V5tF-=t(Pd3*QVFqQ)mk`N;aFw0VhLo5F`E9%uD z;*Y^(k3w7Qb5!gbny7ZMd0(a=Xrd(N?Jp6Me-m<6%0YXKZ;vFv*qN9*%hbF?Wf{1MpJSLE^={qd4oI<{wk^qe??mg8yn5jO zuVn(Owl}hwAk5|l-|S@0Lc86bFb%QEe8*4WsUc`#`R z`D)@J*Vwrv;-k=0J`see7O3B>Wvkj~EhL5Rs8BBj1 zdCZit1bZAQ?esL0-vWYyo5=5kJCc$IyS;zVU~?E5lcwTSC=^%Seo;Uxl8f?qrz5Rp zHX!>!gau8iySHzqa4i|=^sHW5j=_t`p^rc%`uaZfq6<}N2};eHf17^YXpdtv@M>#0 zXPbz3h6ekTuII}GzAl^JAlm|}2P>@vMr-fQM2C_f$GqAGvOcBbWrSzTip$}djX4PJ z9`?D-ntpD#WB0Yann%`pp!%5P1^rdK5n9&t;m~<~u^!RcMOcfJh2UO@e!0<_hGc5( zhqqspFCoP{6rl!-0n74;cQt-tb!H>ccbg?!rkkBks&8kMeu8#X*FSu%H>C7yr3&m? zig#}gg~=qA!_Af(6~PP`85ouv?_|HocwAo9SShwe<0umRxb=C!0zeZ2524f}^Gr_T zj%VsPFD~cc9(dwMwt8O4eQtd*8I`^~c_r=*`cw+qiS3~og!_Brw0o3=x<&FDTR}TT zxMavoOolNDK~wOa^c8c457^5~bKD(M!@)9vTvN%)7xuuvjnE5DUkql-+^pRFYtf~; zUTAnodk!}lrs0@$y-{3RnxwvMqW@4#!9)1P5^7aJeYWfcTk1)^x->2Lu1rE=QJ|Ex z3YW~z`RRo;U$7G&ffd&gfN6sa3G-{eP1jjc^710^^Yf23;dXD;=84PW@A%26ce3AW zE+l*(j!uo-u;Ys$bt^I18zKUp&U?*#jA3mk2zdC$?lG+42bx_1?ulU+E5Bj}(jE9S zVqo?5PNe9jhkLdt>D9{v(y#+f9z`{0>b*G$lvxML)x%3#z4Wz1KO6ZV9}x@1!%g6u z%t@Qgbh%LPuA=n6bv>f|) zEFQBzF*L2a7SjHXcho}efvgI;-=bEl1a_+bz}shvpba3P^{1yQb+SJa-#Q*YY3i%- zf1%r-c=m z-z^+ESJXTQ)bWG~iDT(NuKezn-%s;5QDQsO8B?AI#PHe2s)89O$wAgRh zBl3~H2FsSY*ML|UA**+A`)1O1$-K?Yh}glC_2>Jh9iYh{%9ySif$ALH;C%GB!Rp&A zFBp{yji@guq1=K9X$lo~@yaq7kobSMv`=XNbCTMQy8tq*A!&qF@#H|{#_9I;)(r@l zJG<;ezix8sBXny*(J7v;OHvETHTq$4Os1r4GvVSoeZ}E~K&D2S0egpSf956wzArKr zv!dcIR%z!5ccQCrmWFu-06%UG*jb}1hs4eAtPYeEmLU83dQFC3(}QexKJW@~=#$uQ zCMD7^xpbjY^Z_Wo4cPM_&6>CRFiU3NeA#Dc~8(IfHrZOZ|rfiDJak#Y!#89_i2-&_%axO#)P455sV82 zICB5{o&UQpVq{aL$&823LPxoz<&MyRh3pVSA&!t|7(-@T^yGHjNO7=>SZVM~*PJWs z#!OY10z{DRQli?w)5SR7q0-wnG8^98QWlBAW4`z_k><4>*G$TOdp8X_`eDRgshHv` z4)DX5P$WXAPr_om?3w=I``~zdAEaU+xcl>`vT@CcNaxibXN`P#f-Ci2%7w-y8Nb`H z5%7Mpve4aCWIEd+w|iw3^g0#dnnRm2A4x6pLG2Oc%OK@*`yo@m?M85Bb;Up!n8`Sp zcVq#uSIj(9C~L;$xK0pD^h9;DB&Pfz`C(@nQu&nNKUP4{88%AZaU9N6fV0Ax^+jp5-YS@HjtG zfAP{KChMNq(5_-|H`i)+e=0JWu22FR4=4f~rEXmeTC3Kl5o!_4*Qm(fHER_l9Zfu$ zwd}P6Ki^DW4dEM^?n*lq*gaeLfp^(rzIQMA3w*)Y(mXRUzUODk5=72YwuB-=b^qyJ z`TCpR{cIVNRKWeyh|>2f@OfR3XA1^m(q}BhQCO6i!mx6w0oA4L%SZQB%EG%kI|@W74)Q}_jDm!Tm#PiL zTrCkx1}O#+`mn)n@@%yeUErn0&W&iM!wd4Wp)1xvaEIv}*N43x_Dm%@J< zm<*Wa<@AA~k2&yyLu{w_h?%vIz~|XeD%w}lNX!a5{KCh)YdMnRF= zlzur>o14QlY~Df`05=*q1*-gRmvC#Bht^xEF&{y1<|NNbl)cO zFhs<{U`Z)Jo{i4B(zO7vy0Jy$rE zlUVzA$s~gk#s{&1-A~gVO>P9_414W0@BSlGzp>iI4)7ACEL5ZSBg;vUi~C1h_s=+Q zNPgSGI8I+XI(;T4K`*t$x7HW0XH2RdvFzffWaQ1-^-QmVJ}H8N%dm9{;FRTD)h)U zjB*wXkK8P?^x`PHB9^T%-XwA#y{?#T$p#T)sNY&jIPSu(Do2IoF&$WxQ)ggXW5MpOWj zr2<}9l)xW8Ho}*lLEQ5w7Uj+eiwZb-u^l75k%yW_FI;r8YaOBg2wk9oP`8cLrYysl z_r-^S?5%hvTAb>zs@A5^c6jA*~|YcCZy-Tjve&W~GS{(SEve zmWjvdUk|kANh3oaky&w2j3J+cuaj#3m)Jk}dCYYA9{(f!VpvOgT3 z(_HtFbZg-~WncJZLM%L~tE+2b`dQmr44r1@yTUE7_b%!OU#p%zTicBZCpFcbd?s3s z$x{JH`HtRXWU_o%iZfZ26;i%aVVw$l?+4$b@t_eD2FtivS*P1zyl^^rBto7szR$ro zVQh^G7$+uA2%6>@d-Pz4h*KY{`p|PgndcV&-#PnVaKZ2a#IRr+K>i1nD4H$;by(bB zmGbAdp`;A|4QvkLo7+R$eu>NYUQB_|4|>C#TZA;0oN(olt}maB0*SXKpRwh?O%BdH z*|xV(7Cz%F53D8RWTKUTWN?Yl8s?fBCrc}Ki)sS;B4Kvf_NIc5m-DFv+>e9egmZ>} zpLMW#|I!dzWm@lIr#O&4Gy8D1q_b!EW`e+CV2+Q@Vlmx>=E3@4$X%gj^0$yF;H24g zM0aNUhyVU6sGYYuzB_VCD4{QInye3C;Kl^u$2#HR>Dqp&GFL9a!a@TlFj;lyt#F5> ze+d5kt~j1!A|ry!HU5Ma4oEcGRUqcz?@=xc<2qihK|UMd*?t(JTc1E`ZO3&xtO974 zyldqwN1@gEuuqFb+GzQGEqJ9N4N{-9o^izJ20IGiF+XEZ;7yGrg;(pgTffs{%?+oG zwd?z7CGjy)W}(92lianA{{8B~@|T9UY-xDgA4=J)T`>vupTSJ16aAS+-NRP%S`=Rh zRSLv7*FBaDTJqKWwK5;^jw`m6V|IGc#5K7 z<>B>oHUpGZkMoE)hpZ1G>)V;9V_m5+%GSk`{WY9cCPS;F)!{>GKi-zIKn5cd$4k|` zzlvJ%kJOEOM<&=ToYDSp1rQLcJ?3*#ScqE>h}X<-_aE5px{+C2(x`KMH=MrZO^Msk zqRJ^tLAtEDQA_lSw=7{AJ6l>><=nZUVoGkfA9#)T2L*=eWcfZdct@%)H`l;(ym-_U z{J3sGB5OqQ*n_7jo69MBH(B`rreR{<6Uq{CIHry&@DW-;9Ej#jgT20#diYZb0db3o-K(nYymQE2O zfi}{z&)A^pB6kU%(})tXHkh?yznGq%crFio6h#`fs74gQbkqq*@UNCuh=^q=|HOKK zkDrk`m5(?P5o<%fllY@`P8|kGRk?~%Q3J~~%b!mrA<$teDVVJRQGof*h^}wKe(tN_ zA=g*C7+`Kqqbmh%fyxC10$30ei+a!)dF&9TjJBk(FZ27J4vWY&=4DC&W;e%sM4ry` zobPs_1-;+B0}yf&^bo(NQU9-`ZI_>!e*T9?t`&QwI5Rc5L3mA|c8Ek)Yea%vK`)tM zc>9A;m?~B7P(n@>rrNIp1Z*r=B-k8^C0j99S0puNojiJNSqqIkSu=^ZD^9k9m0x^4 z7k0O#_v}B-zuGxQ$5WG7@&Ib)=d!D)k3sCo9FV0hEhlm7d+$*%V|eX|M8sFB_g1mz0X*Fh( zX;oA;-Nz0%w3_5_II~cykNN}sek|EuKM`PKRc0$iOjgq24svf$|E;$0x6Tj^K|B*?09gN~wBwskjA0;pIh<-UJLziN zZ_1>-e;_Z;F_BFl0?|TG18*098L}A$8a&v&N63x6hnwp9;09L6JT62}L3a~BD zU#4@VSv4(@HbEdS;2U+m-V}Mh(hzwr>K;NI zts$e$Whc0g>=|2Bdzsty)riPaC9=Oq(S%fY(aa~@H=|s@*X`%K zG#49U;*ApA3M|b2m_s%^qc=ky%L}nI4-Y}#!yE><&CqfVt-fA_N>rnV?sveGgKt-^ zeLg2}F~Hw0jpfyDPBdI*B%a!8$q6QPy_6cd^}}j6)`Ct@nZA$O3W^- z#Er3x=u}2_9xv0jBWJseU5#u?SL|S=JYt7aRO5FW9y^@*=}`$!=v$rbv4=&k2m;!d z37mR_2)Nd|+#xx+rqgAZG(75XK|I=EZ!iG$I6hdpJHn~^4NrVEqJw8w9WPW_G;pIz z>yU3SLNFmGEkgfQ=!ol={R*7_+GZ==YO15bohPugh}7)=ZSu6*@8^{C@a#=I*mnmq(gh#9CUbewdjj6x351glq$jfOl%V1do%2mx zcq}uYjq7=w!*aVH&)sgd_>1CSpwcM?=Jn9P{0XV43M znfk)OQ==QvbyT^l-lmJ7IgaS}H2mrIY;i(U*!PEY{3h7=UJFM+KGPoqxkdledGYy7 z{Ylrca~7dAFY7?YvkPa9t$@I)K_2Nng2d-Ui_g48TkB=tx`8B;r|OW^4y9n8!0N7&)X1C|O6(!Q$VJ z{W>)??6)&u_*ZmBr#j5^X+za$xKwU0*pI#@wpvmAD&`&BgYluFbiqwKXY>=7TfHX) z-Za2j^Z&7WzJHWIUO92p_!=z{sk&u)o@q2A-$Y0rAWU4Aql{R#&%gs(!ba0=XmB%O zHA!C0afM}k{i8?n_S73~!51*lSBA?d8i3Z7`-0PY%CC?qfW4R7iBR_RZLh?sXJEHM z73lp;&{&~bk4{iVGKhWM=e#3ZhHk}OKE&Rjb>Y#~GMD~CyGpl7J1qY=SJEQdocnaa z3iWi!LbCvn4$Xn5TLRD-w5&1= zQ=;5BHZUMn{rtBjje7YGS!tQfZQX~KkZ01iUTk10){dt5qyC19PqGeeu&cxyh%$Sv9TEYgF2Nu*Pv1K1LIQgt<3DR34T=VXzgDa<**~l1&=Q6~A&5 zL=%BJQd)-0)@`P!FWikI?$Z^taU!XFZO%i4VaoBTI^nC6gbdpbGoeVJn3^0>y_-I1 zl~C}vEH==r1LS%HGK~Q&L*ZR-XzWRZ|P^eB1z5 zmTtf4pCz3;ibNtxo$5fhzX36sXU^;>2*ZV}J_JnGz0gH7AU?&!BM>rnKyx`RFNu4s zR*_n%YtO}b+_ZZG@CDDYop{K|PGg8FLcaOBzF?)!is^jT4L|64GG?zG1{x58>9qMV ztkYElA*WzZ!6kRi{ABii`E`C zPGi?%sWCvl#G!R$X1GCzr`bcbgEqLQuJl_wbWMCtlsbRs5iP|5E0ix# zWGon~EE0dO%WHF3@UoL?ArN#uAHUtr0&{hGA@SfDmeO;L-U&>T3f`wWW%u|+GMOWc z++aC9l+@JWvdG50kORYq+VdLe?2n(v>8;_oq-1Q>u>wyi-4Nro=f zH{T;E*=p&hoTJfc{66(<#m4eWL6UssyMnxf2QwM^536GywARrXi%e5VUz{5d%S{hM zC<`f1JcwL$i*HeuJOb)0C`INX_QGwxvNikvl?#wS2R`q`YIRAdPfapSQyX|O} zVH!v|7kwO5f8uk4>8G2e`iC#sfP?tpBg-2c2uZ5Y*cQgrXTATf0Ay{8>D#$|_zsSz z>HG%5<|pa*eO%$CeCrzDJ_?zSQ;-*^w_gw~`(c0&&b?X$9gfx)QcRhKKLpynVny3NIjdhC`(I@P z&TEa%M^JK(b#P;txOU3{29xKjlOdQqduy|5<~YAz4^qQ|D-jLGcr|Ylfu)T_l^xUC zL3d+)2zFk6_k9JWYCW!TL4i#aFdc>-$HE1z8+m#;TK)8v$7PO`e`3`YV$tv#iCW_Q zV5gQ?joev*8W`|GeH*yj!JLJz1u1LZ4eY8S{Z&9yl z^CtL_Dxl_S4Vq`y_m>t&mqUTxYsG~_Tk>GRYxMl3I}sd2G+vwHn~tuHc*HV^@og?- ziWap0t1$X+<0*jP>C2nGr@&S+Otmr~G;6XLvyweT$7Gj(T_Ddy(KkLXtW6xJD$3Fe zR^oO!0Arz?+(F+Lt_^8Q?r;WKb62AyK_qSnYbWNlmiRgEAP6m-FjO=vmKC0RDExdL zG@8fGm*#yFff{H6EG2~R`t{a*7M8;P`AGtzSw76!8*{rsRpt(z9Q_lUHBxOLYwT;) z_47Y~2L&xvg)U8WnWo%dJyA&htpIZc8U8?+Rus5%M$FEJR^mN7Q9_a;co zDr5~G#meNiOcwLIxUrEfQj1&HC+duV70uc}OP%wOPM!`v+CujuKn8>u^kx4cfk1M} ze?oFxEMVJk*zqz@qk<@M6r&5G0y<#r4d%_W$o&kOxV~Gix1r*(UypInTiT6uQO+}j zy&Iu8n8pSkeoEuk^DAXL&S$<+Kht#wFX1qKzvAit$<({NWYpV0Wi%{3-}2)s*~n}q z8_}95-_=Q8=F#OrP^DHYK5$aWpsn}kS@w|65>tD;LX~Y@(Qj#N*C)=iPjW8;>^y{c7ixJ_4XA$a# zvn~%wJtLn~Wk+2u&BRsCf7ANi-Q~6h%p4Cg&tILNeYfU!=hIC;{>@A;Dr6w^$dYL- z#QrMi2VVGYOpjk@x2Jn15CGTKZ|TjxufFi{U`4ydl9b0$6w2yL#AMuXdJoSw`y;^p z@)`bT>o>fG>lOO+H!%bSYcIh7zFk{gOf|ePVWC?AR2KbiS`pU9r=_Kf$!?v-?*@vU zlT2l@OcP1^rS+V1gbm-V#NkC$jy)tlbKmbo?48X-BQkBC`qT~&beosdWSg)y&3Hq^ z0ta>*g|d65!d*m8U4Mu~UTpGf5w^mGeILv&Me@Oyfb*3Od|xke2`MQX%LbYLl`#9T z2o1?wMWx}v;o(m;tx;~@$`EMjMZ>eWmJnmBf|uD~aKbYe{T%5KvYSargdgMi!~n7j zzU~~&flIi#Xr1VntUVu@R10)U$Vy|Ww7b9VbcrtQC1$hEv>!>gs$~wq0HRgRlZy*A zsYHt1y#!BA>#yXM8gA7mRzPSi>z*leewkW>dUvx7%{6fvBN%cNx<>FZ_H zQy?nz@S3Q>xvgC~bjj1Fj=fDh590(2ik)RL`;FY7)d$h=Bl75x#@Xqe2da#VSi~!% zK3c_X7$aDJAWjOQtju(gDu&DoJpnK`i|e2-Gh4=l?tq~bg8aP;da-38uH(N9A|&u0 z7{kVzygm}ffH>8X0mSg6?hi5`_0fYz|875}%Aw3~2-~>se5Z|w2(V4X^7+ma*lG_! z8{-xn5|UwJWf~CW>}PGjIWd<0J_moJE;mP5ZAqcdpamqX+6&dlMDe+*XGX1*3qe#a z7&yUsIP)7l6Z(%tp40>Dzpmupuj=pqRd(bz8)x5#KH&bvZyEl!cj|#UvD8G^Uo-$h zAQTR4-{+gfn3aa*6^lJ>((k^15pg-RB2h&4q&qbY4F$~x5`vMU42}B#hB|OKqgcsf z=ojqW?}{+Dq7$}NYFQP1BCN8ha$#yzMlrE5Svu1xlD&TBcZkU(>+8!a zxv_e{8Cnkz{}-UX%;wc$uJV0UWMB|V8Ip+bHjtLYWuiGt*I8V)w&eIdbR?3S#&z5% z(`4S7i;0yD{;s5DhZp1X9a8V>oq&+rlhL$w=xl(S;N?%D9u}clVR8uR03A}d&&mBa zZOPvn1dVa<(l8fb`W5C1oRCi-Vowl($h}`D4eH%c#MHf*7Z_9RS`j`L2DzXR{~_@4 zaQq4^@Wo9eS<)<1GyGc_Y}RN158Xe9S#S)`vE-N|pubF^k&8^m}t`bl}zZFG8DbrnS0JA^0*q>71wGbT!x`*zSYf? zD{5!aHl-Wxcu$+kV~!YRHiudmu1yc4*-YCGjnqb!YHK~jIiB^%E3=)3d)PalKEF|w zGT3OUY>QfaIr6Mc^lJaZwg0W2HtX37ZSCphJ>GDx-S4{iv}{Z1qZsqzXNU6IKvr4f z5s0tZ)wr;rDYfkyuH&TtVn3JX!&{B+FjP#|T%XKoWXWCxR4&)688^?-GU8wHNKQNH z$8_|hq~gTh^$X&+s&zSf7q+>E?Ys;dVH9M}f^X1Tu4o?&O zn(u7)SmHBP=ztu*WR%ArOK_JQ70&{M6Qo* z=XF0P?b@EEJm_SSkvA}Yi?3rfJpOsndFtqSDg00?sJHdAT-v(RzQ+8eXJwql@h!2b z%8UGI?-JSmC+gJC$|azDb8;Pz1j;iE%vAI$4Y;s@4CP4dJ!7;K^9N5ZANv>#Zyu6V~Z$g zhx0tq!xT9nmmk@VMPfIDS9(-9|ZF#b@D6n-m7T`AP)hhZBNdMQDFHMFoIGNL5u+L-RPC z4#0r*zi%D{ z4Qr$`rJ5I3VX&-Ca^d<}z!u3J;ZC(Zq&9`Jh#%>WP-Q2C?>V#b=F2za-y@1x78tIx zm+0u54c=&U+&`>33%$()Vop{5CR+muIn!odKC@l##TBITQL5=^E@{PO+OR{Jsk6`v zGqaQ6?V2k-S3~3{*kmstd+8Hy3$1m|%5db@@Kz5r32c?X=uggx&kL(@^!GPG9wYYj2^x493I99>a-F@_H!x zf#i-TXs#v95`oB!dF7pttXyQmah#as7(9^38wW+vM+fnx+3wTk?i>4iZriE-edQbe zj>!qe!(QV;HQE0PZj0J1;uE3)>YEs2KmN^=|Mi)Oz-^0m=Y{euf|iz6Qq)t8&@Tdd zNl-|}+o{&hZw=|q#@xSNnoy7r-@f$xavB`xPri~_Bl@e|G=j9~g$7)j_BmmzirNsq z-repU&zF!##QGulazE@HNj9+8lZNNOMpSHx@y7|#es!D<5KI}2dlt#mYzv5^RTsZM z`9q!7xzke_5LF3+6fikTgW`p>O4L6$mYEJUe%ac)zB6!Qk_NrttDE#3nYi0&40Y8O zf;A8Xmc#*aA3g-vd>(<~{<*u2sf<4r!jiigZg#>w)2Wo=D~mYB)xY)O=Sx_^E*v#T z&P19i6y`q5z0zI4p>_>drA=D#BYy@+w0$i)MgJ3Y;6(^3nvUkW*2dFEg#1Jg73MPr zr5t4sR(gswDnDJ8j$912&LG&=%ceCK4k{#=+%v>{Ov-47O_&0yd$FleYj-lX_nJzT zeMXTitxIVs2JihdpV%pekY%>rl$m?OYVZqIIFqk7viwyAMTqien`R#lWS5&Sp#p#c zNTM-MPo2M7U9iC36>%tE#PEdlliuk}r}hw{ib$#1hDcQ3efmdveAjJzNL3pdMO;Cq z_FCj1_CsJe$k#=+Suk6rytIT8F+eUHFv)m?*r|_J)wkFrU(Nl=V6xIO4TZ6PiuP*i zJ))K$pO;9aSo;#aQ!(>k>%HH2)&aqsn?|DgCJq^S4tlxV6fu_2;6_t|YHB$M4BA`+ z(Hzh8XNf`@GGvtGBL_}`=Eoqar(zPo)rlikvKo?NMDLXWC-yz)>`^Ccxk>(LWe0Vu zA%|vz*p!oS;+Py@?#BC09TtFjQ1+N zf{z_ez@~%CUp5la8_3;A?@H=Q5G(MpvnaBpH)Dbdy{!}F!scL#t^@_?3jHQ|p8mO& zLz#{*kdM^3A0cyV?XGTCjQ2J2%_y7slJmXuf^B?L;k;DT-IfikM;Ay)7<>B5E0|)TwTiN3w>r z3A#156V{b5O11(xO=Xm#sc!jD8Q#m9r%>awf^bHhCFTU4$q@ZwwPy^ceL)+;fy1AW*~7^QzxG*-e%hc zhWv$qyI~qg|3${9dRJGI7GKvh#Ll^x{M@&QX>ywwPtRlhqct~j9i}C@Fok&Fd2ol`qo7QKIKYPBg2HH z@IF{*lb$~Qvahr23zjs~fic*TZ(RBeK^O{EYCZ->Rl7d^<5<(@##F1nk(igb2?jmQ z%^QmLp4c3MA&k>P(}aQ+&xl6NPv00l_bcNOwlU`Y&2YLvDfUS_hh{MtBfvKH>5KfY zS?*FX;#%zk2rXN<76ze)9|Ln92PX3NQy4_jM(ArJ{ggWP!EH4$Lkk#l z8-=$q+Z{)0^)nk!#6B#Ab<_T+!w261SLk8qjm<Ss%rKt=bYdY>^Y1IK0vI8>|%4WmasTV~< zU(b2SIsyZ6SFF%>bM4wx7!GQ6lAVE1wv(Axj6AtAu1>NtD-0YUeU0R5pveN;`Vt?R zRP6Yo>||G}LUE9kLtls4<^cKEUmbX9LC!PLFI%322m@q;g{btqz8oTDAwAd>7-})5 zFqc0h6sFcN$W54puu+r6SX!tA2SR${ztg)UOQAgP-vb{Y&CZ<}x~J66Nbos(!K@yO zQStPPHe==fbamMa1@`VG&VLcyc!i^@ZoT_H@1&z8@eBAATQA!$bbkg}p9l z5`f{*$Znv2g3T15bR{ZeARQCS9!yXQ{~eDoLkse|1O~`B{Ux*llnNv+e2ju6GY}mN zZY+Wxt+@tkm@p$Fv25AN1P>HWu;A_iLU4CYu;A{6TX46ag}b{H_oVyl z>F$~7zTeFKMHOdLviClFt@W(;CFH%53_1!i%Cl$B(B)($Re_(7XV2hOkzN3g+>^`g zfFE#=!;<3uP$fn;&mp1ipvg6;2r%(lv*t7Q>XEMV>(K@t#i{^20n^5IT7?!0nNbNQN8}q|N%;zy9!I78r9 z#MR^d!TCVy{iWq2L9fz1_5NQ2l-$CTwK>ttfnr3+lF}bKK5@h(r(3q2I9tuWVSx!r z8~YG7Crt+VSs@3$c!{%mJXlzbjDh5zJLO6pfx2)M!*f%C>;2&rfH4 z!4KfwdVrvSl9UPzDw7#Ye0S&E5xE#49oh9TVjhe3F3C1uq+!l*+qqVCvOWX}p+S>zrpQl5lLd}PCwlYo5{L;tFFm`@SUqeu+ zlKJDUZsZwFwl;Ly&^F}>?R&;bzJ(&f^l#TY}5;ct5orDK^2TiS)h){$fe zM*bLQ8?B_H8Gq-U`%aV0{gqhRmKf4F2{FISHW%;S@SQ^I-{ii9>>z2T`l*sWu*K}> zm1WL>^Qivi9RZNVLvey9Efen0>tV?K zf;jP^+gH!8%ylkM^n=XF24y}uU6F>sy-DW~yFUgAsqNgzCzN9;Xsn0=lGu5hY|JaVlw*Zpx#^~x-&A=5&50lNkE?XpeT zQadOT)pzaQMsVl%oeQyOb6P_L>&Lyl%fsMZ>xcNdD8&s)c77YaPa-7wwG{d4-UOud zZm)eD50w>m^zk!Vk4!-?2h@<=bL~a+2vNyVa>u-6(bk(6BbJT2OMH^q(%#%i>j=LO z(>~lko0y?4K2b3ytn}GJ+MkU%Ni45&UE+I~Sd$y!&<5)a6L8+T6M5BB0{h2T>Bn=l z_9XV#a@N&;7Keh>yItbpf=-xLnU*i`yncHb-y8l2&zjh(3`uADY7roQKF3zd%o&D6 z&TWRB)rXd|>I!F0{-drsBymbV2&ud^w{Q@SwT!49R`j8nieyIWeDFp|;Wx1re(U*M zPe~d-X-0>b$v*GgwLUM;hwHdZ@y3LaC<}qU9!#_I+%|%4uF9FVt#vN+6r9;^B+wflHOg73i91H} zbN;iyJt3F5#P$}`W1~TchJBw}1VV^*TSTw%m7~+)do!nRxm`cNpJr^y}_^;N4k zsjsYG_4kh35Vbn7W*2Bj#c-iNra7-{vhO}dSv1(94ZmcjJM1ht6<3?7vi2H9?G${9 zEaBZ5gqmuF4X9fyun@GycYNhGx^P_LKOLtQ5sa64IKrGGTuzzcmC1hP5MnJDfq+U* z+vLi)<*j>G9~RYHL+S7!Q)4+tZoFtlh7zERVQtoZkCGK(W#w(lwomnn&l3UlE~wgW z?Yv~pBiX|y%lJ2AKq28ln1~^x%5}Y=TFiC^1Nr074U761(H`^xte^4p@=!T!O z2n+9FLqak>vqD(1F}!;v&ma5}KhT72)L28%%+{3YuyKw?mm@&Q&35Q7 z*CGNJCqe_eo=p4CU%R_3o9(lGPhn?Rh-j3odGJM^tZ8;5XNV)%v zx<1#@lCHqu&H!b0rVIg{(=ryG+=EKl$dMZT)%s9d*YJdkrmfmv^Ul(WvB%n-(fg8u za(f^3h^DLIbPJRXCdZjP6h3wY+t%cXPs{o!GikxG27BVz6`q*h=Bf9%JF=1TzYb%m z$lTw3`vQ#s_m%*)S$R9|?Do9I-J=Y&W(T8+19iHDDSdqFrTy(=x~@@1!(~7A#g?Rk z+3c{^hrBMMUZbDAxgxGuEeb~J@TvH)iD*1lc&|$nGxedZM8X1EaC(uo zsAZ!nDq;;Qgn(WSE#a#l64*kO0iiO;56KplhQD9}i(ci1WxQBRs05j=ew4;?6)iI9 z3`tLu$Eb));=`3c9xFs7*~iwqyCn0H|8f$=xN5ivK-OXcDnpV_JcstTZ>gkH=hQD;$8Mp4VDqX)KEqghfvR*NjT}bLnRk zw;@G`Loh3eBmaUFBFi##`Yrd~`jEQoO;vm;zl!jW@9P-;cxSUKS=mFJKGO!hEj0x`bRFTG_W-12(ZQ}7ss$wOg%X9y= zwyq@gn|(_xR}D*{5WU}YZyYUZvZzAFLVzTOt}{NrMp-Oy)+dr$f(}S;GLY0#Cq&?| z_3!y(kuqd~^oCNwLjE4{t)$!WTjzm1uZSyqP$0fywnSi*lj?11=vTVOW^#WN>{hej zWUIt-cb{RAl(=;t5etzu6de81EftU3RE;hIP$S{+{<;sGM)pZwQn|(B@pbNE*!^wp z?Kej0n?B<*?bfZ@OPP%r>GQh=upbbrE@#Gh63XpG({U+c2HZa>jt`wrRkN8%>O?P1S)9cLcZ6DyX-sq^DTfYUb`|!~imE!)yf_hss zfpeVQaI)^PfoDsYagrakk-nWI(8O_IqyZ0j3}fToqQYUfR+*^w8sfrXFViYGsG3r| z>C{YA7~r#}eABrQD5q4!gqTj{bx7RZGdNlt?7!gw4$PIzg*^h z)Nif_A`~p`g|~q{?KAuHG`AD^;+l$!8i_TawW>1qw1FS)QmO3dWtRC69Xmt9M`LmS z)=oi)&XjczaNp!=oGwTJw+*Ot%{3;tX%`}1&iY9XgCZLnUZawkApDkg|Ea|d59JuQ z_nRy4iAQl$H~F&c3SB02maDL%DCR-#l@jH9dI*l>XyGxZ?`qq(`xT?6EAN1uc^X1m z7uBbUa4b6p|3Ud>S$xr?s-%&(ett{bnQz}{?5ZO1DF9pR)pxE{C14l24kUK(u>q5A z7&zf4hz%?dgDy^S7jPvQTOQ#^5*S)wEmwkpiv@ixO^@F2XMHlNXetH%{vx6Hu4nOD{0*rR%Q$2(MJ+nW}MoVzWL!OuWQC6@LJ&I(@%U>aD1+4vd|9l)&pza8V9qm zE;1ggS7argh0_jOVf8+{Hfhp_f*sby1dzVcC#y2N46=+%Fe+V5-p;t8%MF;U_@qBL zMWBcd)mOIGnchL4AG<;R#`VR@yH4n9rl(aaoU?|#N+~_zAJ?eu3(0cw(mZA|i2~Y8 zZudbr2UgS+3~Gl%M}|5>tAwQCS+UCU^0WlOzpGXWi6gTZ1_h)qm28i{!^HO;)aI`r zc`$mCF2Xv%H9}_eJpTf(p(=0xk+S)BW?(K z5&8G;9w`DVbNnE8VM_g`GYLC6{b(6jv+I#8Nw73L<^RhN7Ti|Q#ajYQD#c_2AFrO5 z3#$g-P^IlIKzFSOB;RWy1R*}pp7E^m?QP)cko|C^ET)H)J3~JB>urg+20f(qP3OxY z^0{vf$Apu$%Dd08FG3}zPuMO(BTGnAWDZ~+A6l`0T9rLMc=eBrP_WYs3$zbrLFvkk zPVFv?_aK zMx?tF8C%Pg{9@5b!ANHPOh^1Xq)#bgTC!L$9}&%@OhRaFI#0;3K0GC)Wn)929$1uS z)8EveJdwYhT*b!iFUI;I9Vc4EWgpUH+e2F#YPAJ*c-zu`y|?8Uee60qd@@{U<@4-g zoOS2(j}3~_@A+Y<_-%ndir#sHUIB4GAo<_uNijgBYO}G7kJVI@TtI^C7(<W)-^{+~wWBp?}QgwI7V4dP1x_YvD;NxVBgaw?A zx~UXD({Xe^g?5snEbD7C>0hus-5z5``lDKP?`$_YuI0!**sU`@R2Z=hdM-*`%*xHU zw0J$7PMF3e7(>gJk585c2*R76unC?VmMeWWEu$#y6rrr+Cm3&-#UMj(fIEHw1p9F-NawcUS}o zIjFs{3#?=&H`?Mgx3Q2P!G=#l;*+|m@=2^o@V#snWb+uRcKYOiApeVWf%Sg% z>&s6cm}6Y&+I~%BJk9-1Pp3m1t2vo@*nuDy;)J#(N$9%}%N1&``o503-VKD#qL)0~ zcK6r{$0||SDZ>9Igr&ZV#trm41dhiA?f#SmKOjj)j-`KBkpU#hf{gstI9OOvMsXZd zq>T*_hLqYrq31D2?n7vZIH#6Md*b z{Rv^t`Q>THXdkMRDnc$P2d$!jSi3b(Tt=MdJnpxyPC=}wk8cq_Dgj}E-(k0c5;%D9 z<-m6?{6N6o{FT=g3LHtA)ZV)bo4`aQQ6*t80!I=!<|5BF374J{f*FzdO7?imSyrSf zqld9R_LGyl(8PBvdQEt#y_y%}f?JLnPxo+S{TD~wzlUrxKXrbt_I-u!%}E6o1kD3Dt!TR4uLj5IOj-w&>@LS79MBt(e zGG1G^GNJ73tVZ>xPsU0|$uiq;`0sm^n}?`5cxkgw1xi0FXh_Ub1G#scMNIZU7%(&X zCV6^_f6(F{rjBK;Xzf@QsYJU9d@6x{!je&C_A3bccG6>9fquCL8J8d=?u(Auq*2V$ zE7Al-)LAPHw*YZl=GgxhF}g^xkyOj^;SYAKL>V71*8O*g(M#|3Y%$T~jL&FKa!oW} zNQVee0P4RU0m@md-?uiYGhFXWA3wkrxiH>IkeW|~{~X!B@IkyctFqbM4^OF@$Pe}T zzmmm}pEOj7x|TERW&7HuBkI~@* zyb`AvKMbc3XB0dGX&!YrJ%(FBg$+4oZ@53VMS&yJsWvw{KC=~&?u`opOt8vdWQohX=SQ|LEo#<@j)>~!QeWB{T&I8L z^4K!|$|Ty^{4Ujx|57#5vL>}V)4A(*ZN4u2qyCM|k4%Gx@7!5FEtwuG7&*JE>L$B#^HS8&(@L`XVYNh#f%&NY4V+y1TrXW&83V9lqV>SU9-Mk zd@ZT7;tZi4UgEHxMWF-u+vyOv`v9{%K{T5$XrP!gOFDK5fXxV{~sXX z6lM&#*NM7v7(T!Dcqkw9CHv8saEW^n(fbpN^N7RX5Dp*tv_4vgs^k*xS6or(lfOBt zzX1@E;M9GH4aJ8rx=Zg*QM#9eBc*bDOz5Mi>Z@L~6obD1CxiV1WTaK&;XJ=%HceuH(B4QLjyMvj!l;I z$)b1;9o)|{Fdi?0BU8YnnY6kM-L# z2DSEOdE?q(C1$hgOL6n@WF@q3+A@+Y!N0;56l?od)^@5A z6%HoS>+9(fWFP9MSu3WjkR0!8o=v(x_#Y>tn}BXW3I|S}P-i&j9ZuTR?UyyVZ?&ll zOxI1>aD4?rqV0UIK7Z_746@?GvZdZg)SxDXv4S#>e^sCJ==#DXb_pYY+QtB*wK1P( z(KM)`4O@AxF!D5ByA~bs6wxkbPPqX91sd33B7t4JU$f9 z`U!q6Q}i>UhHj|9_!4C!?wdJ^%n|C8vfA@=v@enyzF@9=0tEndc;?Smra=Xs>nS}o z*PCMOWl}U5rM@4iCEFgYp>P2`lC3?RN0Ya?UN9k>%*_2ezFe6CoUwz~ur*2M{q9ob z$ZTG^A4kk(PHbLHzqy|I-m(HEw^Ivl%J4ZI& zS#wsfaHKkID=%;@7(Y;Ez3t1~xB5WG&RyHtn)@leGO&Q+9}=K5v}4_%0?p4RX92U0 zM?0DqwxVCMCgn3L@Nw{D-}{ko%Z$yc+Wz&dVCC${Pb;F%^83*41T6~`Ymis zT*+d-;Nbf1Xli8tGm7kY)KC-Hy6( z^ZX986<2dWf;+@|Pl#IRdiewQiDiMjb#OzSiEKGAZe@sKum2SQK_@)ywf0&UicWqs zyWlX#-~p8e^YhL$6!WIvdRXE%@0UI;-^s3b-m=6hP#B>4e<7(DxvNS|kM$`WiCgL{ z?iu<5|5$3<>MqR?Y5>C7Af3fUI=QBS%q7ime4eDpqS4C|+8q~x@9|A!$~jRz>lL|i zNZ3b~?I)S#Od?~9_ER7$7Q30K-3RitGIJJTjW+-RgNK4<%jkg8F|+YP%O6ql1|^VH zuQ?Ma9X+-tjGyEDw1Woh3Ag)oAbgtsNhZEbpsMuP(TkZ_c~!jft5l3_!g-VW{r67r z${GI*Q;OK|#pA)lmF9>U(a*_jhGCMG_VPiQ^Nnsyxx^Hdgh>brv3d~lv3fOr*1<#k z!c#J6TRiSY7`k?0?3)^u+(T#UYPvM`WW2G5fFCH`R2mMTzMFfn)~Ih*`A9|L@a^g- zBQIU)04U3AG>rE#`2N^8vTb8NpQA~W!no)S^c~T84~ul5mtu2pCe)7oo$b|-rE0T(7c*dy|!hEL>kY`t(l- z$s&&lBLU;Shc7jRK|2;cU5~YewRDM|9GiM^-0Jsoe`a!ZySD3R{!#J<3WWopfC6=w zE|2*z#id#}A@|a5 z!Ac1Fo9|;IXGTZ1^XQ5ypWd?^HVOaI9IanZ!JK;g8`xRfSU=gI(`5@jO?}z31{B9oXsc-0`|Z0ItN>D@;exHl-HJlk+U>vh&f-SQ zn*;M`>yvyxut!khFVy&vK55)4X3BF$NH7rJEM6(&sGDR69}L=OpjH5|fez z>_G~|8U?YXO`WBg$AiXh%IDbeZ#*CoDS~=WKctC@jL^AgH}z)aI>Pr zdnhNL)uh`gM-Cf|spVMm^;_(kn3#d}&&)Qe&>>f{uSZ_bE39BVnb|UMXa1G=;7Q52 zL@L-^m=x9sxJVUrjgBTA9FXFuO_Uhw>#tk<1)UOb{}r7wTbi|K6}(%bTV5F@%!q$B zZn-SX!J;k`*Dv8=Hj`(Bl!vlX{wV9iu!(UTgJ(MSSvmUz;~2j)&QX+xc8^EtSQj)} zw$2xC=yDG?@GMYF1wM(8o3TrixPu;XG3F00U9_*jsRoYM9=Ip~LVJE_GOeJ5@U5x< z1yq!LJ(@-!;Y*=V;O11>P3#CgS@V+t@Tu_IB@QiYebN(p07H;Z`wH}#&XmjauObI9 zYuwR#dKA-MlLBNau1ThB*p%=12bbd-XsS%*#m2YeTq} zBvz3ZxZ3l*U!DiMkQJTiw~D-SGIOXpZ}%6h?y>F|WPKLEAC)e|&GHgn?WHMCOhSx& z-8gcTj>}ohAPN%RQ^Ho-ywI{IZ2`6Dnj8()n-wUdwuC8P9#HM~VEwOFmJ%Y9r~AUQ z@npPMo2!JK&UGm7+>eNK5L-+l+X1^l;pVe#i6K<&+QDHPzUd-Mz61%}SjC*fz@a-q z7j6ieIW^lS2@$RF7kQm!48E&nykH3ZB3?d1=xTyeY9fKem*pprAS}A#G+$H;^b9nS z0=9g6!z1e*%${T}4$g4e%#-CKD92W!#-iU?*>nCWf04A3Jam{gwl?G9)8)&?KcOF2 z$)p0!tPlGFQh`Cy>8a8lW(=FK8cA`ZQ+lA)3>W9MwCUO>am`KyRopApx0(l`z@l<$pbj>^hQ&Botf zR&V@~9_jCy_czT>uTIUMZ-ksA$VLqC$5%wZd3f~VbLQ#r7la^z`44{v=HNgX4OLBL zY5q(;#($dp8V1Okl!3vU<>eQU5;gp(2)f}7GjpwaXxuxbIZ(DFw7I1>)pJM=+YDWt*^EgbIKX@ z-5z#t_T&>IJp9y}3C3%$NgmV(BBpmcSLOorz^t7oOCR*_Z!q^~q6ywTb3Qum-Pk5G z+#ggy`!+A0DN~^I!WPpXCy;l{ddFJCLpZdgjfb;llFfxW9@1!{9dwOeB=N0nc2f{h zSK-z9*)IiUs_n0zy`HjC9v)q+?pR?tzZ$+IpKRKOquhqhJn@DHs3vr0rh8s+(;#8a za(joW7w1^Wk{-A4d|_w2PSny_y-S_u_Y@i50_!X&Xbq-|Uw@a$D6?34MTXXjNHUQu zyeg7U<{tm#%^4MkDll$!#F|9&^JxG z@D@vr_R{qJ-1WROGx&Dps*yBpDbfcOQ=fSD@)~{Z(Yg9``3%1FB{NM=CiWmVnPRpH z)PJAME7WycIosZuRe^R;-7{z3$>RYs`HJJhLgePcs!!}|t=Z(&EvfgTNapCJY@Y2C8CYLsgUE}3f-u-Es5!qEoJ%Yk$-`O z8a*pIXr4lvfk-uyM4~g0eOWa#Dm%BFsm#t~C6`{q8 z{i`CSa!cnFSw|u^`&t`9e?gdduvEiAWQleWAi{euZoK8C0a8SZHEQd7pnZB}A6L8> z4@9B-khqFNAmlIfDV8~?0YlShl{)L90LV$s+c=&EX;!Sup=RjUZ{))dS9|FHM@4k0An!L7>mEoG}W)65egdSoL?HArs1>y*tS=% z2>sKqq=5fR+y2>JXbu25lZOfJgEad#4>yDEyf(J?y>E5Y(b07zP8HzyL{4a{Q^HF~ z0iwy4f_n5T=)TL7mXN46_)pMef@X?*#9p36KdCqkJ0VN7QzkD%I^KQZHg_ZCh6!pY zz|;)9c0v%cevk^Bg>G&~wbjFce9A8GH-nUu$i7N`)lEUhE1V>5$6Y5po$-@Szgtm# z5uV;9T4irxI?^H&d05riy|nTW?JC0s?dGj^|1pYZWV)^z75{?+^Y@YbBH?%X&@UZ2 zmG5lifp7I1P)N==oF`J^wvgh8{Pmy(XyjqIDkU~N;petJp6EvRTWXquSSv1_MgVEH zWwBx#QcxG<$7C{aCwFrkV!wAn`Az|MbARW+L(%^SSKjDM7stjVNLhO1UrE2kM)s#f zq@*e`;7XBIP^tyrG}T&R5&DwlsA&8V3eaK^lgj$Fu@;OF=$+=G=I&bofu`n9pvgJ+ z+a+~0#TT{VjN4gE_T$;FX<~nmthWFpB{thKKO8v#-rFyh$8Q6iu(cWFAtU{N6pu;; z)v&kue}R@Q-%|8#pA97|n9)%&w(@5vbr{(zf?0^((;Q01b&{ZY>|-Lty%18kxDP(T zxY}O+%8RqJ9+1>(@cYYrvSMeU76!~G{R~!EY?;yA@Rb_hotnBS_y)1SrkGE-8ePEpSSnNS& z?)}rG1F5`SQ4~cKu&6|z|GD|@?OBo+hcSJO&9cc;Y#oHNiFMFNwoU_H6B6+06}Lb4 zB$=UH+f2BA^)b$lpydnI^{e}v&0qYgN<|3})GG>=?b`W=z?|}dxO1M0Y*)T8eeW1` zU0*7GP379ORF1t`3#ZUI#Vi+uIj@crJ$v`uQgTpQ!S=^*?`9@Hje9Agv>9CBqIr8F zVAqSt?~P|nS&Jq-qLOWFe#Wf2>7#7(b6**1ZhM_O9%GDQx`1`h*3twkGn`?07 zhoawAiSPu7Fbl-`!kXb@n~*A~=Ok-qV}*x4lY%~kksYW;v>vdH-43&A324b&3ocYM zt9WapZxpxTGzgwL7Kx5wGEqVlv-P}U2ZPF=ZtOg`%L4?gT2J8SBtM%`F3b!;7uKIU zCcadDjNZic_)afCxiD<7vL=%vTqQW@LbzDk^2KV>#{{if=HqBh=HWMe-|o8=y4n(n zz97-l$GX=}Hr|2}SxbtGy@V)DC~XmUm_lB|uxT~$icj)Lud>DcoTL(7T>RI7t!hIZ z5+j{y^A7(nvs=8guP0qM^y1oJaTA6dN4DcHl09e6#$Dh)D9<`Fx1C-(ex zhAhEJNp-Z^K~cob-!3_2wAwrZ>%9_M_Isg81j-JH{dW_Vb;;}E__M;zvC zpKlKw`BWh`1Z<_=<~-hf-|T~r42RW*{e(`+KsbQ#Zs! z={1!sY~pc{rc)W{=m_S8&}t>6Lc)(!oF{Y zA!E*lHGhYG)iN6q;izxA1moH-Dtbugg55fjzkHHw4LtnUl1JkXwFvab;_XZAGtTPN z?ukMvSC>3+3Qgz-O(`-_OU`IuVMY)VadChi6!~!g`&I#D)YY_k<<&7e5yX z!w6)OYE6uiwjeFSh21fa|61@E^lS4GEWrN1Q9brJe2Vgu4s0VH`j>h~_36Ls9h>F< zLGL){_&?;GA3#KSo?1!Q+<+u;%Ye^8fI!cn<;={$_x`^UPb*(f2h&E}vD_0vIsgz{^t^{}I8gWB+N{s7O+A*T5&g>|w< zMYrDs%QkHC*+&vUZ!<|jE?o)Gh6z5;;aXz>f}U%CeD^LMP;9Tzc;JTxb3-?-8YR)w zJM8Db^)s~R#e~wlhXAw?P_1BBd(3Q4DKqYjpX0-Z-rfesH`P+{JG1yhgyt>FjV2jd zz+qxqc33_>BI%K=P1BjS_?h~RG5whOqm4P>@wP`KA0Wq}lWt?Tfxmj&Y~!e-cOmlV^5Z}?jTTiX4@C&)D+Es*zFQ4d}%rXmfA9L$wk z$bibx%Dy#zic5j;?S)>Qs8>=yAng3;ZISVAsy$g1tP@m-WhVpgLMZwEWwFRiU=ZTq z>*d#+$8hXmNLR7C zpc1wxGQz5%ywiqw&nrJEx6zTdz6kxm>woifxwey0-K_$|O4eBXLS%VQzm33&fHS4g z{Kom-40b+QxmMqK-ca+)Z!pZyD(Jc?BAI!Ga|=oet3Ss)V-jF`g%nl-T8c(nCRxcM z)O-rJR@KzsO?1&?gj_Q#+xa?L1?dE9wnv0}+ajmw&38s z)>T2Qh;)gYt-ebkMzfttSB5coQW!=3N<^D5gl8dunJwRJFun+a1)Jyl%GHe+d4Fv? zTBds?>hf%RnOtHYn^AUVnI{$_An`?wczbQ9=TdiWZCc9WcVapvI%5rUYF&j~x`(c1 zn=Fp=Lsx#c){UOE-(s{X4V-YZD97HYwmw(*2p7lWW>fMUOeg{h8@Y7$w5LVCqmPEv zjb`cLl2FTi@^%x?1nRH#z8)Cms4%{@*8)D4M!xN$((whu;`G5|PEk=h`(hO>rOTMETuk%xSQ+66QCX*g#Ciah z$e7r60cag4Az}U?SA39IV7V4-qB#s8*(@(umeiR5{%CXyI%c5-%9K|PPMVefpxney zliyt;fdAg%k9c$MuxC9U%L}-eB+JcCD|%;sm}R^iS=C~Y8n#p~m-o;hu-HwhyI|Nx z@<*Y<0)WJN&|ef2S16`q5apEdU7nGH`)GYV@P>hOf85mLqgMzLDg^^~MEKAF3Q4#V z6QVq2_Ks6vAR^A{ACHpB+4*^xb<&|`kZ<|ouUvvzN7!-sj%x(5vL&5A%m?r?K~2X{ zohh;z;P)~Q?)6J~TqXN49jWJ_vRwlc>{kytXr?xQ*`N zEe--^E&{6})TYv4h*$gRxF_emTNax%q}hK~cbW!vB7G-viq@9jf8ZRkq12RV>ywV!e@TWk(52ur|l+nKz))i4=)modz!gV#c`IU| zsbD1}j+6QK7ZI!M%$mC*u<;mOOYaRxItdihM*c|iAgH|b?x8&EbYQABow<-cSgB)S z;cq~)yxM?6P(($sK<#}4KqJ31Jhw@C9RVuH<}^FGKECIVp}b!eJO~Rw|48xhb_?T^ zSlRfO@^W5zxd`1e@d6o@^oo-%BXMVW6;kdgf%TOp*Srx1o0Q5OrybIV91VzU;O-<&~1d3T0xdke7jsBxS<-8%o!8kU!eF=_>?o*Fq-rK`&0Y6*rRZ!)q zLY1GJ^VIq$(dKeuMREr#-z!m?toV2ZCX8Cs4puHwQME+p@V$)X<#&$(Gn@HU$M-g* zp-G)KR}M}y&OL24KAd5Fo-I8V=9iR*e|7==ZMDhMF6rR3Y&_0aEIS;yTa07s=!tMo z03|O`DdXhD0cE=qJi~CqOQ2R0KBHC<2mu!Ee?P>3Fz^_sCA6n2RSUHIC-$AH$}czc zolwhD*zp594ZY*SbKltPvLS5JQ)8l~Z}1^y^X4rz91CKNWcGWv6*g&>`!BO(h3_6> zhA$3JF1P`ae6hd87x?%4!t_d^?TN!dz=rXKVJ04-=UF{5g0L>5oASsX`^Qhz=L{K`2R`cbI&-8UP~FGEK5nJ znOLfh!Tt7_z9{g8uIoIXC(F1GbYEXHpn-FneG3Gw9w?UIe5DaI(y|Cui=K=J0JXvwrU+Z8vZA z%=CKy=Pg~@7kgnPzwb!;8$F7ars7q~6?4?OKi}1mv~RVcYzh6MKunj)Mug%MJNX3F z9-~oF`(WbUUz(XR^aADs;!@g5^Ci1hw>oC3q~m65rvK!i`&upi7TC4G-&36Q%4k=3 zQ0VO?-=2zsUR`f-T#%n}RIUivhVmTh5r%7b<&nCF_`({vn zP`lK>(qG<*xZAfj>uB^YME5jVLRiU)R%iLnh$Md z=OV93=hBw9!d2t%=Yg+71RXpi!q5c?YuzCR4FbPLGLq@BO_6_%Hy(2Bk(em{x zSnmQ$C6`vdD)tB;&+)MEgOKn*?F^ksm({u4v3>#OtF(yryR*4q8XC1 z4WgdBEQUv&+@#-(o2<}S;MP&alApf@S$N`QsvV_k> zB}l9oZg{}mlrzB`fd7}S8Gt@EFeuoF8hL&Z)7qY~J=|0*3w7-A|+ zeJ}0g&=iLJp%f=nY22QLqVd;qtSK5LHGOpUGtm(m+Jy$B-0;`Gb|u=85g#7CLy*ub zJ&Ha*=r(xT5s_%JqM@SGj;#>J$!X9hU}vQt;lK;vwM52GIZbe)65!7>KlHeHdwZRn zpTcKMJ+qg?$iq$hlT24RI;yVGBSyTJBFRi&O?+*5=6Ci(EKh=!@7l6b+GLF#@GNLVR|lqqS`b=l8Rm z7I(qv2{d>G8!WNmJ%BD2!C8q zBc{u=Q$Sl<(16^1eS1GbX={Rym2o1r3-Lpxq8TTVHa~zE4S5KyAC2lyiVmhJi=yNH zSd|E>;=;T5V_&4pis9?3-~m3R4x`GEAYNT2K-Vt(1Lc+$H>AH%2~8~(2VRLbJ3wce z@~>dG3phh(A~)ijQY+Y2iKX1=wq;Ts zIs8$|C-*i^WgR85KLB4IY3)CCL-T_)ecP+FnCM^F4&DCF9Lh;NsnIg&dr|sy2{>{8 zNfmiEsu!2%njo;aa3T#4tj`4DLAn8tS)AS5#DF&PzU9zzpbOA*$U9B@Yf#~Ae*FQq zfUR17^M?Cx?rVE6rxyQri9Z(KgxyA?v(^N&x7 zl6w&w$$0Sa7Z0`joMw{BrjxK6kX*G%w*zR{;~_zV!aZKeh8l2p@5}7)*}<5E!LV3m zGqfIS$Q701Fb4Ypcp}kN`r33Jv!7nzb*L*AdJb)c*>5VQ-B~n-JMw4GaBBbjUx3tc zt1CSTN10(U%S9jZHd20>f&KtHL)AcixVW;n$|DQyUzVXv9+y%YHjfb-ABCqsTMqo3 z%^znl;`RQGZgBp*%e7}Srp|{6&=MI_-GvqOa|Ck0JMK6Q|7Y;HSKZJ3Qm490;fmEQ zI;mOs*BW`)koi?>imR`nY|iUZyU~iC85fBEl4H~OPD&I})dSKoh6VgqXCXGXj-t_M z6V&U}T34Ed^?^#IoO^LBRk=-Hxy3ek-09>k$JCF&|D>I)Jm5Z8$EN!ytF_IR>YImm zkl*Wu1h8mrw~XW0C43jC^`FW55uSWT?^ceH{UQXDaF?@L_l-GsCVx=fZnrf%DgHa3 zby}^C+Z*s>Li~@-t&@jWdRCBtjQt~R17=_MqA?* z9j#M&s1mpytv^O4m80F^W(siV-A2Fab!{YR>G|etS@o}>qu1ioMvaxeT8lH6=WIk5 zD|6-sQ`}|Vv^9HNR#Jy6;}3WHyKQQn_Gey1lQG>qsL3;}oM|GY-3{-qE4B*F#5$Tg zNft11O&{WUq7-u*zO4Q&2L2s5&LHrWnBH;&g>NxfeCoEJ5R5a;KQQ&Lfa6cjn{s!> zh^xteFj}+i;Gg}?XiayE(U7?Vn|}92aOOqII0<}TZRP9< zmJ;IL!_6%S>47~TP8n*L>ZsjS{Qpx-Y1lKE&0wX?(`rr>lq5qO%*^r* z;Wzfb;f-PZZLj>x8>I1J|0Js1IQ_SxN`n8ns4`9MP21S-@Bs!oOBpw(nIyHadFw~w z)=vs_FS<*pek{M+=sE1wI&i%iEHA|8j>;L-;iv>TE-z<(pv+#;Xlqw3rx-e%gjd); zec7tZ6U_`|Wv`q(44QpD^?fw?QzrRXY>`P!dSXOUhr+`ywM6IRe6u~WBVid-3=$Kq zs}o~))5hf9N;NvNVEve&g>i^I7JZ`GHP7*+{Y9{63{qFG*j95Vxj5uqA7p>9s;`tE z4|%njC=k<~=N^~v;pQ<(jk?E0AgrDxIzJMqg{~Lex zyXcVtX)!=GnI34G5f2!ve~J1I$L!+wG`$We#<;vC2_p*oP8@f)D1I^Un!|la{p9ek zBFm^h%u!$7=y!@iXXa7!P}o0P$l+f%EUiH4urN&c^cvT{=>%l z7i0CSMr(vW_Blrxp2_;Iw)r%TGn0}(y~E4|DIJd(DZ3fA_Ll{5NjwMm*?0 z&=3XB>lY_NHylQ@*zad~gZ~+a`GEl)MkBPlWJ0k{P$gLrzJZ7aenZo=*Nt zgB5U$4@|*dE40!{GspD_vG0=!nPD#n#2tscBZLb7H&3@v@R!Ri_4ZbLsIbNLP3W>V ze|=x!Qy+LCPnJ&ie=0f8c((UF03V|jqN?^Nsu3}RYOB-;vAL?Mh!qXTD5^D6wO0>0 zrB;nvRjFub9IAF~nxcAWi^huCs1Y-<>c%HrZmt&4}Z3e zcs*UiE@F^cc0LXiP&$H>w_G{jE#BHp>+OY0W&=bkeE|*5=*ZPjzlonLx5KpiKybVJ z<6nQc*5%TuX_gK5K!cKz`A5k$(iOg!X$7v%(8EHuR~rjXI%xck#K7Ld@|T-C-;B3b zU;P|7Y7-h@Tz$ixXDwXxUdmK7=HYw=RG8R>uSFbMf=*9vNBfyIhD*IKIXyY{_9!w{ zZ#tJnkxniWDAaTClk2?u2ovZDmYE5p6r)3~Vv78`OT;bsh>GHEh<-iywO`v)E-|~S zOb|R!mx(E(M`NfFd!Zem!IfeH5j0I3!$%w}xC!YD7gSuwC_)w^0K=tAy!RVv!bnGa zB%L*l+cBwWx9n@{B)Z05?z!HW8HOZ|UQI339u60H#6O=m5o8-YXzBuOX{vs`F|+5F zJDJmJ(Rc1>YIGhs`b@Oe^+ivJG=ot@d17^TP*W?g9lkyNkC=OA4DXG%ShT z-h%9H4LJ;aS$FULu3J`F+|fedaRL^Q{<@YMB&s~*nP0oS=xvAV@k{AC^$hmhU`EWL~i7gN26oI9SR7$n_?% z0_`9kccSH~Y7j?YGLSQ?VaoxLlJA0isg+z&VWUh=OwN3>0;6fPrFqv~_P|EkdZhk#*J~Pbn7(ln`>aZ72!{2SwsvLb zN*v`Fp;w*Fo5bsuM>*@$iwJ=YSze4yF4J#sOBQkw$DYeR||u|Yt%Mk`Ze4weQWd3-K9&S@nI~s6EM$m-jUlGGJ<* zqmUsS+(isK)j{}b!V)Cu87!C5@t{@7;ka4=a=7XS{mss$?R)O7mg;jRWwoP9_*iUg z!p-*MN%2~$2hCY219jVx<7aOEmBy(ZlZ?xHB|Hx3ZRyX>e#lnLQxe)H{zQwan~?_o zNC{XUiSI#mkX5qWq(GdcJYmB+6%`?M#;H?t_#wy@Fn{eV%-Itd^@74!^h(dq^B0_+ zf|t_`azuyhrIhE$V|ZZGIQfmUmsIR5(lP8~`Hyy{F)2^HSy)<9n_K0Js0y<^*nj7W zmkSrz5!FQ=jr?(3{SG_oR7@%4%bAKX=n#?6`m85}>7j&4JVrgmsGO6dC=NPn?LP0| zlz*c9+V&FbrUWqqY@2jTiy889Gl%>T}wuW9GulQxg5`0I0#m$}ZFzTZ);3?O^ZHd^KVe{aDbBvpVUDyi zQ}AF_HN#YaGd7M)_}GM#(*zg(UK!Vy&8*$~t$C$oX(6a zuPw~-pUw1Y45aH8rzWFFsMxlp%8-Uq~PAps7*I3la^G@ltP?5YXr5qMR%iJ}^(hH`^b1j zmNgHRgbR5q%-!i^eFADRrfdcL=}^n*WUo#xf-W(nHja(1s6<>@qU(KFdy;ljJjgFt z^2<__1O3RivI+;vRplN|S74t7oYkb~+>CBW`cm&a*WKabN4Qt2@exE14S-H|M0Fj% z-B0oLCb)E@mU3u*){WN+dw2?25cL>(e9I5LC9{!|ipw~k97N&l7L>G?6nw-pJMCyH z6Pyg&l4ot(R@LmO+*!MN{@XQWFCrGZ!?As(<MSAN7r=4c6yn;@zx$)dkU&p4XQ$ zduD=vKcQyWoY-;=HE%a;49LC6i$q`8TI(Bc9=buQiE!qDHMLwInkVC zuh5SOL9!sAkXk(PyAiYI?y|kTx3}G`k#w*lNDX3qVboWa?+(C%&kfloyk`|qSJwvk z;ACROxumctNcjx2KQr=H`!#j@o7Fj4V-p5-6l2J38C|z#6^11H)4-@d9h0Uka ziN(>u7F$~l-^4E+zT9~?tQDpA_L+vc8DZXYT#>IkR9yF9Q z0HVey=13(|lv*7Un0jcs;d@m+I4t1?w->eNBJ;$7kugY07hygA1y=!E&$$g?XTEaz OiQ=d6e&<#i%anqEgl?7v7*I-OM&3Q-|T&C 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 C_i?`f diff --git a/web-app/static/proofImages_dark/Strengthening the Antecedent.png b/web-app/static/proofImages_dark/Strengthening the Antecedent.png new file mode 100644 index 0000000000000000000000000000000000000000..83857d517e206e1d917d01a66c34b40cff61aaeb GIT binary patch literal 25803 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 literal 0 HcmV?d00001 diff --git a/web-app/static/proofImages_dark/Weakening the Consequent.png b/web-app/static/proofImages_dark/Weakening the Consequent.png new file mode 100644 index 0000000000000000000000000000000000000000..a5395cfab0a977fdf8da01bb677670fb2703cf79 GIT binary patch literal 26268 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 literal 0 HcmV?d00001 diff --git a/web-app/static/proofImages_light/Biconditional Elimination.png b/web-app/static/proofImages_light/Biconditional Elimination.png new file mode 100644 index 0000000000000000000000000000000000000000..fdb64d97a827e11d7ab893c88614556b63a70082 GIT binary patch literal 15187 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 literal 0 HcmV?d00001 diff --git a/web-app/static/proofImages_light/Biconditional Introduction Negation.png b/web-app/static/proofImages_light/Biconditional Introduction Negation.png new file mode 100644 index 0000000000000000000000000000000000000000..fca79c16a32dfab2cd1efde9339b83b09abb4b2f GIT binary patch literal 16116 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 literal 0 HcmV?d00001 diff --git a/web-app/static/proofImages_light/Destructive Dilemma.png b/web-app/static/proofImages_light/Destructive Dilemma.png new file mode 100644 index 0000000000000000000000000000000000000000..6b09681d0a1265ebe2d6259e5b4f22e1243e66ff GIT binary patch literal 8058 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 T;|<>Jmt&|YX#uMgtwR3?EQPH3 literal 0 HcmV?d00001 diff --git a/web-app/static/proofImages_light/Disjunctive Syllogism.png b/web-app/static/proofImages_light/Disjunctive Syllogism.png index 8341449453b7358b91372dd13bbe2040a3f3fc97..9d322dc3f4e7a9d0b2696b11edd7512378777003 100644 GIT binary patch delta 2201 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 delta 2184 zcmV;32zU2{g8`g_0gzS!F|k*gIDeP$0io49NcjaM@Fz}N;Y1^}Xi|JP;#&3Fpo!r; zem|Khm6Q{2W0}9!4+)X8fCOIb$xv#)8wC^!wt-K5b9{Ock*Rl{waR7 zrL2p8;AD0^v`mbVO3F#WzA;qwqz8nQEg*rvuFtJ#8bc&OOe}t0Fql@Yj}mFYH0lqQhosmysE(f%zFMlTv+}TMm{wk`;Q(+dU_gmE%`rm zY1;;qzcORejOWoIj@DWtl`9~D7ux6@$G(N{=064Ju6HnOP%=h6{~6NM@o3kn7dp3( z#(`A}vE{c6X?sE{M}Pt^(0`%J{WGv?;})z~^by{8?R9+k`7*3sy%KAey^Ai|v-sxlE7(93&Ztc_-wWD;X)x0;R&tHHEeVfsIm84PyJn$t`LQP|2 zNhPC%5m}+Y6Ir3a6Ir3a6Ir3a6It;&@WT0Wnr4qw2gNUW!xTQjet(t~WwlxfyPXE+ zk>KZWI>k9A1)jij9Lz?G&>MNV*bZq@RT7+da4sH(C_VH#_o4`1f&cKq+c9I; zX~Z|{kHzcf;l?u7cx4h;Z8lhhnG^uunl$?MT*uXLk*?p;LQ46@=6jp1=#$f0VGs4G*O*5}`^ucQ_#QMDVxA4bS%F;uKJ;{O`NNaU3}Ij>LWW**AiBv3)5NP*p^qBBdI- z$S8zs=nJ)~T@m=vc;d?=2-8I(QXh`u|E-11RV?#P7I@BGr04{n;1iuz-uX4l_SrhbOxmq*78FlgLv$$`}B=;~gQgyBf zywHZvs#H&mW0$eetusQQoT^%iL6lIiL6lI ziL6lIiL6kQzzPSGzX}L{P~eHIcm@7imb@XPI`Rab=V7*PWOl=zZ&0koJy*Lq9;`7Xp_ha1)j(X z1)j(X1)j(X1)j)%O27i2ePA)}>E8#vd-pE9_3bwR_fD9J4M)?Ztq7@H0Smn4!Xd2P zx(D{SHt5==GdgwZgbuA5Abr<-+%tSEmLD}qTM|-vJb_oJ5Eka{OW-n_VXf$M>HufLAB-d})?tLLKirLFkvn=P2 zRJkg(O1f80JP%%}MnshN9O>x?)?vqSHJT(fg*!gStPXc4F=>#iun3vW5rLUAU%>FeJ=}%maADnl(Qd*Hys&5! zCUuV%KST<4pscEZ#mopPO__mr<8b-x30%m`2dj(=11~gbI8KF-a2;ATPbl|jCwJg? zVdk=CR6O35TI(cmiUz)vv?>wTuqm!@-wrq2z;41%@zx$Uc4&)8y-sZIl$Wr$m(gf~ z#pWI;PDoWKU-euJVNKL)5mvV?2KMiXCULalF{wJGG-*nA@@yLWil{|H{7BF%XOo7I znun858W(@XufP{fCr?N)D_r-0@j38HrQ({p77$WZgkAwEmREt#ffuG9&N1c{=_gM} z@Nqg_$hTM#p$iuu``op_#XdC|nc3{q!;7=C5)y1U7Hta)yD(Ne)(|O{`5btG@KRx( zcr)86RrDm72yqm~TIgBLUa%N~z^}j)Qr*yLNg|UXEEE_c!2bgm`JZ+zmaQF diff --git a/web-app/static/proofImages_light/Exclusion.png b/web-app/static/proofImages_light/Exclusion.png new file mode 100644 index 0000000000000000000000000000000000000000..b082c6dec4679850bd4d2678cd88522a0017a08e GIT binary patch literal 18504 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 BH)H?+ literal 0 HcmV?d00001 diff --git a/web-app/static/proofImages_light/Modus Tollens.png b/web-app/static/proofImages_light/Modus Tollens.png index a01cf5820dce161a65d7acc08974f64715d41c11..161c0e06c8f7da934c6ec5e41aeb1f8d491c9cd5 100644 GIT binary patch literal 16090 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 diff --git a/web-app/static/proofImages_light/Strengthening the Antecedent.png b/web-app/static/proofImages_light/Strengthening the Antecedent.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a7511c78e9b791d4cd94ecaac918b98e9819dd GIT binary patch literal 23413 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 Oe)LjF6IiQY8UAl~(261e literal 0 HcmV?d00001 diff --git a/web-app/static/proofImages_light/Weakening the Consequent.png b/web-app/static/proofImages_light/Weakening the Consequent.png new file mode 100644 index 0000000000000000000000000000000000000000..f01f8ea1167655b3f6220105c4cf8338e6783feb GIT binary patch literal 24146 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 MidqV_au#9#1)i=Qn*aa+ literal 0 HcmV?d00001 From 0991a8a051d20c4222953ee46dde9ec890e51c15 Mon Sep 17 00:00:00 2001 From: Zachary Bonagura Date: Mon, 9 Dec 2024 22:00:05 -0500 Subject: [PATCH 5/6] Updated dependencies and formatted code Updated dependencies and formatted code --- Cargo.lock | 118 +++++++++++++++++++++------------------------- aris/src/rules.rs | 97 +++++++++++++------------------------ 2 files changed, 88 insertions(+), 127 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bf05fd3f..fc5b6388 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,9 +28,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" [[package]] name = "anymap2" @@ -204,9 +204,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cbindgen" @@ -335,7 +335,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.89", + "syn 2.0.90", ] [[package]] @@ -359,7 +359,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.89", + "syn 2.0.90", ] [[package]] @@ -407,12 +407,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -427,9 +427,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fixedbitset" @@ -515,7 +515,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.90", ] [[package]] @@ -849,9 +849,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -900,10 +900,11 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -921,9 +922,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.166" +version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" [[package]] name = "linux-raw-sys" @@ -1127,7 +1128,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.6.0", + "indexmap 2.7.0", ] [[package]] @@ -1239,7 +1240,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.90", ] [[package]] @@ -1497,15 +1498,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.41" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1605,7 +1606,7 @@ checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.90", ] [[package]] @@ -1744,9 +1745,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.89" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -1775,7 +1776,7 @@ dependencies = [ "fastrand", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys", ] [[package]] @@ -1827,14 +1828,14 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.90", ] [[package]] name = "tokio" -version = "1.41.1" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "pin-project-lite", @@ -1842,9 +1843,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -1879,7 +1880,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.90", ] [[package]] @@ -2053,9 +2054,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -2066,36 +2067,36 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.90", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2103,28 +2104,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -2152,7 +2153,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys", ] [[package]] @@ -2161,15 +2162,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-sys" version = "0.59.0" @@ -2245,9 +2237,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "xml-rs" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af310deaae937e48a26602b730250b4949e125f468f11e6990be3e5304ddd96f" +checksum = "ea8b391c9a790b496184c29f7f93b9ed5b16abb306c05415b68bcc16e4d06432" [[package]] name = "yew" @@ -2320,5 +2312,5 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.90", ] diff --git a/aris/src/rules.rs b/aris/src/rules.rs index 1b7c65f3..44c6734b 100644 --- a/aris/src/rules.rs +++ b/aris/src/rules.rs @@ -126,7 +126,6 @@ pub enum ConditionalInference { WeakenConsequent, ConIntroNegation, ConElimNegation, - } #[allow(missing_docs)] @@ -322,7 +321,7 @@ pub mod RuleM { [BiconIntroNegation, "BICON_INTRO_NEGATION", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalInference::BiconIntroNegation)))))))], [BiconElim, "BICON_ELIM", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalInference::BiconElim)))))))], [BiconElimNegation, "BICON_ELIM_NEGATION", (SharedChecks(Inr(Inr(Inr(Inr(Inl(BiconditionalInference::BiconElimNegation)))))))], - + [QuantifierInference, "QUANTIFIER_INFERENCE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierInference::QuantInference))))))))], [Association, "ASSOCIATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inl(BooleanEquivalence::Association)))))))))], @@ -368,7 +367,7 @@ pub mod RuleM { [AristoteleanSquare, "ARISTOTELEAN_SQUARE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::AristoteleanSquare))))))))))))], [QuantifierDistribution, "QUANTIFIER_DISTRIBUTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::QuantifierDistribution))))))))))))], [PrenexLaws, "PRENEX_LAWS", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(QuantifierEquivalence::PrenexLaws))))))))))))], - + [Reiteration, "REITERATION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(Special::Reiteration)))))))))))))], [Resolution, "RESOLUTION", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(Special::Resolution)))))))))))))], [TruthFunctionalConsequence, "TRUTHFUNCTIONAL_CONSEQUENCE", (SharedChecks(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inr(Inl(Special::TruthFunctionalConsequence)))))))))))))], @@ -1100,8 +1099,8 @@ impl RuleT for BooleanInference { Some(0) } fn check(self, proof: &P, conclusion: Expr, deps: Vec>, sdeps: Vec) -> Result<(), ProofCheckError, P::SubproofReference>> { - use ProofCheckError::*; use BooleanInference::*; + use ProofCheckError::*; assert!(sdeps.is_empty()); match self { @@ -1216,7 +1215,7 @@ impl RuleT for ConditionalInference { StrengthenAntecedent => "Strengthening the Antecedent", WeakenConsequent => "Weakening the Consequent", ConIntroNegation => "Conditional Introduction Negation", - ConElimNegation => "Conditional Elimination Negation" + ConElimNegation => "Conditional Elimination Negation", } .into() } @@ -1235,8 +1234,8 @@ impl RuleT for ConditionalInference { Some(0) } fn check(self, proof: &P, conclusion: Expr, deps: Vec>, sdeps: Vec) -> Result<(), ProofCheckError, P::SubproofReference>> { - use ProofCheckError::*; use ConditionalInference::*; + use ProofCheckError::*; assert!(sdeps.is_empty()); match self { @@ -1461,7 +1460,7 @@ impl RuleT for ConditionalInference { } ConIntroNegation => { let premise = proof.lookup_expr_or_die(&deps[0])?; - + if let Expr::Impl { ref left, ref right } = conclusion { // Case 1: Premise: ~P, Conclusion: P -> Q if let Expr::Not { ref operand } = premise { @@ -1469,18 +1468,16 @@ impl RuleT for ConditionalInference { return Ok(()); } } - + // Case 2: Premise: Q, Conclusion: P -> Q if premise == **right && !matches!(**left, Expr::Not { .. }) { return Ok(()); } } - - Err(ProofCheckError::Other( - "Conclusion does not follow from the Conditional Introduction Negation rule.".to_string(), - )) + + Err(ProofCheckError::Other("Conclusion does not follow from the Conditional Introduction Negation rule.".to_string())) } - + ConElimNegation => { let premise = proof.lookup_expr_or_die(&deps[0])?; @@ -1507,7 +1504,7 @@ impl RuleT for ConditionalInference { impl RuleT for BiconditionalInference { fn get_name(&self) -> String { use BiconditionalInference::*; - match self { + match self { BiconIntro => "Biconditional Introduction", BiconIntroNegation => "Biconditional Introduction Negation", BiconElim => "Biconditional Elimination", @@ -1536,7 +1533,7 @@ impl RuleT for BiconditionalInference { BiconIntro => { let prem1 = proof.lookup_expr_or_die(&deps[0])?; let prem2 = proof.lookup_expr_or_die(&deps[1])?; - + either_order( &prem1, &prem2, @@ -1549,78 +1546,52 @@ impl RuleT for BiconditionalInference { } } // Case 2: Both premises are negations (~P and ~Q) - ( - Expr::Not { operand: ref left }, - Expr::Not { operand: ref right }, - ) => { - if conclusion == Expr::assoc(Op::Bicon, &[*left.clone(), *right.clone()]) - || conclusion - == Expr::assoc( - Op::Bicon, - &[Expr::Not { operand: left.clone() }, Expr::Not { operand: right.clone() }], - ) - { + (Expr::Not { operand: ref left }, Expr::Not { operand: ref right }) => { + if conclusion == Expr::assoc(Op::Bicon, &[*left.clone(), *right.clone()]) || conclusion == Expr::assoc(Op::Bicon, &[Expr::Not { operand: left.clone() }, Expr::Not { operand: right.clone() }]) { return AnyOrderResult::Ok; } } _ => {} } - + AnyOrderResult::Err(DoesNotOccur(conclusion.clone(), Expr::assoc_place_holder(Op::Bicon))) }, || DepDoesNotExist(Expr::assoc_place_holder(Op::Bicon), true), ) - }, + } BiconIntroNegation => { let prem1 = proof.lookup_expr_or_die(&deps[0])?; let prem2 = proof.lookup_expr_or_die(&deps[1])?; - + either_order( &prem1, &prem2, |i, j| { match (i, j) { // Case 1: Premises: ~P and Q, Conclusion: ~(P <-> Q) - ( - Expr::Not { operand: ref left }, - Expr::Var { name: ref right }, - ) => { - if conclusion - == (Expr::Not { - operand: Box::new(Expr::assoc(Op::Bicon, &[*left.clone(), Expr::var(right)])), - }) - { + (Expr::Not { operand: ref left }, Expr::Var { name: ref right }) => { + if conclusion == (Expr::Not { operand: Box::new(Expr::assoc(Op::Bicon, &[*left.clone(), Expr::var(right)])) }) { return AnyOrderResult::Ok; } } // Case 2: Premises are P and ~Q, Conclusion: ~(P <-> Q) - ( - Expr::Var { name: ref left }, - Expr::Not { operand: ref right }, - ) => { - if conclusion - == (Expr::Not { - operand: Box::new(Expr::assoc(Op::Bicon, &[Expr::var(left), *right.clone()])), - }) - { + (Expr::Var { name: ref left }, Expr::Not { operand: ref right }) => { + if conclusion == (Expr::Not { operand: Box::new(Expr::assoc(Op::Bicon, &[Expr::var(left), *right.clone()])) }) { return AnyOrderResult::Ok; } } _ => {} } - - AnyOrderResult::Err(DoesNotOccur( - conclusion.clone(), - Expr::not_place_holder(), - )) + + AnyOrderResult::Err(DoesNotOccur(conclusion.clone(), Expr::not_place_holder())) }, || DepDoesNotExist(Expr::not_place_holder(), true), ) - }, + } BiconElim => { let prem1 = proof.lookup_expr_or_die(&deps[0])?; let prem2 = proof.lookup_expr_or_die(&deps[1])?; - + either_order( &prem1, &prem2, @@ -1629,11 +1600,9 @@ impl RuleT for BiconditionalInference { if *op == Op::Bicon && exprs.len() == 2 { let left = &exprs[0]; let right = &exprs[1]; - + if let Expr::Not { ref operand } = j { - if **operand == *left && conclusion == (Expr::Not { operand: Box::new(right.clone()) }) { - return AnyOrderResult::Ok; - } else if **operand == *right && conclusion == (Expr::Not { operand: Box::new(left.clone()) }) { + if (**operand == *left && conclusion == Expr::Not { operand: Box::new(right.clone()) }) || (**operand == *right && conclusion == Expr::Not { operand: Box::new(left.clone()) }) { return AnyOrderResult::Ok; } else { return AnyOrderResult::Err(DoesNotOccur(j.clone(), conclusion.clone())); @@ -1645,11 +1614,11 @@ impl RuleT for BiconditionalInference { }, || DepDoesNotExist(Expr::assoc_place_holder(Op::Bicon), true), ) - }, + } BiconElimNegation => { let prem1 = proof.lookup_expr_or_die(&deps[0])?; let prem2 = proof.lookup_expr_or_die(&deps[1])?; - + either_order( &prem1, &prem2, @@ -1659,7 +1628,7 @@ impl RuleT for BiconditionalInference { if *op == Op::Bicon && exprs.len() == 2 { let left = &exprs[0]; let right = &exprs[1]; - + if *left == *j { if conclusion == (Expr::Not { operand: Box::new(right.clone()) }) { return AnyOrderResult::Ok; @@ -1667,7 +1636,7 @@ impl RuleT for BiconditionalInference { return AnyOrderResult::Err(DoesNotOccur(conclusion.clone(), right.clone())); } } - + if *right == *j { if conclusion == (Expr::Not { operand: Box::new(left.clone()) }) { return AnyOrderResult::Ok; @@ -1765,12 +1734,12 @@ where for premise_expr in premise_possibilities.iter() { for conclusion_expr in conclusion_possibilities.iter() { if premise_expr == conclusion_expr { - return Ok(()); + return Ok(()); } } } - Err(ProofCheckError::Other(format!("None of the possible normalized premises match the conclusion."))) + Err(ProofCheckError::Other("None of the possible normalized premises match the conclusion.".to_string())) } fn check_by_rewrite_rule_confl(p: &P, deps: Vec>, conclusion: Expr, commutative: bool, rule: &RewriteRule, restriction: &str) -> Result<(), ProofCheckError, P::SubproofReference>> { From 72aef566306a1984a82afa8a211e060e52f8ddb9 Mon Sep 17 00:00:00 2001 From: Zachary Bonagura Date: Mon, 9 Dec 2024 23:05:19 -0500 Subject: [PATCH 6/6] Reduced strength for complement Reduced strength for complement so conclusion requires terms that are not identified as complement --- aris/src/expr.rs | 24 +++++++++++++++++------- aris/src/proofs/proof_tests.rs | 5 ++++- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/aris/src/expr.rs b/aris/src/expr.rs index 40fddb55..20bc162f 100644 --- a/aris/src/expr.rs +++ b/aris/src/expr.rs @@ -1143,26 +1143,29 @@ impl Expr { } /// Collects unique expressions and identifies complements globally + /// Removes complements from the unique expressions set when found fn collect_unique_exprs_complement(expr: &Expr, op: Op, unique_exprs: &mut HashSet) -> bool { match expr { - Expr::Assoc { op: expr_op, exprs } if *expr_op == op => exprs.iter().any(|sub_expr| Expr::collect_unique_exprs_complement(sub_expr, op, unique_exprs)), + Expr::Assoc { op: expr_op, exprs } if *expr_op == op => exprs.iter().fold(false, |found_complement, sub_expr| Expr::collect_unique_exprs_complement(sub_expr, op, unique_exprs) || found_complement), Expr::Not { operand } => { - // Check if the negation of the operand already exists in the set if let Expr::Quant { kind: QuantKind::Forall, .. } = **operand { if operand.is_universal_tautology() { return true; } } if unique_exprs.contains(&**operand) { - true // Complement found + unique_exprs.remove(&**operand); + true } else { unique_exprs.insert(expr.clone()); false } } _ => { - if unique_exprs.contains(&Expr::Not { operand: Box::new(expr.clone()) }) { - true // Complement found + let negated = Expr::Not { operand: Box::new(expr.clone()) }; + if unique_exprs.contains(&negated) { + unique_exprs.remove(&negated); + true } else { unique_exprs.insert(expr.clone()); false @@ -1174,6 +1177,7 @@ impl Expr { /// Reduce an expression over complement, that is: /// A & ~A -> ⊥ /// A | ~A -> ⊤ + /// Removes complements and preserves non-complement terms pub fn normalize_complement(self) -> Expr { match self { Expr::Assoc { op, exprs } if op == Op::And || op == Op::Or => { @@ -1182,13 +1186,19 @@ impl Expr { if has_complement { match op { - Op::And => Expr::Contra, + Op::And => { + let remaining_terms: Vec = unique_exprs.into_iter().collect(); + if remaining_terms.is_empty() { + Expr::Contra + } else { + Expr::Assoc { op, exprs: vec![Expr::Contra].into_iter().chain(remaining_terms).collect() } + } + } Op::Or => Expr::Taut, _ => unreachable!(), } } else { let unique_exprs: Vec = unique_exprs.into_iter().map(|e| e.normalize_complement()).collect(); - if unique_exprs.len() == 1 { unique_exprs.into_iter().next().unwrap() } else { diff --git a/aris/src/proofs/proof_tests.rs b/aris/src/proofs/proof_tests.rs index 0842d697..8532d448 100644 --- a/aris/src/proofs/proof_tests.rs +++ b/aris/src/proofs/proof_tests.rs @@ -812,6 +812,7 @@ pub fn test_complement() -> (P, Vec>, Vec>) { let r5 = prf.add_premise(p("~(forall A A) | (forall B B)")); let r6 = prf.add_premise(p("~(forall A A) & (forall B B)")); let r19 = prf.add_premise(p("(A -> A) & (B <-> B) & (C <-> ~C) & (~D <-> D)")); + let r32 = prf.add_premise(p("A & ~A & P")); let r7 = prf.add_step(Justification(p("_|_"), RuleM::Complement, vec![i(r1.clone())], vec![])); let r8 = prf.add_step(Justification(p("^|^"), RuleM::Complement, vec![i(r1)], vec![])); @@ -825,6 +826,8 @@ pub fn test_complement() -> (P, Vec>, Vec>) { let r16 = prf.add_step(Justification(p("^|^"), RuleM::Complement, vec![i(r5)], vec![])); let r17 = prf.add_step(Justification(p("_|_"), RuleM::Complement, vec![i(r6.clone())], vec![])); let r18 = prf.add_step(Justification(p("^|^"), RuleM::Complement, vec![i(r6)], vec![])); + let r33 = prf.add_step(Justification(p("_|_ & P"), RuleM::Complement, vec![i(r32.clone())], vec![])); + let r34 = prf.add_step(Justification(p("_|_ & P & X & F"), RuleM::Complement, vec![i(r32)], vec![])); let r20 = prf.add_step(Justification(p("^|^ & ^|^ & _|_ & _|_"), RuleM::ConditionalComplement, vec![i(r19.clone())], vec![])); let r21 = prf.add_step(Justification(p("^|^ & (B <-> B) & (C <-> ~C) & (~D <-> D)"), RuleM::ConditionalComplement, vec![i(r19.clone())], vec![])); @@ -840,7 +843,7 @@ pub fn test_complement() -> (P, Vec>, Vec>) { let r30 = prf.add_step(Justification(p("(A -> A) & (B <-> B) & (C <-> ~C) & _|_"), RuleM::BiconditionalComplement, vec![i(r19.clone())], vec![])); let r31 = prf.add_step(Justification(p("_|_ & _|_ & ^|^ & ^|^"), RuleM::BiconditionalComplement, vec![i(r19)], vec![])); - (prf, vec![i(r7), i(r9), i(r12), i(r14), i(r16), i(r17), i(r21), i(r28), i(r29), i(r30)], vec![i(r8), i(r10), i(r11), i(r13), i(r15), i(r18), i(r20), i(r22), i(r23), i(r24), i(r25), i(r26), i(r27), i(r31)]) + (prf, vec![i(r7), i(r9), i(r12), i(r14), i(r16), i(r17), i(r21), i(r28), i(r29), i(r30), i(r33)], vec![i(r8), i(r10), i(r11), i(r13), i(r15), i(r18), i(r20), i(r22), i(r23), i(r24), i(r25), i(r26), i(r27), i(r31), i(r34)]) } pub fn test_identity() -> (P, Vec>, Vec>) {