🤖 AI Summary
In non-strict functional languages, source-level strictness analysis suffers from poor intuitiveness and imprecision, hindering compiler optimizations. This paper addresses the problem by introducing a fine-grained strictness definition that precisely characterizes variable usage patterns, thereby enhancing source-level strictness reasoning. We design a novel type-theoretic framework unifying call-by-name and call-by-push-value semantics, supporting structure-preserving translations with strictness annotations. Crucially, we model strictness behavior via effect and coeffect tracking, and establish type soundness through logical relations. All theoretical results—including a strictness-preserving translation between two computational models and its runtime behavioral characterization—are fully mechanized in Rocq. To our knowledge, this is the first work achieving a formal end-to-end strictness analysis pipeline: from rigorous definition and typed system design to complete mechanized verification.
📝 Abstract
Strictness analysis is critical to efficient implementation of languages with non-strict evaluation, mitigating much of the performance overhead of laziness. However, reasoning about strictness at the source level can be challenging and unintuitive. We propose a new definition of strictness that refines the traditional one by describing variable usage more precisely. We lay type-theoretic foundations for this definition in both call-by-name and call-by-push-value settings, drawing inspiration from the literature on type systems tracking effects and coeffects. We prove via a logical relation that the strictness attributes computed by our type systems accurately describe the use of variables at runtime, and we offer a strictness-annotation-preserving translation from the call-by-name system to the call-by-push-value one. All our results are mechanized in Rocq.