From 1ab7d7bf95f9a93e7dbe0431c60cc77d9fd8c076 Mon Sep 17 00:00:00 2001 From: Albin Chaboissier Date: Mon, 9 Feb 2026 18:08:13 +0100 Subject: [PATCH] Ugly and print, and simplified body prover depth --- src/main.rs | 4 ++-- src/prover.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++-- src/tracing.rs | 0 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 src/tracing.rs diff --git a/src/main.rs b/src/main.rs index 9b537fa..d120503 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,8 +20,8 @@ fn main() " .into(); - let prop: Body = "integer(s(X))".into(); - //let prop: Body = "mult(X, s(s(s(zero))), s(s(s(s(s(s(s(s(s(zero))))))))))".into(); + //let prop: Body = "integer(s(X))".into(); + let prop: Body = "mult(X, s(s(s(zero))), s(s(s(s(s(s(s(s(s(zero))))))))))".into(); for c in module.prove(&prop) { println!("true:"); diff --git a/src/prover.rs b/src/prover.rs index 9208a3d..fd52146 100644 --- a/src/prover.rs +++ b/src/prover.rs @@ -3,14 +3,15 @@ pub mod tracing; pub mod unification; use std::cell::Cell; +use std::fmt::Write; use std::rc::Rc; use litemap::LiteMap; -use log::info; use owo_colors::OwoColorize; +use owo_colors::Style; use owo_colors::colors::Green; use owo_colors::colors::Red; -use owo_colors::colors::css::Gray; +use owo_colors::colors::Yellow; use crate::ast::Body; use crate::ast::Clause; @@ -79,6 +80,7 @@ pub struct AndProver<'a, T: Tracer> bodies: Vec, constraints: Constraints, tracer: T, + current_tracer: Option, global_counter: GlobalCounter, sub_proofs: Vec<(Counter, BodyProver<'a, T>)>, @@ -111,6 +113,16 @@ impl<'a, T: Tracer + 'a> BodyProver<'a, T> constraints.clone(), tracer, )), + + // Shortcut And & Or prover if it contains only one element to simplify proofs + Body::And(items) | Body::Or(items) if items.len() == 1 => Box::new(BodyProver::new( + module, + global_counter, + items[0].clone(), + constraints.clone(), + tracer, + )), + Body::And(items) => Box::new(AndProver::new( module, global_counter, @@ -182,6 +194,7 @@ impl AndProver<'_, T> AndProver { tracer: tracer.begin_proof(ProofType::And), + current_tracer: None, module, sub_proofs: vec![( global_counter.snapshot(), @@ -316,6 +329,35 @@ impl<'a, T: Tracer + 'a> Iterator for AndProver<'a, T> } else { + // Pretty logging + self.current_tracer = Some(self.tracer.begin_proof(ProofType::And)); + self.current_tracer.as_ref().unwrap().print_step(format!( + "And. {} {} {} :", + "Proved".fg::(), + "Proving".fg::(), + "Left".fg::() + )); + let mut output = String::new(); + for (i, x) in self.bodies.iter().enumerate() + { + let mut color = Style::new(); + if i == self.sub_proofs.len() - 1 + { + color = color.fg::(); + } + else if i < self.sub_proofs.len() - 1 + { + color = color.fg::(); + } + else + { + color = color.fg::(); + } + let _ = output.write_str(&format!("{}, ", x.style(color))); + } + self.current_tracer.as_ref().unwrap().print_step(output); + + // End pretty logging self.sub_proofs.push((current_proof_snap, current_proof)); self.sub_proofs.push(( self.global_counter.snapshot(), diff --git a/src/tracing.rs b/src/tracing.rs new file mode 100644 index 0000000..e69de29