mirror of
https://github.com/allaunthefox/Research-Stack.git
synced 2026-07-31 03:05:21 +00:00
280 lines
10 KiB
Python
280 lines
10 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Import Lean Analysis Math to Forest
|
||
|
||
Extracts mathematical equations from Lean analysis files and imports
|
||
them into the equation forest (MATH_MODEL_MAP.tsv), then identifies
|
||
intersections/touch points with existing forest equations.
|
||
"""
|
||
|
||
import re
|
||
import json
|
||
from typing import Dict, List, Tuple, Any
|
||
|
||
|
||
def extract_lean_equations(file_path: str) -> List[Dict[str, str]]:
|
||
"""
|
||
Extract mathematical equations from Lean file.
|
||
"""
|
||
with open(file_path, 'r') as f:
|
||
content = f.read()
|
||
|
||
equations = []
|
||
|
||
# Extract def and theorem blocks
|
||
def_pattern = r'def\s+(\w+)\s*[:=]\s*(.+?)(?=\n(?:def|theorem|structure|namespace|end)|$)'
|
||
theorem_pattern = r'theorem\s+(\w+)\s*[:=]\s*(.+?)(?=\n(?:def|theorem|structure|namespace|end)|$)'
|
||
|
||
def_matches = re.finditer(def_pattern, content, re.DOTALL)
|
||
theorem_matches = re.finditer(theorem_pattern, content, re.DOTALL)
|
||
|
||
for match in def_matches:
|
||
name = match.group(1)
|
||
body = match.group(2).strip()
|
||
equations.append({
|
||
"name": name,
|
||
"type": "definition",
|
||
"body": body,
|
||
"file": file_path
|
||
})
|
||
|
||
for match in theorem_matches:
|
||
name = match.group(1)
|
||
body = match.group(2).strip()
|
||
equations.append({
|
||
"name": name,
|
||
"type": "theorem",
|
||
"body": body,
|
||
"file": file_path
|
||
})
|
||
|
||
return equations
|
||
|
||
|
||
def lean_to_math_model(equations: List[Dict[str, str]]) -> List[Dict[str, str]]:
|
||
"""
|
||
Convert Lean equations to MATH_MODEL_MAP format.
|
||
"""
|
||
math_models = []
|
||
|
||
for eq in equations:
|
||
# Extract LaTeX-like equation from Lean body
|
||
body = eq["body"]
|
||
|
||
# Simplify Lean notation to equation format
|
||
# Remove Lean-specific syntax
|
||
equation_str = body.replace(":=", "=")
|
||
equation_str = re.sub(r'→', '->', equation_str)
|
||
equation_str = re.sub(r'∀', 'forall', equation_str)
|
||
equation_str = re.sub(r'∃', 'exists', equation_str)
|
||
equation_str = re.sub(r'∧', 'and', equation_str)
|
||
equation_str = re.sub(r'∨', 'or', equation_str)
|
||
equation_str = re.sub(r'→', 'implies', equation_str)
|
||
|
||
# Extract variables (simplified)
|
||
variables = []
|
||
var_pattern = r'(\w+)\s*:\s*ℝ'
|
||
for match in re.finditer(var_pattern, body):
|
||
variables.append(match.group(1))
|
||
|
||
if not variables:
|
||
var_pattern = r'(\w+)\s*:\s*ℕ'
|
||
for match in re.finditer(var_pattern, body):
|
||
variables.append(match.group(1))
|
||
|
||
variables_str = ", ".join(variables) if variables else "f, x, ε, δ"
|
||
|
||
# Determine family based on content
|
||
if "Continuous" in eq["name"]:
|
||
family = "Analysis"
|
||
purpose = "Continuity and differentiability foundations"
|
||
elif "Differentiable" in eq["name"]:
|
||
family = "Analysis"
|
||
purpose = "Differentiability and smoothness theory"
|
||
elif "Convex" in eq["name"]:
|
||
family = "Optimization"
|
||
purpose = "Convexity and optimization theory"
|
||
elif "Lipschitz" in eq["name"]:
|
||
family = "Analysis"
|
||
purpose = "Lipschitz continuity and ODE theory"
|
||
elif "ODE" in eq["name"]:
|
||
family = "Dynamics"
|
||
purpose = "Ordinary differential equation theory"
|
||
elif "Picard" in eq["name"]:
|
||
family = "Dynamics"
|
||
purpose = "Picard-Lindelöf existence theorem"
|
||
elif "Efficiency" in eq["name"] or "Gain" in eq["name"]:
|
||
family = "Efficiency"
|
||
purpose = "Efficiency metrics and calculations"
|
||
elif "Manifold" in eq["name"]:
|
||
family = "Topology"
|
||
purpose = "Manifold structure and topology"
|
||
else:
|
||
family = "General"
|
||
purpose = "Mathematical foundation"
|
||
|
||
math_models.append({
|
||
"Model_Name": f"Lean_{eq['name']}",
|
||
"Family": family,
|
||
"Equation": equation_str[:200], # Truncate for display
|
||
"Variables": variables_str,
|
||
"Purpose": purpose,
|
||
"Location": eq["file"],
|
||
"Implemented": "Lean",
|
||
"Status": "✅",
|
||
"Cross_Refs": "",
|
||
"Domain_Type": "mathematical_bind",
|
||
"Bind_Class": "informational_bind"
|
||
})
|
||
|
||
return math_models
|
||
|
||
|
||
def find_intersections(lean_models: List[Dict[str, str]], forest_path: str) -> Dict[str, Any]:
|
||
"""
|
||
Find intersections between Lean equations and forest equations.
|
||
"""
|
||
# Read existing forest equations
|
||
forest_equations = []
|
||
with open(forest_path, 'r') as f:
|
||
lines = f.readlines()
|
||
for line in lines[1:]: # Skip header
|
||
parts = line.strip().split('\t')
|
||
if len(parts) >= 4:
|
||
forest_equations.append({
|
||
"name": parts[1],
|
||
"family": parts[2],
|
||
"equation": parts[3],
|
||
"variables": parts[4]
|
||
})
|
||
|
||
intersections = {
|
||
"family_matches": [],
|
||
"variable_matches": [],
|
||
"equation_similarity": []
|
||
}
|
||
|
||
# Find family matches
|
||
lean_families = set(m["Family"] for m in lean_models)
|
||
forest_families = set(e["family"] for e in forest_equations)
|
||
|
||
for family in lean_families:
|
||
if family in forest_families:
|
||
lean_eq = [m for m in lean_models if m["Family"] == family]
|
||
forest_eq = [e for e in forest_equations if e["family"] == family]
|
||
intersections["family_matches"].append({
|
||
"family": family,
|
||
"lean_equations": [m["Model_Name"] for m in lean_eq],
|
||
"forest_equations": [e["name"] for e in forest_eq]
|
||
})
|
||
|
||
# Find variable matches
|
||
for lean_model in lean_models:
|
||
lean_vars = set(v.strip() for v in lean_model["Variables"].split(','))
|
||
for forest_eq in forest_equations:
|
||
forest_vars = set(v.strip() for v in forest_eq["variables"].split(','))
|
||
overlap = lean_vars & forest_vars
|
||
if overlap:
|
||
intersections["variable_matches"].append({
|
||
"lean_equation": lean_model["Model_Name"],
|
||
"forest_equation": forest_eq["name"],
|
||
"shared_variables": list(overlap)
|
||
})
|
||
|
||
# Find equation similarity (simple keyword matching)
|
||
for lean_model in lean_models:
|
||
lean_eq_lower = lean_model["Equation"].lower()
|
||
for forest_eq in forest_equations:
|
||
forest_eq_lower = forest_eq["equation"].lower()
|
||
|
||
# Check for common mathematical terms
|
||
math_terms = ["continuity", "differentiable", "convex", "lipschitz", "ode", "energy", "entropy"]
|
||
shared_terms = [term for term in math_terms if term in lean_eq_lower and term in forest_eq_lower]
|
||
|
||
if shared_terms:
|
||
intersections["equation_similarity"].append({
|
||
"lean_equation": lean_model["Model_Name"],
|
||
"forest_equation": forest_eq["name"],
|
||
"shared_terms": shared_terms
|
||
})
|
||
|
||
return intersections
|
||
|
||
|
||
def main():
|
||
"""Import Lean math to forest and find intersections."""
|
||
print("=" * 70)
|
||
print("IMPORT LEAN ANALYSIS MATH TO FOREST")
|
||
print("=" * 70)
|
||
|
||
# Extract equations from Lean files
|
||
print("\n[*] Extracting equations from Lean analysis files...")
|
||
|
||
lean_files = [
|
||
"/home/allaun/Documents/Research Stack/0-Core-Formalism/lean/Semantics/Semantics/AnalysisFoundations.lean",
|
||
"/home/allaun/Documents/Research Stack/0-Core-Formalism/lean/Semantics/Semantics/EfficiencyAnalysis.lean",
|
||
"/home/allaun/Documents/Research Stack/0-Core-Formalism/lean/Semantics/Semantics/SwarmAnalysis.lean"
|
||
]
|
||
|
||
all_equations = []
|
||
for lean_file in lean_files:
|
||
equations = extract_lean_equations(lean_file)
|
||
all_equations.extend(equations)
|
||
print(f" {lean_file}: {len(equations)} equations")
|
||
|
||
print(f"\n[*] Total equations extracted: {len(all_equations)}")
|
||
|
||
# Convert to math model format
|
||
print(f"\n[*] Converting to MATH_MODEL_MAP format...")
|
||
math_models = lean_to_math_model(all_equations)
|
||
print(f" Converted {len(math_models)} equations")
|
||
|
||
# Show sample equations
|
||
print(f"\n[*] Sample Lean Equations:")
|
||
for i, model in enumerate(math_models[:5]):
|
||
print(f" {i+1}. {model['Model_Name']} ({model['Family']})")
|
||
print(f" {model['Equation'][:100]}...")
|
||
|
||
# Find intersections with forest
|
||
print(f"\n[*] Finding intersections with forest equations...")
|
||
forest_path = "/home/allaun/Documents/Research Stack/3-Mathematical-Models/MATH_MODEL_MAP.tsv"
|
||
intersections = find_intersections(math_models, forest_path)
|
||
|
||
print(f"\n[*] Family Matches:")
|
||
for match in intersections["family_matches"]:
|
||
print(f" {match['family']}:")
|
||
print(f" Lean: {len(match['lean_equations'])} equations")
|
||
print(f" Forest: {len(match['forest_equations'])} equations")
|
||
|
||
print(f"\n[*] Variable Matches (sample):")
|
||
for match in intersections["variable_matches"][:10]:
|
||
print(f" {match['lean_equation']} ↔ {match['forest_equation']}")
|
||
print(f" Shared: {match['shared_variables']}")
|
||
|
||
print(f"\n[*] Equation Similarity (sample):")
|
||
for match in intersections["equation_similarity"][:10]:
|
||
print(f" {match['lean_equation']} ↔ {match['forest_equation']}")
|
||
print(f" Terms: {match['shared_terms']}")
|
||
|
||
# Save results
|
||
results = {
|
||
"total_lean_equations": len(all_equations),
|
||
"converted_models": len(math_models),
|
||
"lean_equations": all_equations,
|
||
"math_models": math_models,
|
||
"intersections": intersections
|
||
}
|
||
|
||
output_path = "/home/allaun/Documents/Research Stack/data/lean_math_forest_import.json"
|
||
with open(output_path, 'w') as f:
|
||
json.dump(results, f, indent=2)
|
||
|
||
print(f"\n[*] Results saved to: {output_path}")
|
||
|
||
print("\n" + "=" * 70)
|
||
print("✅ LEAN MATH IMPORT COMPLETE")
|
||
print("=" * 70)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|