Então esse é o problema que tenho em uma tarefa de casa, tenho que provar que bool não é igual a top, também tenho um sinal de igual redefinido que devo usar.
module TranspEq where
open import Agda.Primitive
open import Agda.Builtin.Equality renaming (_≡_ to _≡ᵣ_ ; refl to reflᵣ)
open import Agda.Builtin.Nat renaming (Nat to ℕ)
_≡_ : ∀{ℓ}{A : Set ℓ} → A → A → Setω
_≡_ {A = A} a b = ∀{κ}(P : A → Set κ) → P a → P b
infix 4 _≡_
-- define conversion between the two 'equals'
transp : ∀{ℓ}{A : Set ℓ}(a b : A) → a ≡ b → a ≡ᵣ b
transp a b x = x (_≡ᵣ_ a) reflᵣ
untransp : ∀{ℓ}{A : Set ℓ}(a b : A) → a ≡ᵣ b → a ≡ b
untransp a .a reflᵣ P y = y
-- prove properties of ≡
refl : ∀{ℓ}{A : Set ℓ}{a : A} → a ≡ a
refl P a = a
sym : ∀{ℓ}{A : Set ℓ}{a b : A} → a ≡ b → b ≡ a
sym {l} {A} {a} {b} = λ z P → z (λ z₁ → (x : P z₁) → P a) (λ x → x)
trans : ∀{ℓ}{A : Set ℓ}{a b c : A} → a ≡ b → b ≡ c → a ≡ c
trans = λ a b P c → b P (a P c)
cong : ∀{ℓ κ}{A : Set ℓ}{B : Set κ}(f : A → B){a b : A} → a ≡ b → f a ≡ f b
cong = λ f a P → a (λ b → P (f b))
-- types
record ⊤ : Set where
instance constructor tt
data Bool : Set where
true : Bool
false : Bool
data ⊥ : Set where
_≢_ : ∀{ℓ}{A : Set ℓ} → A → A → Setω
a ≢ b = a ≡ b → ⊥
Bool≠⊤ : Bool ≢ ⊤
Bool≠⊤ = {!!}
Eu tentei algo assim, mas sim, não consegui:/não consigo criar um predicado que seja Set -> Set
⊤≠⊥ : ⊤ ≢ ⊥
⊤≠⊥ x = x (λ x → x) tt
Bool≠⊤ : Bool ≢ ⊤
Bool≠⊤ x = ⊤≠⊥ λ P y → {! !}
--Bool≠⊤ : Bool ≢ ⊤
--Bool≠⊤ x = x (λ y → y tt) p
-- where
-- p : {Set : (Bool ≡ ⊤)}→ ⊥
-- p (true ≡ tt) = ⊥
-- p (false ≡ tt) = ⊥
A única maneira de provar que dois conjuntos são diferentes em Agda é explorar as suas diferenças em termos de cardinalidade.
No caso de
Bool
e⊤
isso é particularmente útil para explorar, porque cada elemento de⊤
é igual a todos os outros elementos dele, o que não é verdade paraBool
(true
não é igual afalse
). Portanto, tudo que você precisa éO primeiro passo é pensar em um predicado
P : Set → Set
tal queP Bool
seja habitado eP ⊤
refutável, ou vice-versa. Agda não vai te ajudar muito na escolha de um bom porqueSet → Set
é um tipo muito vago, com muitos habitantes (a maioria deles inúteis para você). Deixarei esta escolhaP
principalmente como um exercício, mas darei algumas dicas, visto que acho que encontrar talP
é o ponto principal desta questão do dever de casa.Na verdade, achei mais fácil fazer o contrário – escolher um
P
withP ⊤
butP Bool → ⊥
. Ao produzir talP
, você normalmente usaráT : Set
uma abstração λ. IssoT
será instanciado para⊤
eBool
pela definição de_≡_
. Com issoT
, você pode quantificar universalmente os elementos usando(x : T) → ...
. Se você conheceu os tipos Σ (pares dependentes), poderá usá-los para quantificação existencial, embora eu finalmente tenha encontrado uma propriedade que precisava apenas de quantificação universal. Você não pode usar_≡_
para produzir o necessárioSet
devido a problemas de tamanho, mas pode usar_≡ᵣ_
em seu lugar. Você não pode combinar padrõesT
com seus habitantes, porque eles não sãodata
ourecord
tipo.Eu precisava de um lema
true≢ᵣfalse : true ≡ᵣ false → ⊥
. Eu provei isso por meio de correspondência de padrões absurda (()
), mas também deve ser provadountransp
e definido uma propriedade de booleanos que é verdadeiratrue
e falsa defalse
. Essa propriedade é mais fácil de definir, no sentido de que é do tipoBool → Set
, para que você possa combinar padrões noBool
argumento.A prova resultante deve ser semelhante à seguinte. Eu recomendaria começar com just
true≢ᵣfalse ?
e preencherP
andp
, que informará quantos argumentossym q P p
devem ser necessários.