Haskell 中遵守模态公理的有趣运算符

Interesting operators in Haskell that obey modal axioms

我只是在看 map :: (a -> b) -> [a] -> [b] 的类型,只是这个函数的形状让我想知道我们是否可以看到列表形成运算符 [ ] 服从普通模态逻辑常见的各种公理(例如, T, S4, S5, B), 因为我们似乎至少有正常模态逻辑的 K 公理,[(a -> b)] -> [a] -> [b].

这引出了我的问题:Haskell 中是否有熟悉的、有趣的运算符或函子,它们具有某种模态运算符的语法,并且遵守普通模态逻辑的公理(即, K、T、S4、S5 和 B)?

这个问题可以尖锐化并更具体。考虑一个运算符 L 及其对偶 M。现在的问题是:Haskell 中是否有任何熟悉的、有趣的运算符具有以下一些属性:

(1) L(a -> b) -> La -> Lb

(2) La -> a

(3) Ma -> L(M a)

(4) La -> L(L a)

(5) a -> L(M a)

看到一些很好的例子会很有趣。

我想到了一个潜在的例子,但最好知道我是否正确:Lnot notM 为 [ 的双重否定翻译=23=]。此翻译将每个公式 a 转换为其双重否定翻译 (a -> ⊥) -> ⊥ 并且至关重要的是,验证公理 (1)-(4),但不验证公理 (5)。我在这里问了一个问题 https://math.stackexchange.com/questions/2347437/continuations-in-mathematics-nice-examples 似乎可以通过延续 monad 模拟双重否定转换,endofunctor 将每个公式 a 转换为它的双重否定转换 (a -> ⊥) -> ⊥。在那里,Derek Elkins 注意到存在一些双重否定翻译,通过 Curry-Howard 同构,对应于不同的连续传递风格变换,例如Kolmogorov 对应于按名称调用 CPS 转换。

也许还有其他操作可以通过 Haskell 在延续 monad 中完成,可以验证公理 (1)-(5)。


(只是为了排除一个例子:所谓的 Lax 逻辑 https://www.sciencedirect.com/science/article/pii/S0890540197926274 和 Haskell 中的 Monads 之间有明确的关系,return 操作遵守这个逻辑的模态运算符(它是一个内函子)。我对这些例子不太感兴趣,但对 Haskell 运算符的例子很感兴趣,它们服从经典正态模态逻辑中模态运算符的一些公理)

初步说明:我很抱歉在这个答案中花了很大一部分时间谈论命题松散逻辑,这个话题你 very familiar with 并且就这个问题而言不太感兴趣.无论如何,我确实觉得这个主题值得更广泛地曝光——感谢你让我意识到这一点!


命题松散逻辑 (PLL) 中的模态运算符是 Monad 类型构造函数的 Curry-Howard 对应物。注意其公理之间的对应关系...

DT: x -> D x
D4: D (D x) -> D x
DF: (x -> y) -> D x -> D y

... 以及 returnjoinfmap 的类型。

Valeria de Paiva 有许多论文讨论了直觉模态逻辑,尤其是 PLL。这里关于PLL的言论主要是基于Alechina et. al., Categorical and Kripke Semantics for Constructive S4 Modal Logic (2001). Interestingly, that paper makes a case for the PLL being less weird than it might seem at first (cf. Fairtlough and Mendler, Propositional Lax Logic (1997):"As a modal logic it is special because it features a single modal operator [...] that has a flavour both of possibility and necessity")。从 CS4 开始,直觉 S4 的一个版本没有析取可能性的分布...

B stands for box, and D for diamond

BK: B (x -> y) -> (B x -> B y)
BT: B x -> x
B4: B x -> B (B x)

DK: B (x -> y) -> (D x -> D y)
DT: x -> D x
D4: B (B x) -> B x

... 并向其添加 x -> B x 会导致 B 变得微不足道(或者,用 Haskell 的说法,Identity),将逻辑简化为 PLL。既然如此,PLL 可以被视为直觉 S4 变体的特例。此外,它将 PLL 的 D 构造为类似可能性的运算符。如果我们将 D 作为 Haskell Monad 的对应物,这在直觉上很吸引人,后者通常确实有一种可能性(考虑 Maybe Integer -- "There might be an Integer here" - - 或 IO Integer -- "I will get an Integer when the program is executed").


其他一些可能性: