我是否可以证明(全部x。可矫正(a x)(b x))暗示可矫正a b?

时间:2019-06-27 19:12:16

标签: haskell coercion

我正在处理强制性证明:

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

我可以简单地证明Coercible a b => forall x. Coercible (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’
-}

我可以肯定我的说法是正确的(尽管我很乐意被驳斥),但是对于在unsafeCoerce之外的Haskell中如何证明这一点,我没有任何聪明的主意。

1 个答案:

答案 0 :(得分:5)

不,您不能。正如Dominique Devriese和HTNW在其评论中暗示的那样,GHC完全不接受该推断。这个要求更高的版本将无法编译:

07.01.2018

您的版本更加注定了。要对多态Time, Value 05.01.2018, 5.1398 06.01.2018, 5.1298 07.01.2018, 5.1438 .... , ,,,, 31.12.2018, 6.3498 (或{-# language QuantifiedConstraints, RankNTypes #-} import Data.Coerce import Data.Type.Coercion eliminate :: (forall a. Coercible (f a) (g a)) => Coercion f g eliminate = Coercion )参数进行模式匹配,必须将其实例化为特定类型。 GHC会将其实例化为Coercion,然后它是单态的,因此不能证明您想要它。由于键入了GHC Core,因此不会显示。

旁注:我非常沮丧,因为没有办法写作

~=~