我想编写一个以set为输入的函数return true if it is top and false if it is bottom.
我试过这种方式..
isTop : Set → Bool
isTop x = if (x eq ⊤) then true
else false
但我无法正确定义eq。我试着......
_eq_ : Set → Set → Bool
⊤ eq ⊥ = false
这不起作用,因为当我检查T eq T it is also returning false.
请帮我写这个eq函数或任何其他写isTop的方法。
答案 0 :(得分:8)
在Agda中是不可能的,但总的来说是not senseless。
你可以写一些不太有意思的东西:
open import Data.Empty
open import Data.Unit
open import Data.Bool
data U : Set where
bot top : U
⟦_⟧ : U -> Set
⟦ bot ⟧ = ⊥
⟦ top ⟧ = ⊤
record Is {α} {A : Set α} (x : A) : Set where
is : ∀ {α} {A : Set α} -> (x : A) -> Is x
is _ = _
isTop : ∀ {u} -> Is ⟦ u ⟧ -> Bool
isTop {bot} _ = false
isTop {top} _ = true
open import Relation.Binary.PropositionalEquality
test-bot : isTop (is ⊥) ≡ false
test-bot = refl
test-top : isTop (is ⊤) ≡ true
test-top = refl
u
可以从Is ⟦ u ⟧
推断出来,因为⟦_⟧
是constructor headed。
Is
是一个单例,因此它允许将值提升到类型级别。您可以找到使用here的示例。