Skip to content

feat(CombinatoryLogic): Partrec → SKI computability#403

Open
jessealama wants to merge 3 commits intoleanprover:mainfrom
jessealama:ski-equivalence
Open

feat(CombinatoryLogic): Partrec → SKI computability#403
jessealama wants to merge 3 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.

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.

2 participants