Skip to content

feat(CombinatoryLogic): Partrec → SKI computability#403

Draft
jessealama wants to merge 7 commits intoleanprover:mainfrom
jessealama:ski-equivalence
Draft

feat(CombinatoryLogic): Partrec → SKI computability#403
jessealama wants to merge 7 commits intoleanprover:mainfrom
jessealama:ski-equivalence

Conversation

@jessealama
Copy link
Contributor

Prove that every Nat.Partrec function on ℕ is SKI-computable (nat_partrec_ski_computable). Translates all eight Nat.Partrec.Code constructors to SKI terms and proves correctness, exercising the Recursion.lean infrastructure: primitive recursion (Rec), μ-recursion (RFind/RFindAbove), Nat pairing/unpairing, and integer square root.

Copy link
Contributor

@thomaskwaring thomaskwaring left a comment

Choose a reason for hiding this comment

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

Looks pretty good to me! The title should probably say that only one direction of the equivalence is proven here (Partrec -> SKI). If I have time I can do a more thorough review but my only real concern would be whether the new version of primitive recursion could use the original one in Recursion.lean any more (though I would believe that the pair/unpair dance makes that impossible)

Prove that every Nat.Partrec function on ℕ is SKI-computable
(nat_partrec_ski_computable). Translates all eight Nat.Partrec.Code
constructors to SKI terms and proves correctness, exercising the
Recursion.lean infrastructure: primitive recursion (Rec), μ-recursion
(RFind/RFindAbove), Nat pairing/unpairing, and integer square root.
@jessealama jessealama changed the title feat(CombinatoryLogic): SKI ↔ Partrec equivalence feat(CombinatoryLogic): Partrec → SKI computability Mar 6, 2026
@jessealama
Copy link
Contributor Author

Looks pretty good to me! The title should probably say that only one direction of the equivalence is proven here (Partrec -> SKI). If I have time I can do a more thorough review but my only real concern would be whether the new version of primitive recursion could use the original one in Recursion.lean any more (though I would believe that the pair/unpair dance makes that impossible)

In an earlier version of this proof, I tried to apply the original recursor directly but gave up because it was getting too bulky. The new PrecTrans is essentially a custom wrapper around Rec for this proof. I'm happy to try to resurrect that earlier approach, or "hide" the PrecTrans if we don't want to expose it. At a minimum, I'll add more documentation to clarify what's going on with the new recursor.

@jessealama jessealama requested a review from thomaskwaring March 7, 2026 14:02
@thomaskwaring
Copy link
Contributor

In an earlier version of this proof, I tried to apply the original recursor directly but gave up because it was getting too bulky. The new PrecTrans is essentially a custom wrapper around Rec for this proof. I'm happy to try to resurrect that earlier approach, or "hide" the PrecTrans if we don't want to expose it. At a minimum, I'll add more documentation to clarify what's going on with the new recursor.

Makes sense! happy for you to leave as-is and/or hide the definition as you & the maintainers prefer. I suppose the ideal outcome would be for the definition of the term to mirror what the function looks like in Nat.Partrec, but that uses the monad structure on Part/PFun — once we have more API for encodings of datatypes I might try to update it, but that will be a way-away.

@chenson2018 chenson2018 self-assigned this Mar 17, 2026
…ntions

Shorten verbose docstrings, collapse rw/have/subst patterns to obtain rfl,
extract inline calc blocks, and rename to camelCase (natPartrec_skiComputable,
rfindAbove_induction).
Only one direction (Partrec → SKI) is proven; rename file and section
header to avoid overclaiming equivalence. Remove unrelated SKIPartrec
stub (converse direction) to a separate branch.
Add computes_of_total and RFindAbove_unfold helpers to eliminate
repeated proof patterns. Simplify comp/pair_computes Part.mem chains
and rfindAbove_induction via early subst + local helper. Remove
dormant @[scoped grind] attributes from nil_correct and neg_correct.
@jessealama
Copy link
Contributor Author

Converting to draft — splitting out the Sqrt/NatPair/NatUnpair layer as a smaller PR first: #445.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants