gpt4 book ai didi

haskell - 我可以证明 (forall x.Coercible (a x) (b x)) 意味着 Coercible a b 吗?

转载 作者:行者123 更新时间:2023-12-02 10:09:36 25 4
gpt4 key购买 nike

我正在操纵可强制性的证明:

data a ~=~ b where
IsCoercible :: Coercible a b => a ~=~ b
infix 0 ~=~

sym :: (a ~=~ b) -> (b ~=~ a)
sym IsCoercible = IsCoercible

instance Category (~=~) where
id = IsCoercible
IsCoercible . IsCoercible = IsCoercible

coerceBy :: a ~=~ b -> a -> b
coerceBy IsCoercible = coerce

我可以简单地证明对于所有 x 可强制 a b =>。可强制 (a x) (b x)

introduce :: (a ~=~ b) -> (forall x. a x ~=~ b x)
introduce IsCoercible = IsCoercible

但反之则不然,(forall x.Coercible (a x) (b x)) => Coercible a b) 并不那么自由:

eliminate :: (forall x. a x ~=~ b x) -> (a ~=~ b)
eliminate IsCoercible = IsCoercible
{-
• Could not deduce: Coercible a b
arising from a use of ‘IsCoercible’
from the context: Coercible (a x0) (b x0)
bound by a pattern with constructor:
IsCoercible :: forall k (a :: k) (b :: k).
Coercible a b =>
a ~=~ b,
in an equation for ‘eliminate’
-}

我相当确定我的主张是有效的(尽管我愿意被反驳),但对于如何在 Haskell 中证明它缺乏 unsafeCoerce ,我没有任何好主意.

最佳答案

不,你不能。正如 Dominique Devriese 和 HTNW 在他们的评论中暗示的那样,GHC 根本不承认这种推论。这个要求更高的版本无法编译:

{-# language QuantifiedConstraints, RankNTypes #-}

import Data.Coerce
import Data.Type.Coercion

eliminate :: (forall a. Coercible (f a) (g a)) => Coercion f g
eliminate = Coercion

你的版本更加注定了。要对多态Coercion(或~=~)参数进行模式匹配,必须将其实例化为特定类型。 GHC 会将其实例化为 f Any ~=~ g Any,然后它是单态的,因此不能证明您想要的结果。由于 GHC Core 已键入,因此不会飞行。

旁注:我发现无法编写非常令人沮丧

f :: (forall a. c a :- d a)
-> ((forall a. c a => d a) => r)
-> r

关于haskell - 我可以证明 (forall x.Coercible (a x) (b x)) 意味着 Coercible a b 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56797358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com