got Negation and Quantification to compile
This commit is contained in:
parent
b31d8eba50
commit
18dd52b4d0
3 changed files with 558 additions and 0 deletions
254
src/Negation.lagda
Normal file
254
src/Negation.lagda
Normal file
|
@ -0,0 +1,254 @@
|
|||
---
|
||||
title : "Negation: Negation, with Classical and Intuitionistic Logic"
|
||||
layout : page
|
||||
permalink : /Negation
|
||||
---
|
||||
|
||||
## Imports
|
||||
|
||||
\begin{code}
|
||||
import Relation.Binary.PropositionalEquality as Eq
|
||||
open Eq using (_≡_; refl; sym; trans; cong)
|
||||
open Eq.≡-Reasoning
|
||||
open import Isomorphism using (_≃_; ≃-sym; ≃-trans; _≲_)
|
||||
open Isomorphism.≃-Reasoning
|
||||
open import Data.Nat using (ℕ; zero; suc; _+_; _*_)
|
||||
open import Data.Nat.Properties.Simple using (+-suc)
|
||||
open import Data.Empty using (⊥; ⊥-elim)
|
||||
open import Data.Sum using (_⊎_; inj₁; inj₂)
|
||||
open import Data.Product using (_×_; _,_; proj₁; proj₂)
|
||||
open import Function using (_∘_)
|
||||
\end{code}
|
||||
|
||||
|
||||
## Negation
|
||||
|
||||
Given a proposition `A`, the negation `¬ A` holds if `A` cannot hold.
|
||||
We formalise this idea by declaring negation to be the same
|
||||
as implication of false.
|
||||
\begin{code}
|
||||
¬_ : Set → Set
|
||||
¬ A = A → ⊥
|
||||
\end{code}
|
||||
This is a form of *proof by contradiction*: if assuming `A` leads
|
||||
to the conclusion `⊥` (a contradiction), then we must have `¬ A`.
|
||||
|
||||
Evidence that `¬ A` holds is of the form
|
||||
|
||||
λ (x : A) → N
|
||||
|
||||
where `N` is a term of type `⊥` containing as a free variable `x` of type `A`.
|
||||
In other words, evidence that `¬ A` holds is a function that converts evidence
|
||||
that `A` holds into evidence that `⊥` holds.
|
||||
|
||||
Given evidence that both `¬ A` and `A` hold, we can conclude that `⊥` holds.
|
||||
In other words, if both `¬ A` and `A` hold, then we have a contradiction.
|
||||
\begin{code}
|
||||
¬-elim : ∀ {A : Set} → ¬ A → A → ⊥
|
||||
¬-elim ¬a a = ¬a a
|
||||
\end{code}
|
||||
Here we write `¬a` for evidence of `¬ A` and `a` for evidence of `A`. This
|
||||
means that `¬a` must be a function of type `A → ⊥`, and hence the application
|
||||
`¬a a` must be of type `⊥`. Note that this rule is just a special case of `→-elim`.
|
||||
|
||||
We set the precedence of negation so that it binds more tightly
|
||||
than disjunction and conjunction, but more tightly than anything else.
|
||||
\begin{code}
|
||||
infix 3 ¬_
|
||||
\end{code}
|
||||
Thus, `¬ A × ¬ B` parses as `(¬ A) × (¬ B)`.
|
||||
|
||||
In *classical* logic, we have that `A` is equivalent to `¬ ¬ A`.
|
||||
As we discuss below, in Agda we use *intuitionistic* logic, wher
|
||||
we have only half of this equivalence, namely that `A` implies `¬ ¬ A`.
|
||||
\begin{code}
|
||||
¬¬-intro : ∀ {A : Set} → A → ¬ ¬ A
|
||||
¬¬-intro a ¬a = ¬a a
|
||||
\end{code}
|
||||
Let `a` be evidence of `A`. We will show that assuming
|
||||
`¬ A` leads to a contradiction, and hence `¬ ¬ A` must hold.
|
||||
Let `¬a` be evidence of `¬ A`. Then from `A` and `¬ A`
|
||||
we have a contradiction (evidenced by `¬a a`). Hence, we have
|
||||
shown `¬ ¬ A`.
|
||||
|
||||
We cannot show that `¬ ¬ A` implies `A`, but we can show that
|
||||
`¬ ¬ ¬ A` implies `¬ A`.
|
||||
\begin{code}
|
||||
¬¬¬-elim : ∀ {A : Set} → ¬ ¬ ¬ A → ¬ A
|
||||
¬¬¬-elim ¬¬¬a a = ¬¬¬a (¬¬-intro a)
|
||||
\end{code}
|
||||
Let `¬¬¬a` be evidence of `¬ ¬ ¬ A`. We will show that assuming
|
||||
`A` leads to a contradiction, and hence `¬ A` must hold.
|
||||
Let `a` be evidence of `A`. Then by the previous result, we
|
||||
can conclude `¬ ¬ A` (evidenced by `¬¬-intro a`). Then from
|
||||
`¬ ¬ ¬ A` and `¬ ¬ A` we have a contradiction (evidenced by
|
||||
`¬¬¬a (¬¬-intro a)`. Hence we have shown `¬ A`.
|
||||
|
||||
Another law of logic is the *contrapositive*,
|
||||
stating that if `A` implies `B`, then `¬ B` implies `¬ A`.
|
||||
\begin{code}
|
||||
contrapositive : ∀ {A B : Set} → (A → B) → (¬ B → ¬ A)
|
||||
contrapositive a→b ¬b a = ¬b (a→b a)
|
||||
\end{code}
|
||||
Let `a→b` be evidence of `A → B` and let `¬b` be evidence of `¬ B`. We
|
||||
will show that assuming `A` leads to a contradiction, and hence
|
||||
`¬ A` must hold. Let `a` be evidence of `A`. Then from `A → B` and
|
||||
`A` we may conclude `B` (evidenced by `a→b a`), and from `B` and `¬ B`
|
||||
we may conclude `⊥` (evidenced by `¬b (a→b a)`). Hence, we have shown
|
||||
`¬ A`.
|
||||
|
||||
Given the correspondence of implication to exponentiation and
|
||||
false to the type with no members, we can view negation as
|
||||
raising to the zero power. This indeed corresponds to what
|
||||
we know for arithmetic, where
|
||||
|
||||
0 ^ n = 1, if n = 0
|
||||
= 0, if n ≠ 0
|
||||
|
||||
Indeed, there is exactly one proof of `⊥ → ⊥`.
|
||||
\begin{code}
|
||||
id : ⊥ → ⊥
|
||||
id x = x
|
||||
\end{code}
|
||||
However, there are no possible values of type `Bool → ⊥`
|
||||
or `ℕ → bot`.
|
||||
|
||||
[TODO?: Give the proof that one cannot falsify law of the excluded middle,
|
||||
including a variant of the story from Call-by-Value is Dual to Call-by-Name.]
|
||||
|
||||
The law of the excluded middle is irrefutable.
|
||||
\begin{code}
|
||||
excluded-middle-irrefutable : ∀ {A : Set} → ¬ ¬ (A ⊎ ¬ A)
|
||||
excluded-middle-irrefutable k = k (inj₂ (λ a → k (inj₁ a)))
|
||||
\end{code}
|
||||
|
||||
*Exercise* (`¬⊎≃׬`)
|
||||
|
||||
Show that conjunction, disjunction, and negation are related by a
|
||||
version of De Morgan's Law.
|
||||
\begin{code}
|
||||
postulate
|
||||
¬⊎≃׬ : ∀ {A B : Set} → ¬ (A ⊎ B) ≃ (¬ A) × (¬ B)
|
||||
\end{code}
|
||||
This result is an easy consequence of something we've proved previously.
|
||||
|
||||
Do we also have the following?
|
||||
|
||||
¬ (A × B) ≃ (¬ A) ⊎ (¬ B)
|
||||
|
||||
If so, prove; if not, explain why.
|
||||
|
||||
|
||||
## Intuitive and Classical logic
|
||||
|
||||
In Gilbert and Sullivan's *The Gondoliers*, Casilda is told that
|
||||
as an infant she was married to the heir of the King of Batavia, but
|
||||
that due to a mix-up no one knows which of two individuals, Marco or
|
||||
Giuseppe, is the heir. Alarmed, she wails ``Then do you mean to say
|
||||
that I am married to one of two gondoliers, but it is impossible to
|
||||
say which?'' To which the response is ``Without any doubt of any kind
|
||||
whatever.''
|
||||
|
||||
Logic comes in many varieties, and one distinction is between
|
||||
*classical* and *intuitionistic*. Intuitionists, concerned
|
||||
by cavalier assumptions made by some logicians about the nature of
|
||||
infinity, insist upon a constructionist notion of truth. In
|
||||
particular, they insist that a proof of `A ⊎ B` must show
|
||||
*which* of `A` or `B` holds, and hence they would reject the
|
||||
claim that Casilda is married to Marco or Giuseppe until one of the
|
||||
two was identified as her husband. Perhaps Gilbert and Sullivan
|
||||
anticipated intuitionism, for their story's outcome is that the heir
|
||||
turns out to be a third individual, Luiz, with whom Casilda is,
|
||||
conveniently, already in love.
|
||||
|
||||
Intuitionists also reject the law of the excluded
|
||||
middle, which asserts `A ⊎ ¬ A` for every `A`, since the law
|
||||
gives no clue as to *which* of `A` or `¬ A` holds. Heyting
|
||||
formalised a variant of Hilbert's classical logic that captures the
|
||||
intuitionistic notion of provability. In particular, the law of the
|
||||
excluded middle is provable in Hilbert's logic, but not in Heyting's.
|
||||
Further, if the law of the excluded middle is added as an axiom to
|
||||
Heyting's logic, then it becomes equivalent to Hilbert's.
|
||||
Kolmogorov
|
||||
showed the two logics were closely related: he gave a double-negation
|
||||
translation, such that a formula is provable in classical logic if and
|
||||
only if its translation is provable in intuitionistic logic.
|
||||
|
||||
Propositions as Types was first formulated for intuitionistic logic.
|
||||
It is a perfect fit, because in the intuitionist interpretation the
|
||||
formula `A ⊎ B` is provable exactly when one exhibits either a proof
|
||||
of `A` or a proof of `B`, so the type corresponding to disjunction is
|
||||
a disjoint sum.
|
||||
|
||||
(The passage above is taken from "Propositions as Types", Philip Wadler,
|
||||
*Communications of the ACM*, December 2015.)
|
||||
|
||||
**Exercise** Prove the following five formulas are equivalent.
|
||||
|
||||
\begin{code}
|
||||
¬¬-elim excluded-middle peirce implication de-morgan : Set₁
|
||||
¬¬-elim = ∀ {A : Set} → ¬ ¬ A → A
|
||||
excluded-middle = ∀ {A : Set} → A ⊎ ¬ A
|
||||
peirce = ∀ {A B : Set} → (((A → B) → A) → A)
|
||||
implication = ∀ {A B : Set} → (A → B) → ¬ A ⊎ B
|
||||
de-morgan = ∀ {A B : Set} → ¬ (A × B) → ¬ A ⊎ ¬ B
|
||||
\end{code}
|
||||
|
||||
<!--
|
||||
|
||||
It turns out that an assertion such as `Set : Set` is paradoxical.
|
||||
Therefore, there are an infinite number of different levels of sets,
|
||||
where `Set lzero : Set lone` and `Set lone : Set ltwo`, and so on,
|
||||
where `lone` is `lsuc lzero`, and `ltwo` is `lsuc lone`, analogous to
|
||||
the way we represent the natural nuambers. So far, we have only used
|
||||
the type `Set`, which is equivalent to `Set lzero`. Here, since each
|
||||
of `double-negation` and the others defines a type, we need to use
|
||||
`Set₁` as the "type of types".
|
||||
|
||||
-->
|
||||
|
||||
[NOTES]
|
||||
|
||||
Two halves of de Morgan's laws hold intuitionistically. The other two
|
||||
halves are each equivalent to the law of double negation.
|
||||
|
||||
\begin{code}
|
||||
dem1 : ∀ {A B : Set} → A × B → ¬ (¬ A ⊎ ¬ B)
|
||||
dem1 (a , b) (inj₁ ¬a) = ¬a a
|
||||
dem1 (a , b) (inj₂ ¬b) = ¬b b
|
||||
|
||||
dem2 : ∀ {A B : Set} → A ⊎ B → ¬ (¬ A × ¬ B)
|
||||
dem2 (inj₁ a) (¬a , ¬b) = ¬a a
|
||||
dem2 (inj₂ b) (¬a , ¬b) = ¬b b
|
||||
\end{code}
|
||||
|
||||
For the other variant of De Morgan's law, one way is an isomorphism.
|
||||
\begin{code}
|
||||
-- dem-≃ : ∀ {A B : Set} → (¬ (A ⊎ B)) ≃ (¬ A × ¬ B)
|
||||
-- dem-≃ = →-distributes-⊎
|
||||
\end{code}
|
||||
|
||||
The other holds in only one direction.
|
||||
\begin{code}
|
||||
dem-half : ∀ {A B : Set} → ¬ A ⊎ ¬ B → ¬ (A × B)
|
||||
dem-half (inj₁ ¬a) (a , b) = ¬a a
|
||||
dem-half (inj₂ ¬b) (a , b) = ¬b b
|
||||
\end{code}
|
||||
|
||||
The other variant does not appear to be equivalent to classical logic.
|
||||
So that undermines my idea that basic propositions are either true
|
||||
intuitionistically or equivalent to classical logic.
|
||||
|
||||
For several of the laws equivalent to classical logic, the reverse
|
||||
direction holds in intuitionistic long.
|
||||
\begin{code}
|
||||
implication-inv : ∀ {A B : Set} → (¬ A ⊎ B) → A → B
|
||||
implication-inv (inj₁ ¬a) a = ⊥-elim (¬a a)
|
||||
implication-inv (inj₂ b) a = b
|
||||
|
||||
demorgan-inv : ∀ {A B : Set} → A ⊎ B → ¬ (¬ A × ¬ B)
|
||||
demorgan-inv (inj₁ a) (¬a , ¬b) = ¬a a
|
||||
demorgan-inv (inj₂ b) (¬a , ¬b) = ¬b b
|
||||
\end{code}
|
||||
|
||||
|
234
src/Quantifiers.lagda
Normal file
234
src/Quantifiers.lagda
Normal file
|
@ -0,0 +1,234 @@
|
|||
---
|
||||
title : "Quantifiers: Universals and Existentials"
|
||||
layout : page
|
||||
permalink : /Quantifiers
|
||||
---
|
||||
|
||||
## Imports
|
||||
|
||||
\begin{code}
|
||||
import Relation.Binary.PropositionalEquality as Eq
|
||||
open Eq using (_≡_; refl; sym; trans; cong)
|
||||
open Eq.≡-Reasoning
|
||||
open import Isomorphism using (_≃_; ≃-sym; ≃-trans; _≲_)
|
||||
open Isomorphism.≃-Reasoning
|
||||
open import Data.Nat using (ℕ; zero; suc; _+_; _*_)
|
||||
open import Data.Nat.Properties.Simple using (+-suc)
|
||||
open import Relation.Nullary using (¬_)
|
||||
open import Function using (_∘_)
|
||||
\end{code}
|
||||
|
||||
In what follows, we will occasionally require [extensionality][extensionality].
|
||||
\begin{code}
|
||||
postulate
|
||||
extensionality : ∀ {A B : Set} {f g : A → B} → (∀ (x : A) → f x ≡ g x) → f ≡ g
|
||||
\end{code}
|
||||
|
||||
[extensionality]: Equality/index.html#extensionality
|
||||
|
||||
|
||||
## Universals
|
||||
|
||||
Given a variable `x` of type `A` and a proposition `B[x]` which
|
||||
contains `x` as a free variable, the universally quantified
|
||||
proposition `∀ (x : A) → B[x]` holds if for every term `M` of type
|
||||
`A` the proposition `B[M]` holds. Here `B[M]` stands for
|
||||
the proposition `B[x]` with each free occurrence of `x` replaced by
|
||||
`M`. The variable `x` appears free in `B[x]` but bound in
|
||||
`∀ (x : A) → B[x]`. We formalise universal quantification using the
|
||||
dependent function type, which has appeared throughout this book.
|
||||
|
||||
Evidence that `∀ (x : A) → B[x]` holds is of the form
|
||||
|
||||
λ (x : A) → N[x]
|
||||
|
||||
where `N[x]` is a term of type `B[x]`; here `N[x]` is a term and `B[x]`
|
||||
is a proposition (or type) both containing as a free variable `x` of
|
||||
type `A`. Given a term `L` providing evidence that `∀ (x : A) → B[x]`
|
||||
holds and a term `M` of type `A`, the term `L M` provides evidence
|
||||
that `B[M]` holds. In other words, evidence that `∀ (x : A) → B[x]`
|
||||
holds is a function that converts a term `M` of type `A` into evidence
|
||||
that `B[M]` holds.
|
||||
|
||||
Put another way, if we know that `∀ (x : A) → B[x]` holds and that `M`
|
||||
is a term of type `A` then we may conclude that `B[M]` holds. In
|
||||
medieval times, this rule was known by the name *dictum de omni*.
|
||||
|
||||
If we introduce a universal and the immediately eliminate it, we can
|
||||
always simplify the resulting term. Thus
|
||||
|
||||
(λ (x : A) → N[x]) M
|
||||
|
||||
simplifies to `N[M]` of type `B[M]`, where `N[M]` stands for the term
|
||||
`N[x]` with each free occurrence of `x` replaced by `M` of type `A`.
|
||||
|
||||
Unlike with conjunction, disjunction, and implication, there is no simple
|
||||
analogy between universals and arithmetic.
|
||||
|
||||
|
||||
## Existentials
|
||||
|
||||
Given a variable `x` of type `A` and a proposition `B[x]` which
|
||||
contains `x` as a free variable, the existentially quantified
|
||||
proposition `∃ (λ (x : A) → B[x])` holds if for some term `M` of type
|
||||
`A` the proposition `B[M]` holds. Here `B[M]` stands for
|
||||
the proposition `B[x]` with each free occurrence of `x` replaced by
|
||||
`M`. The variable `x` appears free in `B[x]` but bound in
|
||||
`∃ (λ (x : A) → B[x])`.
|
||||
|
||||
It is common to adopt a notation such as `∃[ x : A ]→ B[x]`,
|
||||
which introduces `x` as a bound variable of type `A` that appears
|
||||
free in `B[x]` and bound in `∃[ x : A ]→ B[x]`. We won't do
|
||||
that here, but instead use the lambda notation built-in to Agda
|
||||
to introduce `x` as a bound variable.
|
||||
|
||||
We formalise existential quantification by declaring a suitable
|
||||
inductive type.
|
||||
\begin{code}
|
||||
data ∃ {A : Set} (B : A → Set) : Set where
|
||||
_,_ : (x : A) → B x → ∃ B
|
||||
\end{code}
|
||||
Evidence that `∃ (λ (x : A) → B[x])` holds is of the form
|
||||
`(M , N)` where `M` is a term of type `A`, and `N` is evidence
|
||||
that `B[M]` holds.
|
||||
|
||||
Given evidence that `∃ (λ (x : A) → B[x])` holds, and
|
||||
given evidence that `∀ (x : A) → B[x] → C` holds, where `C` does
|
||||
not contain `x` as a free variable, we may conclude that `C` holds.
|
||||
\begin{code}
|
||||
∃-elim : ∀ {A : Set} {B : A → Set} {C : Set} → ∃ B → (∀ (x : A) → B x → C) → C
|
||||
∃-elim (M , N) P = P M N
|
||||
\end{code}
|
||||
In other words, if we know for every `x` of type `A` that `B[x]`
|
||||
implies `C`, and we know for some `x` of type `A` that `B[x]` holds,
|
||||
then we may conclude that `C` holds. This is because we may
|
||||
instantiate that proof that `∀ (x : A) → B[x] → C` to any `x`, and we
|
||||
may choose the particular `x` provided by the evidence that `∃ (λ (x :
|
||||
A) → B[x])`.
|
||||
|
||||
|
||||
[It would be better to have even and odd as an exercise. Is there
|
||||
a simpler example that I could start with?]
|
||||
|
||||
As an example, recall the definitions of `even` from
|
||||
Chapter [Relations](Relations).
|
||||
\begin{code}
|
||||
data even : ℕ → Set where
|
||||
ev0 : even zero
|
||||
ev+2 : ∀ {n : ℕ} → even n → even (suc (suc n))
|
||||
\end{code}
|
||||
A number is even if it is zero, or if it is two
|
||||
greater than an even number.
|
||||
|
||||
We will show that a number is even if and only if it is twice some
|
||||
other number. That is, number `n` is even if and only if there exists
|
||||
a number `m` such that twice `m` is `n`.
|
||||
|
||||
First, we need a lemma, which allows us to
|
||||
simplify twice the successor of `m` to two
|
||||
more than twice `m`.
|
||||
\begin{code}
|
||||
lemma : ∀ (m : ℕ) → 2 * suc m ≡ suc (suc (2 * m))
|
||||
lemma m =
|
||||
begin
|
||||
2 * suc m
|
||||
≡⟨⟩
|
||||
suc m + (suc m + zero)
|
||||
≡⟨⟩
|
||||
suc (m + (suc (m + zero)))
|
||||
≡⟨ cong suc (+-suc m (m + zero)) ⟩
|
||||
suc (suc (m + (m + zero)))
|
||||
≡⟨⟩
|
||||
suc (suc (2 * m))
|
||||
∎
|
||||
\end{code}
|
||||
The lemma is straightforward, and uses the lemma
|
||||
`+-suc` from Chapter [Properties](Properties), which
|
||||
allows us to simplify `m + suc n` to `suc (m + n)`.
|
||||
|
||||
Here is the proof in the forward direction.
|
||||
\begin{code}
|
||||
ev-ex : ∀ {n : ℕ} → even n → ∃(λ (m : ℕ) → 2 * m ≡ n)
|
||||
ev-ex ev0 = (zero , refl)
|
||||
ev-ex (ev+2 ev) with ev-ex ev
|
||||
... | (m , refl) = (suc m , lemma m)
|
||||
\end{code}
|
||||
Given an even number, we must show it is twice some
|
||||
other number. The proof is a function, which
|
||||
given a proof that `n` is even
|
||||
returns a pair consisting of `m` and a proof
|
||||
that twice `m` is `n`. The proof is by induction over
|
||||
the evidence that `n` is even.
|
||||
|
||||
- If the number is even because it is zero, then we return a pair
|
||||
consisting of zero and the (trivial) proof that twice zero is zero.
|
||||
|
||||
- If the number is even because it is two more than another even
|
||||
number `n`, then we apply the induction hypothesis, giving us a number
|
||||
`m` and a proof that `2 * m ≡ n`, which we match against `refl`. We
|
||||
return a pair consisting of `suc m` and a proof that `2 * suc m ≡ suc
|
||||
(suc n)`, which follows from `2 * m ≡ n` and the lemma.
|
||||
|
||||
Here is the proof in the reverse direction.
|
||||
\begin{code}
|
||||
ex-ev : ∀ {n : ℕ} → ∃(λ (m : ℕ) → 2 * m ≡ n) → even n
|
||||
ex-ev (zero , refl) = ev0
|
||||
ex-ev (suc m , refl) rewrite lemma m = ev+2 (ex-ev (m , refl))
|
||||
\end{code}
|
||||
Given a number that is twice some other number,
|
||||
we must show that it is even. The proof is a function,
|
||||
which given a number `m` and a proof that `n` is twice `m`,
|
||||
returns a proof that `n` is even. The proof is by induction
|
||||
over the number `m`.
|
||||
|
||||
- If it is zero, then we must show that twice zero is even,
|
||||
which follows by rule `ev0`.
|
||||
|
||||
- If it is `suc m`, then we must show that `2 * suc m` is
|
||||
even. After rewriting with our lemma, we must show that
|
||||
`suc (suc (2 * m))` is even. The inductive hypothesis tells
|
||||
us `2 * m` is even, from which the desired result follows
|
||||
by rule `ev+2`.
|
||||
|
||||
Negation of an existential is isomorphic to universal
|
||||
of a negation. Considering that existentials are generalised
|
||||
disjuntion and universals are generalised conjunction, this
|
||||
result is analogous to the one which tells us that negation
|
||||
of a disjuntion is isomorphic to a conjunction of negations.
|
||||
\begin{code}
|
||||
¬∃∀ : ∀ {A : Set} {B : A → Set} → (¬ ∃ (λ (x : A) → B x)) ≃ ∀ (x : A) → ¬ B x
|
||||
¬∃∀ =
|
||||
record
|
||||
{ to = λ { ¬∃bx x bx → ¬∃bx (x , bx) }
|
||||
; from = λ { ∀¬bx (x , bx) → ∀¬bx x bx }
|
||||
; from∘to = λ { ¬∃bx → extensionality (λ { (x , bx) → refl }) }
|
||||
; to∘from = λ { ∀¬bx → refl }
|
||||
}
|
||||
\end{code}
|
||||
In the `to` direction, we are given a value `¬∃bx` of type
|
||||
`¬ ∃ (λ (x : A) → B x)`, and need to show that given a value
|
||||
`x` of type `A` that `¬ B x` follows, in other words, from
|
||||
a value `bx` of type `B x` we can derive false. Combining
|
||||
`x` and `bx` gives us a value `(x , bx)` of type `∃ (λ (x : A) → B x)`,
|
||||
and applying `¬∃bx` to that yields a contradiction.
|
||||
|
||||
In the `from` direction, we are given a value `∀¬bx` of type
|
||||
`∀ (x : A) → ¬ B x`, and need to show that from a value `(x , bx)`
|
||||
of type `∃ (λ (x : A) → B x)` we can derive false. Applying `∀¬bx`
|
||||
to `x` gives a value of type `¬ B x`, and applying that to `bx` yields
|
||||
a contradiction.
|
||||
|
||||
The two inverse proofs are straightforward, where one direction
|
||||
requires extensionality.
|
||||
|
||||
*Exercise* Show `∃ (λ (x : A) → ¬ B x) → ¬ (∀ (x : A) → B x)`.
|
||||
|
||||
|
||||
|
||||
## Unicode
|
||||
|
||||
This chapter introduces the following unicode.
|
||||
|
||||
≤ U+2264 LESS-THAN OR EQUAL TO (\<=, \le)
|
||||
|
||||
|
70
src/extra/Eta.agda
Normal file
70
src/extra/Eta.agda
Normal file
|
@ -0,0 +1,70 @@
|
|||
import Relation.Binary.PropositionalEquality as Eq
|
||||
open Eq using (_≡_; refl; sym; trans; cong)
|
||||
open Eq.≡-Reasoning
|
||||
open import Function using (_∘_)
|
||||
open import Data.Product using (_×_) using (_,_; proj₁; proj₂)
|
||||
open import Data.Sum using (_⊎_; inj₁; inj₂)
|
||||
open import Data.Unit using (⊤; tt)
|
||||
open import Data.Empty using (⊥; ⊥-elim)
|
||||
|
||||
|
||||
postulate
|
||||
extensionality : ∀ {A B : Set} {f g : A → B} → (∀ (x : A) → f x ≡ g x) → f ≡ g
|
||||
|
||||
β-×₁ : ∀ {A B : Set} (x : A) (y : B) → proj₁ (x , y) ≡ x
|
||||
β-×₁ x y = refl
|
||||
|
||||
β-×₂ : ∀ {A B : Set} (x : A) (y : B) → proj₂ (x , y) ≡ y
|
||||
β-×₂ x y = refl
|
||||
|
||||
η-× : ∀ {A B : Set} (w : A × B) → (proj₁ w , proj₂ w) ≡ w
|
||||
η-× (x , y) = refl
|
||||
|
||||
uniq-× : ∀ {A B C : Set} (h : C → A × B) (v : C) → (proj₁ (h v) , proj₂ (h v)) ≡ h v
|
||||
uniq-× h v = η-× (h v)
|
||||
|
||||
⊎-elim : ∀ {A B C : Set} → (A → C) → (B → C) → (A ⊎ B → C)
|
||||
⊎-elim f g (inj₁ x) = f x
|
||||
⊎-elim f g (inj₂ y) = g y
|
||||
|
||||
β-⊎₁ : ∀ {A B C : Set} (f : A → C) (g : B → C) (x : A) → ⊎-elim f g (inj₁ x) ≡ f x
|
||||
β-⊎₁ f g x = refl
|
||||
|
||||
β-⊎₂ : ∀ {A B C : Set} (f : A → C) (g : B → C) (y : B) → ⊎-elim f g (inj₂ y) ≡ g y
|
||||
β-⊎₂ f g x = refl
|
||||
|
||||
η-⊎ : ∀ {A B : Set} (w : A ⊎ B) → ⊎-elim inj₁ inj₂ w ≡ w
|
||||
η-⊎ (inj₁ x) = refl
|
||||
η-⊎ (inj₂ y) = refl
|
||||
|
||||
natural-⊎ : ∀ {A B C D : Set} (f : A → C) (g : B → C) (h : C → D) (w : A ⊎ B) → ⊎-elim (h ∘ f) (h ∘ g) w ≡ (h ∘ ⊎-elim f g) w
|
||||
natural-⊎ f g h (inj₁ x) = refl
|
||||
natural-⊎ f g h (inj₂ y) = refl
|
||||
|
||||
uniq-⊎ : ∀ {A B C : Set} (h : A ⊎ B → C) (w : A ⊎ B) → ⊎-elim (h ∘ inj₁) (h ∘ inj₂) w ≡ h w
|
||||
uniq-⊎ h w rewrite natural-⊎ inj₁ inj₂ h w | η-⊎ w = refl
|
||||
|
||||
η-⊤ : ∀ (w : ⊤) → tt ≡ w
|
||||
η-⊤ tt = refl
|
||||
|
||||
uniq-⊤ : ∀ {C : Set} (h : C → ⊤) (v : C) → tt ≡ h v
|
||||
uniq-⊤ h v = η-⊤ (h v)
|
||||
|
||||
η-⊥ : ∀ (w : ⊥) → ⊥-elim w ≡ w
|
||||
η-⊥ ()
|
||||
|
||||
natural-⊥ : ∀ {C D : Set} (h : C → D) (w : ⊥) → ⊥-elim w ≡ (h ∘ ⊥-elim) w
|
||||
natural-⊥ h ()
|
||||
|
||||
uniq-⊥ : ∀ {C : Set} (h : ⊥ → C) (w : ⊥) → ⊥-elim w ≡ h w
|
||||
uniq-⊥ h w rewrite natural-⊥ h w | η-⊥ w = refl
|
||||
|
||||
η-→ : ∀ {A B : Set} (f : A → B) → (λ{x → f x}) ≡ f
|
||||
η-→ {A} {B} f = extensionality η-helper
|
||||
where
|
||||
η-lhs : A → B
|
||||
η-lhs = λ{x → f x}
|
||||
|
||||
η-helper : (x : A) → η-lhs x ≡ f x
|
||||
η-helper x = refl
|
||||
|
Loading…
Reference in a new issue