目标是整理出所有或至少一部分无效类型签名,如上面的那些。我很感激每一个提示。
您可能想看看Curry-Howard 的对应关系。
基本上,函数式程序中的类型对应于逻辑公式。只需->用蕴涵、(,)连词 (AND) 和Either析取 (OR) 替换。居住类型正是那些具有相应公式的那些,这是直觉逻辑中的重言式。
有一些算法可以决定直觉逻辑中的可证明性(例如,在 Gentzen 的序列中利用削减消除),但问题是 PSPACE 完全的,所以通常我们不能处理非常大的类型。但是,对于中型类型,切割消除算法可以正常工作。
如果您只想要一个无人居住类型的子集,则可以限制为具有相应公式的那些,这不是经典逻辑中的重言式。这是正确的,因为直觉主义的重言式也是经典的。P可以通过询问是否not P是可满足的公式来检查公式是否不是经典的重言式。所以,问题出在NP上。不多,但比 PSPACE-complete 好。
例如,上述两种类型
a -> b
(a -> b) -> a -> c
显然不是重言式!因此他们没有人居住。
最后,请注意,在 Haskellundefined :: T和let x = x in x :: T任何类型T中,从技术上讲,每种类型都存在。一旦限制为终止没有运行时错误的程序,我们就会得到一个更有意义的“inhabited”概念,这是 Curry-Howard 对应关系所解决的概念。