wifi-densepose/vendor/ruvector/crates/ruvector-verified/src/invariants.rs

153 lines
4.4 KiB
Rust

//! Pre-built invariant library.
//!
//! Registers RuVector's core type declarations into a lean-agentic
//! proof environment so that verification functions can reference them.
/// Well-known symbol names used throughout the verification layer.
pub mod symbols {
pub const NAT: &str = "Nat";
pub const RUVEC: &str = "RuVec";
pub const EQ: &str = "Eq";
pub const EQ_REFL: &str = "Eq.refl";
pub const DISTANCE_METRIC: &str = "DistanceMetric";
pub const L2: &str = "DistanceMetric.L2";
pub const COSINE: &str = "DistanceMetric.Cosine";
pub const DOT: &str = "DistanceMetric.Dot";
pub const HNSW_INDEX: &str = "HnswIndex";
pub const INSERT_RESULT: &str = "InsertResult";
pub const PIPELINE_STAGE: &str = "PipelineStage";
pub const TYPE_UNIVERSE: &str = "Type";
}
/// Pre-registered type declarations available after calling `register_builtins`.
///
/// These mirror the RuVector domain:
/// - `Nat` : Type (natural numbers for dimensions)
/// - `RuVec` : Nat -> Type (dimension-indexed vectors)
/// - `Eq` : {A : Type} -> A -> A -> Type (propositional equality)
/// - `Eq.refl` : {A : Type} -> (a : A) -> Eq a a (reflexivity proof)
/// - `DistanceMetric` : Type (L2, Cosine, Dot)
/// - `HnswIndex` : Nat -> DistanceMetric -> Type
/// - `InsertResult` : Type
/// - `PipelineStage` : Type -> Type -> Type
pub fn builtin_declarations() -> Vec<BuiltinDecl> {
vec![
BuiltinDecl {
name: symbols::NAT,
arity: 0,
doc: "Natural numbers",
},
BuiltinDecl {
name: symbols::RUVEC,
arity: 1,
doc: "Dimension-indexed vector",
},
BuiltinDecl {
name: symbols::EQ,
arity: 2,
doc: "Propositional equality",
},
BuiltinDecl {
name: symbols::EQ_REFL,
arity: 1,
doc: "Reflexivity proof",
},
BuiltinDecl {
name: symbols::DISTANCE_METRIC,
arity: 0,
doc: "Distance metric enum",
},
BuiltinDecl {
name: symbols::L2,
arity: 0,
doc: "L2 Euclidean distance",
},
BuiltinDecl {
name: symbols::COSINE,
arity: 0,
doc: "Cosine distance",
},
BuiltinDecl {
name: symbols::DOT,
arity: 0,
doc: "Dot product distance",
},
BuiltinDecl {
name: symbols::HNSW_INDEX,
arity: 2,
doc: "HNSW index type",
},
BuiltinDecl {
name: symbols::INSERT_RESULT,
arity: 0,
doc: "Insert result type",
},
BuiltinDecl {
name: symbols::PIPELINE_STAGE,
arity: 2,
doc: "Typed pipeline stage",
},
]
}
/// A built-in type declaration to register in the proof environment.
#[derive(Debug, Clone)]
pub struct BuiltinDecl {
/// Symbol name.
pub name: &'static str,
/// Number of type parameters.
pub arity: u32,
/// Documentation.
pub doc: &'static str,
}
/// Register all built-in RuVector types into the proof environment's symbol table.
///
/// This is called once during `ProofEnvironment::new()` to make domain types
/// available for proof construction.
pub fn register_builtin_symbols(symbols: &mut Vec<String>) {
for decl in builtin_declarations() {
if !symbols.contains(&decl.name.to_string()) {
symbols.push(decl.name.to_string());
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn builtin_declarations_complete() {
let decls = builtin_declarations();
assert!(
decls.len() >= 11,
"expected at least 11 builtins, got {}",
decls.len()
);
}
#[test]
fn all_builtins_have_names() {
for decl in builtin_declarations() {
assert!(!decl.name.is_empty());
assert!(!decl.doc.is_empty());
}
}
#[test]
fn register_symbols_no_duplicates() {
let mut syms = vec!["Nat".to_string()]; // pre-existing
register_builtin_symbols(&mut syms);
let nat_count = syms.iter().filter(|s| *s == "Nat").count();
assert_eq!(nat_count, 1, "Nat should not be duplicated");
}
#[test]
fn symbol_constants_valid() {
assert_eq!(symbols::NAT, "Nat");
assert_eq!(symbols::RUVEC, "RuVec");
assert_eq!(symbols::EQ_REFL, "Eq.refl");
}
}