- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是a
双重否定的Curry-Howard对应; (a -> r) -> r
或 (a -> ⊥) -> ⊥
,或两者兼而有之?
这两种类型都可以在 Haskell 中编码如下,其中 ⊥
编码为 forall b。 b
.
p1 :: forall r. ((a -> r) -> r)
p2 :: (a -> (forall b. b)) -> (forall b. b)
论文作者Wadler 2003也 implementation in Haskell似乎采用前者,而有些其他文献(例如 this )似乎支持后者。
我目前的理解是后者是正确的。我很难理解前一种风格,因为您可以从 forall r 创建一个
使用纯计算:a
类型的值。 ((a -> r) -> r)
> let p1 = ($42) :: forall r. (Int -> r) -> r
> p1 id
42
这似乎与直觉逻辑相矛盾,即您无法从 ¬¬a
派生出 a
。
所以,我的问题是:p1
和p2
是否都可以被视为¬¬a
的Curry-Howard通讯员?如果是这样,我们可以构造 p1 id::a
的事实如何与直觉逻辑相互作用?
为了方便讨论,我提出了更清晰的双重否定转换编码。感谢@user2407038!
{-# LANGUAGE RankNTypes #-}
to_double_neg :: forall a. a -> (forall r. (a->r)->r)
to_double_neg x = ($x)
from_double_neg :: forall a. (forall r. (a->r)->r) -> a
from_double_neg x = x id
最佳答案
构造 T1 a = forall r . (a -> r) -> r
类型的值至少与构造 T2 a = (a -> Void) -> Void
类型的值一样要求例如,Void ~ forall a . a
。这很容易看出,因为如果我们可以构造 T1 a
类型的值。那么我们会自动获得一个 T2 a
类型的值仅通过实例化forall
与 Void
.
另一方面,如果我们有一个 T2 a
类型的值我们不能回去。出现如下右图
dne :: forall a . ((a -> Void) -> Void) -> (forall r . (a -> r) -> r)
dne t2 = \f -> absurd (t2 (_ f)) -- we cannot fill _
但是这个洞_ :: (a -> r) -> (a -> Void)
无法被填满——我们都“不知道”r
在这种情况下,我们知道我们无法构建 Void
.
这是另一个重要的区别:T1 a -> a
编码相当简单,我们实例化 forall
与 a
然后申请id
project :: T1 a -> a
project t1 = t1 id
但是,另一方面,我们不能对 T2 a
执行此操作
projectX :: T2 a -> a
projectX t2 = absurd (t2 (_ :: a -> Void))
或者,至少我们不能不欺骗我们的直觉逻辑。
<小时/>所以,这些应该给我们一个提示,告诉我们 T1
中的哪一个。和T2
是真正的双重否定以及为什么使用每个否定。需要明确的是,T2
确实是双重否定——就像你期望的那样——但是 T1
更容易处理...特别是如果你使用Haskell98,它缺乏无效数据类型和更高级别的类型。如果没有这些,Void
的唯一“有效”编码是
newtype Void = Void Void
absurd :: Void -> a
absurd (Void v) = absurd v
如果您不需要它,这可能不是最好的介绍。那么什么保证我们可以使用 T1
反而?好吧,只要我们只考虑不允许实例化的代码 r
如果使用特定类型变量,那么我们实际上就好像它是一个没有任何操作的抽象或存在类型。这足以处理与双重否定(或延续)有关的许多参数,因此仅讨论 forall r . (a -> r) -> r
的属性可能会更简单。而不是(a -> Void) -> Void
只要你保持适当的纪律,允许你在真正需要的时候将前者转换为后者。
关于haskell - Curry-Howard 对应于双重否定 ((a->r)->r) 或 ((a->⊥)->⊥) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30008910/
这个问题在这里已经有了答案: Tempered Greedy Token - What is different about placing the dot before the negative l
我想做与THIS相反的事情。换句话说,我该怎么做: SELECT * FROM table1 WHERE col1, col2 NOT IN (SELECT col1, col2
嗨,假设我有这个字符串: var text = "Jackie Chan | Jack Frost | Capt.Jack Sparrow" 我想找到除 Jack Frost 之外的所有 /Jack/
我只想在运行低于 iOS8 操作系统的设备上执行代码块。我做不到: if #available(iOS 8.0, *) == false { doFoo() } 我目前使用的解决方案是: if
我使用 htaccess 来解析对 seo 友好的请求。早些时候我的 htaccess 有这些字符串来解析像 /some/request/ 这样的请求 RewriteCond %{REQUEST_UR
我只想在运行低于 iOS8 操作系统的设备上执行代码块。我做不到: if #available(iOS 8.0, *) == false { doFoo() } 我目前使用的解决方案是: if
我的一个考试题目是: ! ( ! ( a != b) && ( b > 7 ) ) 选择: a) (a != b) || (b 7) 最初,我以为是 D。这是不正确的,我知道为什么。我不明白逻辑
我很难在 Prolog 中寻找关于否定的明确答案,所以如果这是一个明显的问题,我深表歉意: 我正在尝试编写一个简单的代码,从逻辑上说“如果 X 喜欢 Y 并且只喜欢 Y,则 X 和 Y 彼此相爱。”我
假设我有以下字符串: 邮寄至 电话:+358123456 http://www.google.fi 邮箱:foo@bar.fi Hello World 电话 大象 一分钱 链接 猫头鹰 如何在 RE2
如何在 RE2 中为“匹配字符串不以 4 或 5 开头”编写正则表达式? 在 PCRE 中,我会使用 ^(?!4)但 RE2 doesn't support that syntax . 最佳答案 您可
假设我有一个谓词 is_foo?/1在 Elixir 我想在一个将谓词作为参数的函数中使用它,但被否定了。 Elixir 有没有办法简单地做到这一点? 最佳答案 &(!is_foo? &1)应该这样做
假设我想制作一个描述所有整数的 RE。根据定义,表达式为: (+|-)?[0-9]+ 但定义也匹配这些数字:+0, -0, 0045 0045 情况可能可以使用回溯表达式来解决,但是我如何才能从关于。
作为 Javascript 的初学者,我有一个看起来有点奇怪的问题。我正在使用我在网上找到的外部库,我在其中找到了以下代码: if('useHoles' in c){ this.config.u
否定 MySQL 查询的最佳方法是什么,也就是说,无论条件如何,强制它不返回任何记录。 我使用了 AND 1=0 ,它似乎有效,但我有兴趣知道是否有这样的标准。 最佳答案 只需添加一个false条件
我有一个问题:我必须获取所有未在指定时间表中安排的司机姓名。我可以使用以下查询获取指定时间表中安排的所有司机姓名,但我无法否定它。请给我指示如何去做。谢谢。 select drivername fro
我正在做功能测试,刚刚发现了 assert_difference,如: assert_difference('Account.count') do post :create, :account =
考虑这个模式:*.py。它匹配所有以 py 扩展名结尾的路径。现在,是否有可能找到一个匹配其他一切的模式? 我认为这样可以做到:*[!.][!p][!y],但显然 fnmatch.fnmatch总是返
我有以下正则表达式模式:[^\u0001-\u00FF]。这样我就可以验证用户输入不包含“€”等无效字符。 var utfRegex: RegExp = new RegExp('[^\u0001-\u
我尝试使用 vector::erase 和 std::remove_if 从 vector 中删除对象。我有一个外部 namespace 来进行选择: template bool Namespace:
是否有可能/可以实现否定 boost 过滤适配器,例如 std::vector v = {1, 2, 3, 4, 5}; for(auto i : v | !filtered(is_even))
我是一名优秀的程序员,十分优秀!