Skip to content

CoreOp: table-driven name lookup for all OpKind types#942

Merged
aqjune-aws merged 2 commits intomainfrom
tautschnig/fix-785-structured-types
Apr 16, 2026
Merged

CoreOp: table-driven name lookup for all OpKind types#942
aqjune-aws merged 2 commits intomainfrom
tautschnig/fix-785-structured-types

Conversation

@tautschnig
Copy link
Copy Markdown
Contributor

Each OpKind type now defines a single names : List (OpKind × String) as the source of truth. Both toString and ofString? are derived from this list via lookupName/lookupKind helpers that use List.find?, which reduces in the kernel.

This eliminates the sync problem: adding a new constructor without adding it to names causes the round-trip decide proof to fail at compile time. There is only one place to update per new variant.

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

Each OpKind type now defines a single `names : List (OpKind × String)`
as the source of truth. Both `toString` and `ofString?` are derived
from this list via `lookupName`/`lookupKind` helpers that use
`List.find?`, which reduces in the kernel.

This eliminates the sync problem: adding a new constructor without
adding it to `names` causes the round-trip `decide` proof to fail
at compile time. There is only one place to update per new variant.

Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
@tautschnig tautschnig self-assigned this Apr 16, 2026
@tautschnig tautschnig requested review from a team and Copilot April 16, 2026 10:43
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors Core operator kind ↔ string conversion to be table-driven: each OpKind defines a single names : List (OpKind × String) and both toString and ofString? are derived from it using shared lookup helpers, with round-trip properties proved via decide.

Changes:

  • Added lookupName / lookupKind helpers and per-OpKind names tables as the single mapping source of truth.
  • Replaced per-constructor toString / ofString? definitions with table-driven implementations.
  • Updated round-trip proof commentary to reflect the new invariant enforcement mechanism.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread Strata/Languages/Core/CoreOp.lean Outdated
Comment thread Strata/Languages/Core/CoreOp.lean
- Replace silent "?unknown?" fallback with panic! so missing table
  entries fail loudly (unreachable by the decide proofs).
- Document why List.find? is used over HashMap: enables kernel
  reduction required for the round-trip decide proofs.

Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
@tautschnig tautschnig force-pushed the tautschnig/fix-785-structured-types branch from a7d028c to 50f61ed Compare April 16, 2026 10:58
@aqjune-aws aqjune-aws added this pull request to the merge queue Apr 16, 2026
Merged via the queue into main with commit b33b7e7 Apr 16, 2026
17 checks passed
@aqjune-aws aqjune-aws deleted the tautschnig/fix-785-structured-types branch April 16, 2026 19:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants