Skip to content

Instantly share code, notes, and snippets.


Andrej Bauer andrejbauer

View GitHub Profile
andrejbauer / example.agda
Last active April 20, 2023 08:30
Inductive trees in various proof assistants
View example.agda
open import Data.Nat
open import Data.Product
module example where
data SimpleTree (A : Set) : Set where
empty : SimpleTree A
leaf : A -> SimpleTree A
node : A -> SimpleTree A -> SimpleTree A -> SimpleTree A
andrejbauer / wlem.agda
Last active June 9, 2023 09:05
A formal proof that weak excluded middle holds from the familiar facts about real numbers.
View wlem.agda
Weak excluded middle states that for every propostiion P, either ¬¬P or ¬P holds.
We give a proof of weak excluded middle, relying just on basic facts about real numbers,
which we carefully state, in order to make the dependence on them transparent.
Some people might doubt the formalization. To convince yourself that there is no cheating, you should:
* Carefully read the facts listed in the RealFacts below to see that these are all
just familiar facts about the real numbers.
andrejbauer / AgdaSolver.agda
Last active May 30, 2023 21:54
How to use Agda ring solvers to prove equations?
View AgdaSolver.agda
{- Here is a short demonstration on how to use Agda's solvers that automatically
prove equations. It seems quite impossible to find complete worked examples
of how Agda solvers are used.
Thanks go to @anormalform who helped out with these on Twitter, see
I welcome improvements and additions to this file.
This file works with Agda and standard-library-1.7.1
andrejbauer / Set2Bool.v
Created May 25, 2022 22:08
A proof in Coq that `Set -> bool` is not equal to `Set`.
View Set2Bool.v
Require Import Setoid.
Definition coerce {A B : Type} : A = B -> A -> B.
intros [] a.
exact a.
Lemma coerce_coerce {A B : Type} (e : A = B) (b : B) :
coerce e (coerce (eq_sym e) b) = b.
andrejbauer / Epimorphism.agda
Last active January 26, 2023 20:44
A setoid satisfies choice if, and only if its equivalence relation is equality.
View Epimorphism.agda
open import Level
open import Relation.Binary
open import Data.Product
open import Data.Unit
open import Agda.Builtin.Sigma
open import Relation.Binary.PropositionalEquality renaming (refl to ≡-refl; trans to ≡-trans; sym to ≡-sym; cong to ≡-cong)
open import Relation.Binary.PropositionalEquality.Properties
open import Function.Equality hiding (setoid)
module Epimorphism where
andrejbauer / Queue.agda
Last active September 1, 2021 23:23
An implementation of infinite queues fashioned after the von Neuman ordinals
View Queue.agda
open import Data.Nat
open import Data.Maybe
open import Data.Product
-- An implementation of infinite queues fashioned after the von Neuman ordinals
module Queue where
infixl 5 _⊕_
andrejbauer / Primrec.agda
Created July 6, 2021 10:21
Primitive recursive functions in Agda
View Primrec.agda
open import Data.Nat
open import Data.Fin as Fin
module Primrec where
-- The datatype of primitive recursive function
data PR : ∀ (k : ℕ) → Set where
pr-zero : PR 0 -- zero
pr-succ : PR 1 -- successor
pr-proj : ∀ {k} (i : Fin k) → PR k -- projection
andrejbauer / Corey.agda
Created June 1, 2021 22:46
The type of bit streams is uncountable.
View Corey.agda
open import Data.Bool
open import Data.Empty
open import Agda.Builtin.Nat
open import Agda.Builtin.Sigma
open import Relation.Binary.PropositionalEquality
module Corey where
-- streams of bits
record Stream : Set where
andrejbauer / finite.v
Created February 5, 2021 21:14
The finite truth values are precisely the decidable truth values.
View finite.v
(** Prop is a complete lattice. We can ask which propositions are finite. *)
Definition directed (D : Prop -> Prop) :=
(exists p , D p) /\ forall p q, D p -> D q -> exists r, D r /\ (p -> r) /\ (q -> r).
(** A proposition p is finite when it has the following property:
for any directed D, if p ≤ sup D then there is q ∈ D such that p ≤ q. *)
Definition finite (p : Prop) :=
forall D, directed D ->
(p -> exists q, D q /\ q) -> exists q, D q /\ (p -> q).
andrejbauer / doubleNegationInitialAlgebra.agda
Created January 4, 2021 23:53
The initial algebra for the functor X ↦ (X → ∅) → ∅ is ∅.
View doubleNegationInitialAlgebra.agda
-- empty type
data 𝟘 : Set where
absurd : {A : Set} → 𝟘 → A
absurd ()
-- booleans
data 𝟚 : Set where
false true : 𝟚