( expr: &LeanExpr, pn: &[Name], binder_names: &mut Vec<Name>, intern: &mut InternTable<Meta>, n2a: Option<&DashMap<Name, Address>>, aux_n2a: Option<&DashMap<Name, Address>>, mut cache: O
| 2289 | pub fn lean_level_to_kuniv(lvl: &Level, param_names: &[Name]) -> KUniv<Meta> { |
| 2290 | match lvl.as_data() { |
| 2291 | LevelData::Succ(l, _) => KUniv::succ(lean_level_to_kuniv(l, param_names)), |
| 2292 | LevelData::Max(a, b, _) => KUniv::max( |
| 2293 | lean_level_to_kuniv(a, param_names), |
| 2294 | lean_level_to_kuniv(b, param_names), |
| 2295 | ), |
| 2296 | LevelData::Imax(a, b, _) => KUniv::imax( |
| 2297 | lean_level_to_kuniv(a, param_names), |
| 2298 | lean_level_to_kuniv(b, param_names), |
| 2299 | ), |
| 2300 | LevelData::Param(name, _) => { |
| 2301 | let idx = |
| 2302 | param_names.iter().position(|n| n == name).unwrap_or_else(|| { |
| 2303 | panic!( |
| 2304 | "unknown level param `{}` not found in param_names {:?}", |
| 2305 | name.pretty(), |
| 2306 | param_names.iter().map(|n| n.pretty()).collect::<Vec<_>>() |
| 2307 | ) |
| 2308 | }) as u64; |
| 2309 | KUniv::param(idx, name.clone()) |
| 2310 | }, |
| 2311 | LevelData::Zero(_) => KUniv::zero(), |
| 2312 | LevelData::Mvar(name, _) => { |
| 2313 | panic!( |
| 2314 | "unexpected level metavariable `{}` in elaborated kernel term", |
| 2315 | name.pretty() |
| 2316 | ); |
| 2317 | }, |
| 2318 | } |
| 2319 | } |
| 2320 | |
| 2321 | /// Resolve a Lean Name to an Address, using real Ixon address if available. |
| 2322 | /// |
| 2323 | /// Checks `name_to_ixon_addr` first (real compiled address), falls back to |
| 2324 | /// `Address::from_blake3_hash(*name.get_hash())` for constants not yet compiled. |
| 2325 | pub fn resolve_lean_name_addr( |
| 2326 | name: &Name, |
| 2327 | name_to_ixon_addr: Option<&DashMap<Name, Address>>, |
| 2328 | aux_n2a: Option<&DashMap<Name, Address>>, |
| 2329 | ) -> Address { |
| 2330 | if let Some(map) = name_to_ixon_addr |
| 2331 | && let Some(entry) = map.get(name) |
| 2332 | { |
| 2333 | return entry.value().clone(); |
| 2334 | } |
| 2335 | if let Some(map) = aux_n2a |
| 2336 | && let Some(entry) = map.get(name) |
| 2337 | { |
| 2338 | return entry.value().clone(); |
| 2339 | } |
| 2340 | Address::from_blake3_hash(*name.get_hash()) |
| 2341 | } |
| 2342 | |
| 2343 | /// Convert a LeanExpr to KExpr<Meta>. |
| 2344 | /// |
| 2345 | /// `param_names` provides the positional mapping for universe level params. |
| 2346 | /// `name_to_ixon_addr` maps Lean names to real Ixon addresses for already-compiled |
| 2347 | /// constants. Falls back to name hash for constants not yet compiled. |
| 2348 | /// Compute a stable hash for a `param_names` slice, used as part of the |
no test coverage detected