| Crates.io | lean-agentic |
| lib.rs | lean-agentic |
| version | 0.1.0 |
| created_at | 2025-10-25 14:55:49.609391+00 |
| updated_at | 2025-10-25 14:55:49.609391+00 |
| description | Core library for Lean-Agentic: hash-consed dependent types with 150x faster equality |
| homepage | https://ruv.io |
| repository | https://github.com/agenticsorg/lean-agentic |
| max_upload_size | |
| id | 1900309 |
| size | 85,497 |
Hash-consed dependent types with 150x faster term equality
Developed by: ruv.io | github.com/ruvnet
lean-agentic is the core library for formally verified agentic programming, providing:
Perfect for building:
cargo add lean-agentic
Or add to Cargo.toml:
[dependencies]
lean-agentic = "0.1.0"
use lean_agentic::{Arena, SymbolTable};
let mut arena = Arena::new();
// Create identical terms - they share memory!
let var1 = arena.mk_var(42);
let var2 = arena.mk_var(42);
assert_eq!(var1, var2); // Same TermId!
// Equality: O(1) pointer comparison, ~0.3ns
use lean_agentic::{Arena, SymbolTable};
use lean_agentic::level::LevelArena;
use lean_agentic::term::{Binder, BinderInfo};
let mut arena = Arena::new();
let mut symbols = SymbolTable::new();
let mut levels = LevelArena::new();
// Create Type universe
let type_term = arena.mk_sort(levels.zero());
// Identity function: Ξ»x:Type. x
let identity = arena.mk_lam(
Binder {
name: symbols.intern("x"),
ty: type_term,
implicit: false,
info: BinderInfo::Default,
},
arena.mk_var(0)
);
println!("Ξ»x:Type. x = {:?}", identity);
use lean_agentic::{Arena, Environment, Typechecker};
use lean_agentic::level::LevelArena;
let mut arena = Arena::new();
let mut env = Environment::new();
let mut levels = LevelArena::new();
let mut checker = Typechecker::new();
let term = arena.mk_var(0);
let ty = checker.infer(&term, &arena, &env, &mut levels)?;
println!("Inferred type: {:?}", ty);
All identical terms share memory:
let x1 = arena.mk_var(0); // Allocates
let x2 = arena.mk_var(0); // Reuses!
let x3 = arena.mk_var(0); // Reuses!
// All same TermId, O(1) equality
Benchmarks:
Zero-copy sharing with bump allocators:
// All terms in contiguous memory
let term1 = arena.mk_var(0);
let term2 = arena.mk_app(term1, term1);
let term3 = arena.mk_lam(binder, term2);
// No cloning - just u32 TermId handles!
Full Lean4 type theory:
// Universe levels
let level_0 = levels.zero();
let level_1 = levels.succ(level_0);
// Type universes
let type_0 = arena.mk_sort(level_0); // Type
let type_1 = arena.mk_sort(level_1); // Type 1
// Dependent Ξ types: β(x : A), B
let pi = arena.mk_pi(binder, body);
| Method | Description | Example |
|---|---|---|
mk_var(index) |
Variable | x, y |
mk_sort(level) |
Type universe | Type |
mk_const(name, levels) |
Constant | Nat |
mk_app(func, arg) |
Application | f x |
mk_lam(binder, body) |
Lambda | Ξ»x. e |
mk_pi(binder, body) |
Dependent Ξ | βx:A. B |
let mut checker = Typechecker::new();
// Infer type
let ty = checker.infer(&term, &arena, &env, &mut levels)?;
// Check against expected type
checker.check(&term, &expected, &arena, &env, &mut levels)?;
// Definitional equality
let eq = checker.is_def_eq(&t1, &t2, &arena, &env)?;
| Operation | Latency | Speedup |
|---|---|---|
| Hash-consed equality | 0.3ns | 150x |
| Arena allocation | 1.9ns | 5.25x |
| Term construction | <10ns | - |
| Type inference | <1Β΅s | - |
use lean_agentic::{Arena, Typechecker};
struct Prover {
arena: Arena,
checker: Typechecker,
}
impl Prover {
fn prove(&mut self, theorem: TermId) -> Result<TermId> {
// Proof search using lean-agentic
todo!()
}
}
struct VerifiedCompiler {
arena: Arena,
}
impl VerifiedCompiler {
fn compile_with_proof(&mut self, src: TermId) -> (ByteCode, TermId) {
// Returns (bytecode, proof of correctness)
todo!()
}
}
struct SafeAgent {
arena: Arena,
policy: TermId, // Safety policy as type
}
impl SafeAgent {
fn act(&mut self, action: TermId) -> Result<(Action, TermId)> {
// Returns (action, proof it satisfies policy)
todo!()
}
}
See examples/ for complete applications:
# Clone
git clone https://github.com/agenticsorg/lean-agentic
cd lean-agentic/lean-agentic
# Build
cargo build --release
# Test
cargo test
# Docs
cargo doc --open
Licensed under Apache-2.0 - see LICENSE
Created by: ruv.io Maintained by: github.com/ruvnet Powered by: Flow Nexus, AgentDB, Claude Flow
Based on:
leanr - Full language implementationleanr-wasm - Browser bindingsBuilt with formal verification Β· Powered by hash-consing Β· Developed by ruv.io