tensorlogic_ir/lib.rs
1//! # TensorLogic IR
2//!
3//! **Engine-agnostic Abstract Syntax Tree & Intermediate Representation for TensorLogic**
4//!
5//! **Version**: 0.1.0-beta.1 | **Status**: Production Ready
6//!
7//! This crate provides the core data structures and operations for representing logic-as-tensor
8//! computations in the TensorLogic framework. It serves as the foundational layer that all other
9//! TensorLogic components build upon.
10//!
11//! ## Overview
12//!
13//! TensorLogic IR enables the compilation of logical rules (predicates, quantifiers, implications)
14//! into **tensor equations (einsum graphs)** with a minimal DSL + IR. This approach allows for:
15//!
16//! - Neural, symbolic, and probabilistic models within a unified tensor computation framework
17//! - Engine-agnostic representation that can be executed on different backends
18//! - Static analysis and optimization of logical expressions before execution
19//! - Type-safe construction and validation of logical expressions
20//!
21//! ## Core Components
22//!
23//! ### Terms ([`Term`])
24//! Variables and constants that appear in logical expressions:
25//! - **Variables**: Free or bound variables (e.g., `x`, `y`, `Person`)
26//! - **Constants**: Concrete values (e.g., `alice`, `bob`, `42`)
27//! - **Typed terms**: Terms with explicit type annotations
28//!
29//! ### Logical Expressions ([`TLExpr`])
30//! The DSL for expressing logical rules:
31//! - **Predicates**: Atomic propositions like `Person(x)` or `knows(alice, bob)`
32//! - **Logical connectives**: AND (∧), OR (∨), NOT (¬), Implication (→)
33//! - **Quantifiers**: Existential (∃) and Universal (∀) with domain constraints
34//! - **Arithmetic**: Addition, subtraction, multiplication, division
35//! - **Comparisons**: Equality, less than, greater than, etc.
36//! - **Control flow**: If-then-else conditionals
37//!
38//! ### Tensor Computation Graphs ([`EinsumGraph`])
39//! The compiled IR representing tensor operations:
40//! - **Tensors**: Named tensor values with indices
41//! - **Nodes**: Operations on tensors (einsum, element-wise, reductions)
42//! - **Outputs**: Designated output tensors
43//! - **Validation**: Comprehensive graph validation and error checking
44//!
45//! ## Features
46//!
47//! ### Type System
48//! - Static type checking with [`PredicateSignature`] and [`TypeAnnotation`]
49//! - **Parametric types** with type constructors (`List<T>`, `Option<T>`, `Tuple<A,B>`, etc.)
50//! - Type unification using Robinson's algorithm
51//! - Generalization and instantiation for polymorphic types
52//! - **Effect system** for tracking computational effects (purity, differentiability, stochasticity)
53//! - Effect polymorphism and inference
54//! - **Dependent types** with value-dependent types (e.g., `Vec<n, T>` where n is a runtime value)
55//! - **Linear types** for resource management and safe in-place operations
56//! - **Refinement types** for constraint-based type checking (e.g., `{x: Int | x > 0}`)
57//! - Arity validation ensures consistent predicate usage
58//! - Type inference and compatibility checking
59//!
60//! ### Domain Constraints
61//! - Domain management via [`DomainRegistry`] and [`DomainInfo`]
62//! - Built-in domains: Bool, Int, Real, Nat, Probability
63//! - Custom finite and infinite domains
64//! - Domain validation for quantified variables
65//!
66//! ### Metadata & Provenance
67//! - Source location tracking with [`SourceLocation`] and [`SourceSpan`]
68//! - Provenance information via [`Provenance`] for rule tracking
69//! - Custom metadata support for nodes and expressions
70//!
71//! ### Serialization
72//! - Full serde support for JSON and binary formats
73//! - Versioned serialization with [`VersionedExpr`] and [`VersionedGraph`]
74//! - Backward compatibility checking
75//!
76//! ### Analysis & Utilities
77//! - Free variable analysis
78//! - Predicate extraction and counting
79//! - Graph statistics with [`GraphStats`]
80//! - Expression statistics with [`ExprStats`]
81//! - Pretty printing and DOT export for visualization
82//! - Expression and graph diffing with [`diff_exprs`] and [`diff_graphs`]
83//! - **Profile-guided optimization (PGO)** for runtime-informed optimization decisions
84//!
85//! ## Quick Start
86//!
87//! ### Creating Logical Expressions
88//!
89//! ```rust
90//! use tensorlogic_ir::{TLExpr, Term};
91//!
92//! // Simple predicate: Person(x)
93//! let person = TLExpr::pred("Person", vec![Term::var("x")]);
94//!
95//! // Logical rule: ∀x. Person(x) → Mortal(x)
96//! let mortal = TLExpr::pred("Mortal", vec![Term::var("x")]);
97//! let rule = TLExpr::forall("x", "Entity", TLExpr::imply(person, mortal));
98//!
99//! // Verify no free variables (all bound by quantifier)
100//! assert!(rule.free_vars().is_empty());
101//! ```
102//!
103//! ### Building Computation Graphs
104//!
105//! ```rust
106//! use tensorlogic_ir::{EinsumGraph, EinsumNode};
107//!
108//! let mut graph = EinsumGraph::new();
109//!
110//! // Matrix multiplication: C = A @ B
111//! let a = graph.add_tensor("A");
112//! let b = graph.add_tensor("B");
113//! let c = graph.add_tensor("C");
114//!
115//! graph.add_node(EinsumNode::einsum("ik,kj->ij", vec![a, b], vec![c])).unwrap();
116//! graph.add_output(c).unwrap();
117//!
118//! // Validate the graph
119//! assert!(graph.validate().is_ok());
120//! ```
121//!
122//! ### Domain Management
123//!
124//! ```rust
125//! use tensorlogic_ir::{DomainRegistry, DomainInfo, TLExpr, Term};
126//!
127//! // Create registry with built-in domains
128//! let mut registry = DomainRegistry::with_builtins();
129//!
130//! // Add custom domain
131//! registry.register(DomainInfo::finite("Person", 100)).unwrap();
132//!
133//! // Create and validate expression
134//! let expr = TLExpr::exists("x", "Person", TLExpr::pred("P", vec![Term::var("x")]));
135//! assert!(expr.validate_domains(®istry).is_ok());
136//! ```
137//!
138//! ## Examples
139//!
140//! See the `examples/` directory for comprehensive demonstrations:
141//! - `00_basic_expressions`: Simple predicates and logical connectives
142//! - `01_quantifiers`: Existential and universal quantifiers
143//! - `02_arithmetic`: Arithmetic and comparison operations
144//! - `03_graph_construction`: Building computation graphs
145//! - `05_serialization`: JSON and binary serialization
146//! - `06_visualization`: Pretty printing and DOT export
147//! - `07_parametric_types`: Parametric types, unification, and polymorphic signatures
148//! - `08_effect_system`: Effect tracking, polymorphism, and annotations
149//! - `09_dependent_types`: Dependent types with value-dependent dimensions
150//! - `10_linear_types`: Linear types for resource management
151//! - `11_refinement_types`: Refinement types with predicates
152//! - `12_profile_guided_optimization`: Profile-guided optimization with runtime profiling
153//! - `13_sequent_calculus`: Sequent calculus and proof search
154//! - `14_constraint_logic_programming`: Constraint satisfaction problems
155//! - `15_advanced_graph_algorithms`: Graph analysis (SCC, cycles, critical paths)
156//! - `16_resolution_theorem_proving`: Resolution-based automated theorem proving
157//!
158//! ## Architecture
159//!
160//! The crate is organized into focused modules:
161//! - **term**: Variables, constants, and type annotations
162//! - **expr**: Logical expressions and builders
163//! - **graph**: Tensor computation graphs and nodes
164//! - **domain**: Domain constraints and validation
165//! - **signature**: Type signatures for predicates
166//! - **[`parametric_types`]**: Parametric types, type constructors, and unification
167//! - **[`effect_system`]**: Effect tracking, polymorphism, and annotations
168//! - **[`dependent`]**: Dependent types with value-dependent dimensions
169//! - **[`linear`]**: Linear types for resource management and multiplicity tracking
170//! - **[`refinement`]**: Refinement types with logical predicates
171//! - **metadata**: Provenance and source tracking
172//! - **[`serialization`]**: Versioned JSON/binary formats
173//! - **[`util`]**: Pretty printing and statistics
174//! - **[`diff`]**: Expression and graph comparison
175//! - **graph::pgo**: Profile-guided optimization with runtime profiling
176//! - **error**: Comprehensive error types
177//!
178//! ## Logic-to-Tensor Mapping
179//!
180//! | Logic Operation | Tensor Equivalent | Notes |
181//! |----------------|-------------------|-------|
182//! | `AND(a, b)` | `a * b` | Hadamard product (element-wise) |
183//! | `OR(a, b)` | `max(a, b)` | Or soft variant (configurable) |
184//! | `NOT(a)` | `1 - a` | Complement operation |
185//! | `∃x. P(x)` | `sum(P, axis=x)` | Or `max` for hard quantification |
186//! | `∀x. P(x)` | `NOT(∃x. NOT(P(x)))` | Dual of existential |
187//! | `a → b` | `ReLU(b - a)` | Soft implication |
188//!
189//! ## Performance
190//!
191//! - **Lazy validation**: Operations are validated only when explicitly requested
192//! - **Zero-copy indices**: Graph operations use tensor indices instead of cloning
193//! - **Incremental building**: Graphs can be built step-by-step efficiently
194//! - **Property tests**: 30 randomized tests ensure correctness
195//! - **Benchmarks**: 40+ performance tests measure all operations
196//!
197//! ## See Also
198//!
199//! - **tensorlogic-compiler**: Compiles TLExpr → EinsumGraph
200//! - **tensorlogic-infer**: Execution and autodiff traits
201//! - **tensorlogic-scirs-backend**: SciRS2-powered runtime execution
202//! - **tensorlogic-adapters**: Symbol tables and axis metadata
203
204pub mod clp;
205pub mod dependent;
206pub mod diff;
207mod display;
208mod domain;
209pub mod effect_system;
210mod error;
211mod expr;
212pub mod fuzzing;
213mod graph;
214pub mod linear;
215mod metadata;
216pub mod parametric_types;
217pub mod refinement;
218pub mod resolution;
219pub mod sequent;
220pub mod serialization;
221mod signature;
222mod term;
223pub mod unification;
224pub mod util;
225
226#[cfg(test)]
227mod tests;
228
229pub use dependent::{DependentType, DependentTypeContext, DimConstraint, IndexExpr};
230pub use diff::{diff_exprs, diff_graphs, ExprDiff, GraphDiff, NodeDiff};
231pub use domain::{DomainInfo, DomainRegistry, DomainType};
232pub use effect_system::{
233 infer_operation_effects, ComputationalEffect, Effect, EffectAnnotation, EffectScheme,
234 EffectSet, EffectSubstitution, EffectVar, MemoryEffect, ProbabilisticEffect,
235};
236pub use error::IrError;
237pub use expr::ac_matching::{
238 ac_equivalent, flatten_ac, normalize_ac, ACOperator, ACPattern, Multiset,
239};
240pub use expr::advanced_analysis::{ComplexityMetrics, OperatorCounts, PatternAnalysis};
241pub use expr::advanced_rewriting::{
242 AdvancedRewriteSystem, ConditionalRule, RewriteConfig, RewriteStats, RewriteStrategy,
243 RulePriority,
244};
245pub use expr::confluence::{
246 are_joinable, normalize, ConfluenceChecker, ConfluenceReport, CriticalPair,
247};
248pub use expr::defuzzification::{
249 bisector, centroid, defuzzify, largest_of_maximum, mean_of_maximum, smallest_of_maximum,
250 weighted_average, DefuzzificationMethod, FuzzySet, SingletonFuzzySet,
251};
252pub use expr::distributive_laws::{apply_distributive_laws, DistributiveStrategy};
253pub use expr::ltl_ctl_utilities::{
254 apply_advanced_ltl_equivalences, classify_temporal_formula, compute_temporal_complexity,
255 decompose_safety_liveness, extract_state_predicates, extract_temporal_subformulas,
256 identify_temporal_pattern, is_temporal, is_temporal_nnf, TemporalClass, TemporalComplexity,
257 TemporalPattern,
258};
259pub use expr::modal_axioms::{
260 apply_axiom_k, apply_axiom_t, extract_modal_subformulas, is_modal_free, is_theorem_in_system,
261 modal_depth, normalize_s5, verify_axiom_4, verify_axiom_5, verify_axiom_b, verify_axiom_d,
262 verify_axiom_k, verify_axiom_t, ModalSystem,
263};
264pub use expr::modal_equivalences::apply_modal_equivalences;
265pub use expr::normal_forms::{is_cnf, is_dnf, to_cnf, to_dnf, to_nnf};
266pub use expr::optimization::{
267 algebraic_simplify, constant_fold, optimize_expr, propagate_constants,
268};
269pub use expr::optimization_pipeline::{
270 OptimizationLevel, OptimizationMetrics, OptimizationPass, OptimizationPipeline, PipelineConfig,
271};
272pub use expr::probabilistic_reasoning::{
273 compute_tight_bounds, extract_probabilistic_semantics, mln_probability,
274 propagate_probabilities, CredalSet, ProbabilityInterval,
275};
276pub use expr::rewriting::{Pattern, RewriteRule, RewriteSystem};
277pub use expr::strategy_selector::{auto_optimize, ExpressionProfile, StrategySelector};
278pub use expr::temporal_equivalences::apply_temporal_equivalences;
279pub use expr::{
280 AggregateOp, FuzzyImplicationKind, FuzzyNegationKind, TCoNormKind, TLExpr, TNormKind,
281};
282pub use graph::advanced_algorithms::{
283 are_isomorphic, critical_path_analysis, find_all_paths, find_cycles, graph_diameter, is_dag,
284 strongly_connected_components, topological_sort, CriticalPath, Cycle, IsomorphismResult,
285 StronglyConnectedComponent,
286};
287pub use graph::constant_folding::{
288 analyze_constants, apply_constant_folding, fold_constants_aggressive,
289 identify_constant_subgraphs, ConstantInfo, ConstantPropagationResult, FoldingStats,
290};
291pub use graph::cost_model::{
292 auto_annotate_costs, estimate_graph_cost, estimate_operation_cost, CostSummary, GraphCostModel,
293 OperationCost,
294};
295pub use graph::export::{
296 export_to_onnx_text, export_to_onnx_text_with_options, export_to_torchscript_text,
297 export_to_torchscript_text_with_options, OnnxExportOptions, TorchScriptExportOptions,
298};
299pub use graph::fusion::{
300 fuse_all, fuse_einsum_operations, fuse_elementwise_operations, fuse_map_reduce, FusionStats,
301};
302pub use graph::layout::{
303 apply_layouts, find_layout_fusion_opportunities, optimize_layouts, LayoutOptimizationResult,
304 LayoutStrategy, StridePattern, TensorLayout,
305};
306pub use graph::memory::{
307 analyze_inplace_opportunities, analyze_memory, MemoryAnalysis, TensorMemory,
308};
309pub use graph::parallel::{
310 analyze_parallelization, partition_independent_subgraphs, ParallelGroup,
311 ParallelizationAnalysis,
312};
313pub use graph::pattern::{
314 GraphPattern, GraphRewriteRule, PatternMatch, PatternMatcher,
315 RewriteStats as PatternRewriteStats,
316};
317pub use graph::pgo::{
318 ExecutionProfile, NodeStats, OptimizationHint, ProfileGuidedOptimizer, TensorStats,
319};
320pub use graph::schedule::{ExecutionSchedule, GraphScheduler, SchedulingObjective};
321pub use graph::tiling::{
322 apply_multilevel_tiling, apply_register_tiling, apply_tiling, recommend_tiling_strategy,
323 TileConfig, TilingResult, TilingStrategy,
324};
325pub use graph::{
326 are_graphs_equivalent, canonical_hash, canonicalize_graph, eliminate_common_subexpressions,
327 eliminate_dead_code, export_to_dot, export_to_dot_with_options, optimize_graph,
328 simplify_identity_operations, validate_graph, DotExportOptions, EinsumGraph, EinsumNode,
329 GraphValidationStats, OpType, OptimizationStats, ValidationError, ValidationErrorKind,
330 ValidationReport, ValidationWarning, ValidationWarningKind,
331};
332pub use linear::{
333 Capability, LinearContext, LinearResource, LinearType, LinearityChecker, Multiplicity, Usage,
334};
335pub use metadata::{Metadata, Provenance, SourceLocation, SourceSpan};
336pub use parametric_types::{
337 compose_substitutions, generalize, instantiate, unify, Kind, ParametricType, TypeConstructor,
338 TypeSubstitution,
339};
340pub use refinement::{LiquidTypeInference, Refinement, RefinementContext, RefinementType};
341pub use resolution::{
342 Clause, Literal, ProofResult, ProverStats, ResolutionProver, ResolutionStep, ResolutionStrategy,
343};
344// Note: resolution::to_cnf exists but is not exported to avoid conflict with expr::normal_forms::to_cnf
345pub use sequent::{
346 CutElimination, InferenceRule, ProofSearchEngine, ProofSearchStats, ProofSearchStrategy,
347 ProofTree, Sequent,
348};
349pub use serialization::{VersionedExpr, VersionedGraph, FORMAT_VERSION};
350pub use signature::{PredicateSignature, SignatureRegistry};
351pub use term::{Term, TypeAnnotation};
352pub use unification::{
353 anti_unify_terms, are_unifiable, lgg_terms, rename_vars, unify_term_list, unify_terms,
354 Substitution,
355};
356pub use util::{pretty_print_expr, pretty_print_graph, ExprStats, GraphStats};