将Haskell代码转换为Agda
我们必须将此haskell数据类型转换为agda代码:将Haskell代码转换为Agda,haskell,agda,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`
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类型函数的有效参数时就不是了”。我认为该集合需要更改为其他集合,但我不清楚该更改为什么。让我们将Haskell中的
BoolProp
声明与Agda版本进行比较:
data BoolProp :: * -> * where
-- ...
从Haskell的观点来看,BoolProp
是一元类型构造函数(大致意思是:给我一个具体类型*
,我给你一个具体类型)
在构造函数中,BoolProp
本身是没有意义的-它不是一种类型!您必须首先给它一个类型(例如,在PTrue
的情况下为TRUE
)
在Agda代码中,您声明BoolProp
位于Set
(类似于Haskell中的*
)。但是你的构造器讲述了一个不同的故事
ptrue : BoolProp true
通过将BoolProp
应用于true
,您就知道BoolProp
应该接受一个Bool
参数并返回一个Set
(即Bool→ 设置
)。但是你刚才说,BoolProp
在Set
中
显然,因为Bool→ 设置≠ 设置
,Agda抱怨
更正相当简单:
data BoolProp : Bool → Set where
-- ...
现在因为BoolProp-true:Set
,一切都很好,Agda很高兴
实际上,您可以将Haskell代码做得更好一点,这样您就可以立即看到问题
{-# LANGUAGE GADTs, KindSignatures, DataKinds, TypeFamilies #-}
module Main where
type family And (a :: Bool) (b :: Bool) :: Bool
type instance And True b = b
type instance And False b = False
type family Or (a :: Bool) (b :: Bool) :: Bool
type instance Or True b = True
type instance Or False b = b
type family Not (a :: Bool) :: Bool
type instance Not True = False
type instance Not False = True
data BoolProp :: Bool -> * where
PTrue :: BoolProp True
PFalse :: BoolProp False
PAnd :: BoolProp a -> BoolProp b -> BoolProp (And a b)
POr :: BoolProp a -> BoolProp b -> BoolProp (Or a b)
PNot :: BoolProp a -> BoolProp (Not a)