| Crates.io | legalis-verifier |
| lib.rs | legalis-verifier |
| version | 0.1.3 |
| created_at | 2026-01-05 05:20:32.971443+00 |
| updated_at | 2026-01-21 03:44:56.725134+00 |
| description | Formal verification for Legalis-RS legal statutes |
| homepage | https://github.com/cool-japan/legalis |
| repository | https://github.com/cool-japan/legalis |
| max_upload_size | |
| id | 2023135 |
| size | 1,385,269 |
Formal verification for Legalis-RS legal statutes.
This crate provides static analysis and verification tools for detecting logical inconsistencies, circular references, and constitutional conflicts in legal statutes. It serves as a "compiler" for laws, catching bugs before they become enacted legislation.
use legalis_verifier::{StatuteVerifier, verify_integrity};
use legalis_core::{Statute, Effect, EffectType};
let statutes = vec![
Statute::new("statute-1", "First Law", Effect::new(EffectType::Grant, "Permission")),
Statute::new("statute-2", "Second Law", Effect::new(EffectType::Revoke, "Permission")),
];
let verifier = StatuteVerifier::new();
let result = verifier.verify(&statutes);
if result.passed {
println!("All statutes verified successfully!");
} else {
for error in result.errors {
eprintln!("Error: {}", error);
}
}
// Warnings and suggestions
for warning in result.warnings {
println!("Warning: {}", warning);
}
let result = verify_integrity(&statutes)?;
println!("Passed: {}", result.passed);
Detects when statutes form dependency cycles:
Statute A references Statute B
Statute B references Statute A
Identifies statutes with contradictory conditions that can never be satisfied:
WHEN AGE >= 18 AND AGE < 18 // Always false
Checks against configurable constitutional principles:
let principles = vec![
ConstitutionalPrinciple {
id: "equality".to_string(),
name: "Equal Protection".to_string(),
description: "All persons are equal under the law".to_string(),
check: PrincipleCheck::NoDiscrimination,
},
];
let verifier = StatuteVerifier::with_principles(principles);
Finds statutes with conflicting effects on the same conditions.
pub enum VerificationError {
CircularReference(String),
DeadStatute { statute_id: String },
ConstitutionalConflict { statute_id: String, principle: String },
LogicalContradiction(String),
Ambiguity(String),
}
pub struct VerificationResult {
pub passed: bool,
pub errors: Vec<VerificationError>,
pub warnings: Vec<String>,
pub suggestions: Vec<String>,
}
impl VerificationResult {
pub fn pass() -> Self;
pub fn fail(errors: Vec<VerificationError>) -> Self;
pub fn with_warning(self, warning: impl Into<String>) -> Self;
pub fn with_suggestion(self, suggestion: impl Into<String>) -> Self;
pub fn merge(&mut self, other: VerificationResult);
}
pub struct ConstitutionalPrinciple {
pub id: String,
pub name: String,
pub description: String,
pub check: PrincipleCheck,
}
pub enum PrincipleCheck {
NoDiscrimination, // No discrimination based on protected attributes
RequiresProcedure, // Requires procedural safeguards
NoRetroactivity, // Must not be retroactive
Custom(String), // Custom check with description
}
The verifier supports optional SMT solver (OxiZ - Pure Rust) integration for rigorous formal verification. Enable with the smt-solver feature:
[dependencies]
legalis-verifier = { version = "0.2", features = ["smt-solver"] }
When smt-solver is enabled:
#[cfg(feature = "smt-solver")]
{
use legalis_verifier::{create_z3_context, SmtVerifier};
use legalis_core::{Condition, ComparisonOp};
let ctx = create_z3_context();
let mut verifier = SmtVerifier::new(&ctx);
let cond1 = Condition::Age {
operator: ComparisonOp::GreaterOrEqual,
value: 21,
};
let cond2 = Condition::Age {
operator: ComparisonOp::GreaterOrEqual,
value: 18,
};
// Check implication: Age >= 21 implies Age >= 18
assert!(verifier.implies(&cond1, &cond2)?);
// Get a model (counterexample)
if let Some(model) = verifier.get_model(&cond1)? {
println!("Example: age = {}", model["age"]);
}
}
The verifier automatically falls back to heuristic checking if:
smt-solver feature is not enabledThis ensures verification always works, with optional enhanced precision.
The verifier includes comprehensive complexity metrics for statutes:
use legalis_verifier::{analyze_complexity, complexity_report};
let metrics = analyze_complexity(&statute);
println!("Complexity Level: {}", metrics.complexity_level);
println!("Score: {}/100", metrics.complexity_score);
// Generate report for multiple statutes
let report = complexity_report(&statutes);
println!("{}", report);
MIT OR Apache-2.0