`Refl` thing in Calculus of Constructions?

本小妞迷上赌 提交于 2019-12-03 12:32:41

问题


In languages such as Agda, Idris, or Haskell with type extensions, there is a = type sort of like the following

data a :~: b where
  Refl :: a :~: a

a :~: b means that a and b are the same.

Can such a type be defined in the calculus of constructions or Morte (which is programming language based on the calculus of construction)?


回答1:


The standard Church-encoding of a :~: b in CoC is:

(a :~: b) =
   forall (P :: * -> * -> *).
      (forall c :: *. P c c) ->
      P a b

Refl being

Refl a :: a :~: a
Refl a =
   \ (P :: * -> * -> *)
     (h :: forall (c::*). P c c) ->
     h a

The above formulates equality between types. For equality between terms, the :~: relation must take an additional argument t :: *, where a b :: t.

((:~:) t a b) = 
   forall (P :: t -> t -> *).
      (forall c :: t. P c c) ->
      P a b

Refl t a :: (:~:) t a a
Refl t a =
   \ (P :: t -> t -> *)
     (h :: forall (c :: t). P c c) ->
     h a


来源:https://stackoverflow.com/questions/36181738/refl-thing-in-calculus-of-constructions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!