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)
看到一些很好的例子会很有趣。
我想到了一个潜在的例子,但最好知道我是否正确:L
为 not not
和 M
为 [ 的双重否定翻译=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
... 以及 return
、join
和 fmap
的类型。
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").
其他一些可能性:
乍一看,似乎使 D
变得微不足道的对称移动会导致我们得到非常类似于 ComonadApply
的东西。我说 "very much like" 主要是由于 Haskell Functor
的功能强度,问题是如果您正在寻找传统的必要性模式,那么 x /\ B y -> B (x /\ y)
是一件尴尬的事情.
Kenneth Foner 的 Functional Pearl: Getting a Quick Fix on Comonads(感谢 dfeuer 提供参考)致力于在 Haskell 中表达直觉 K4,涵盖了沿途的一些困难(包括函子强度上面提到的问题)。
Matt Parsons 的 Distributed Modal Logic 提供了面向 Haskell 的直觉主义 S5 介绍及其解释,最初由 Tom Murphy VII 在分布式计算方面提出:B x
作为一个 x
-producing 计算,可以是 运行 网络上的任何地方,并且 D x
作为一个指向 x
某处的地址。
时间逻辑可以通过 Curry-Howard 与函数反应式编程 (FRP) 相关联。起点的建议包括 de Paiva and Eades III, Constructive Temporal Logic, Categorically (2017), as well as this blog post by Philip Schuster alongside this interesting /r/haskell thread about it.
我只是在看 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)
看到一些很好的例子会很有趣。
我想到了一个潜在的例子,但最好知道我是否正确:L
为 not not
和 M
为 [ 的双重否定翻译=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
... 以及 return
、join
和 fmap
的类型。
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").
其他一些可能性:
乍一看,似乎使
D
变得微不足道的对称移动会导致我们得到非常类似于ComonadApply
的东西。我说 "very much like" 主要是由于 HaskellFunctor
的功能强度,问题是如果您正在寻找传统的必要性模式,那么x /\ B y -> B (x /\ y)
是一件尴尬的事情.Kenneth Foner 的 Functional Pearl: Getting a Quick Fix on Comonads(感谢 dfeuer 提供参考)致力于在 Haskell 中表达直觉 K4,涵盖了沿途的一些困难(包括函子强度上面提到的问题)。
Matt Parsons 的 Distributed Modal Logic 提供了面向 Haskell 的直觉主义 S5 介绍及其解释,最初由 Tom Murphy VII 在分布式计算方面提出:
B x
作为一个x
-producing 计算,可以是 运行 网络上的任何地方,并且D x
作为一个指向x
某处的地址。时间逻辑可以通过 Curry-Howard 与函数反应式编程 (FRP) 相关联。起点的建议包括 de Paiva and Eades III, Constructive Temporal Logic, Categorically (2017), as well as this blog post by Philip Schuster alongside this interesting /r/haskell thread about it.