将Haskell代码转换为Agda

时间:2012-05-19 13:33:52

标签: haskell agda

我们必须将此haskell数据类型转换为agda代码:

data TRUE
data FALSE
data BoolProp :: * -> * where
PTrue :: BoolProp TRUE
PFalse :: BoolProp FALSE
PAnd :: BoolProp a -> BoolProp b -> BoolProp (a `AND` b)
POr :: BoolProp a -> BoolProp b -> BoolProp (a `OR` b)
PNot :: BoolProp a -> BoolProp (NOT a)

这是我到目前为止所做的:

module BoolProp where

open import Data.Bool
open import Relation.Binary.PropositionalEquality

data BoolProp : Set wheree
ptrue : BoolProp true
pfalse : BoolProp false
pand : (X Y : Bool) -> BoolProp X -> BoolProp Y -> BoolProp (X ? Y)
por : (X Y : Bool) -> BoolProp X -> BoolProp Y -> BoolProp (X ? Y)
pnot : (X : Bool) -> BoolProp X -> BoolProp (not X)

但是我收到了这个错误:“Set应该是一个函数类型,但是当检查true是类型为Set的函数的有效参数时”。我认为Set需要改为其他东西,但我对这应该是什么感到困惑。

1 个答案:

答案 0 :(得分:14)

让我们将Haskell中的BoolProp声明与Agda版本进行比较:

data BoolProp :: * -> * where
  -- ...

从Haskell的角度来看,BoolProp是一个一元类型的构造函数(大致意思是:给我一个具体的类型*,然后我给你一个具体的类型)。

在构造函数中,BoolProp单独没有意义 - 它不是一种类型!你必须先给它一个类型(TRUE,例如PTrue。)

在您的Agda代码中,您声明BoolProp位于Set(类似于Haskell中的*)。但是你的构造者讲的是另一个故事。

ptrue : BoolProp true

通过将BoolProp应用于true,您告诉BoolProp应该采用Bool参数并返回Set(即{{1} }})。但你刚才说Bool → SetBoolProp

显然,因为Set,Agda抱怨。

更正非常简单:

Bool → Set ≠ Set

现在因为data BoolProp : Bool → Set where -- ... ,一切都很好,Agda很高兴。


你实际上可以让Haskell代码更好一些,你马上就会看到问题!

BoolProp true : Set