SlideShare une entreprise Scribd logo
1  sur  39
Télécharger pour lire hors ligne
Intro to Agda

by Larry Diehl (larrytheliquid)
Why?
induction centric

data Nat : Set where
  zero : Nat
  suc : Nat -> Nat

one = suc zero
two = suc (suc zero)
unicode centric

data ℕ : Set where
  zero : ℕ
  suc : ℕ → ℕ

suc₂ : ℕ → ℕ
suc₂ n = suc (suc n)
unicode in emacs

r →
bn ℕ
:: ∷
member ∈
equiv ≡
and ∧
or ∨
neg ¬
ex ∃
all ∀
built-ins

data ℕ : Set where
  zero : ℕ
  suc : ℕ → ℕ

{-# BUILTIN NATURAL ℕ #-}
{-# BUILTIN ZERO zero #-}
{-# BUILTIN SUC suc #-}

nine = suc₂ 7
standard library

open import Data.Nat
infix & pattern matching

infixl 6 _+_
infixl 7 _*_
_+_ : ℕ → ℕ → ℕ
zero + n = n
suc m + n = suc (m + n)

_*_ : ℕ → ℕ → ℕ
zero * n = zero
suc m * n = n + m * n
emacs goal mode

_+_ : ℕ → ℕ → ℕ 
n+m=?
 
_+_ : ℕ → ℕ → ℕ
n + m = {!!}

_+_ : ℕ → ℕ → ℕ
n + m = { }0
-- ?0 : ℕ
coverage checking

data Day : Set where
  Sunday Monday Tuesday : Day
  Wednesday Thursday : Day
  Friday Saturday : Day
 
isWeekend : Day → Bool
isWeekend Sunday = true
isWeekend Saturday = true
isWeekend _ = false
termination checking (fail)

isWeekend : Day → Bool
isWeekend day = isWeekend day

isWeekend   : Day → Bool
isWeekend   Sunday = true
isWeekend   Saturday = isWeekend Sunday
isWeekend   _ = false
termination checking (win)

_+_ : ℕ → ℕ → ℕ
zero + n = n
suc m + n = suc (m + n)

_*_ : ℕ → ℕ → ℕ
zero * n = zero
suc m * n = n + m * n
data type polymorphism

data List (A : Set) : Set where
  []  : List A
  _∷_ : (x : A) (xs : List A) → List A

-- open import Data.List
type-restriction

append : List ℕ → List ℕ → List ℕ
append [] ys = ys
append (x ∷ xs) ys = x ∷ (append xs ys)
parametric polymorphism

append : (A : Set) → List A → List A → List A
append A [] ys = ys
append A (x ∷ xs) ys = x ∷ (append A xs ys)
implicit arguments

append : {A : Set} → List A → List A → List A
append [] ys = ys
append (x ∷ xs) ys = x ∷ (append xs ys)

-- append = _++_
indexed types

data Vec (A : Set) : ℕ → Set where
  []  : Vec A zero
  _∷_ : {n : ℕ} (x : A) (xs : Vec A n) →
           Vec A (suc n)

bool-vec : Vec Bool 2
bool-vec = _∷_ {1} true
   (_∷_ {0} false [])
 
bool-vec : Vec Bool 2
bool-vec = true ∷ false ∷ []
indexed types

append : {n m : ℕ} {A : Set} → Vec A n →
  Vec A m → Vec A (n + m)
append [] ys = ys
append (x ∷ xs) ys = x ∷ (append xs ys)
coverage checking

head : {A : Set} → Vec A 9 → A
head (x ∷ xs) = x
 
head : {n : ℕ} {A : Set} → Vec A (suc n) →
 A
head (x ∷ xs) = x
 
head : {n : ℕ} {A : Set} →
  Vec A (1 + 1 * n) → A
head (x ∷ xs) = x
 
records

record Car : Set where
  field
    make : Make
    model : Model
    year : ℕ

electricCar : Car
electricCar = record {
    make = Tesla
  ; model = Roadster
  ; year = 2010
 }
records

record Car : Set where
  constructor _,_,_
  field
    make : Make
    model : Model
    year : ℕ

electricCar : Car
electricCar = Tesla , Roadster , 2010
carYear :  ℕ
carYear = Car.year electricCar
truth & absurdity

record ⊤ : Set where
data ⊥ : Set where

T : Bool → Set
T true = ⊤
T false = ⊥
preconditions

even   : ℕ → Bool
even   zero = true
even   (suc zero) = false
even   (suc (suc n)) = even n

evenSquare : (n : ℕ) → {_ : T (even  n)} → ℕ
evenSquare n = n * n
preconditions

nonZero : ℕ → Bool
nonZero zero = false
nonZero _ = true

postulate _div_ : ℕ → (n : ℕ) → 
  {_ : T (nonZero n)} → ℕ
propositional equality

infix 4 _≡_
data _≡_ {A : Set} (x : A) : A → Set where
  refl : x ≡ x

testMultiplication : 56 ≡ 8 * 7
testMultiplication = refl
preconditions

lookup : {A : Set}(n : ℕ)(xs : List A)
  {_ : T (n < length xs)} → A
lookup n []{()}
lookup zero (x ∷ xs) = x
lookup (suc n) (x ∷ xs) {p} = lookup n xs {p}

testLookup : 2 ≡ lookup 1 (1 ∷ 2 ∷ [])
testLookup = refl
finite sets

data Fin : ℕ → Set where
  zero : {n : ℕ} → Fin (suc n)
  suc  : {n : ℕ} (i : Fin n) → Fin (suc n)

finTest : Fin 3
finTest = zero

finTest₂ : Fin 3
finTest₂ = suc (suc zero)
precondition with indexes

lookup : {A : Set}{n : ℕ} → Fin n → Vec A n → A
lookup zero (x ∷ xs) = x
lookup (suc i) (x ∷ xs) = lookup i xs
 
testLookup : 2 ≡ lookup (suc zero) (1 ∷ 2 ∷ [])
testLookup = refl

testLookup₂ : 2 ≡ lookup (fromℕ 1) (1 ∷ 2 ∷ [])
testLookup₂ = refl
with

doubleOrNothing      :ℕ→ℕ
doubleOrNothing      n with even n
doubleOrNothing      n | true = n * 2
doubleOrNothing      n | false = 0
 
doubleOrNothing      :ℕ→ℕ
doubleOrNothing      n with even n
... | true = n * 2
... | false = 0
views

parity   : (n : ℕ) → Parity n
parity   zero = even zero
parity   (suc n) with parity n
parity   (suc .(k * 2)) | even k = odd k
parity   (suc .(1 + k * 2)) | odd k = even (suc k)

half   :ℕ→ℕ
half   n with parity n
half   .(k * 2) | even k = k
half   .(1 + k * 2) | odd k = k
inverse

data Image_∋_ {A B : Set}(f : A → B) :
  B → Set where
  im : {x : A} → Image f ∋ f x

inv : {A B : Set}(f : A → B)(y : B) →
  Image f ∋ y → A
inv f .(f x) (im {x}) = x
inverse

Bool-to-ℕ : Bool → ℕ
Bool-to-ℕ false = 0
Bool-to-ℕ true = 1

testImage : Image Bool-to-ℕ ∋ 0
testImage = im
testImage₂ : Image Bool-to-ℕ ∋ 1
testImage₂ = im

testInv : inv  Bool-to-ℕ 0 im ≡ false
testInv = refl
testInv₂ : inv  Bool-to-ℕ 1 im ≡ true
testInv₂ = refl
intuitionistic logic

data _∧_ (A B : Set) : Set where
  <_,_> : A → B → A ∧ B

fst : {A B : Set} → A ∧ B → A
fst < a , _ > = a
snd : {A B : Set} → A ∧ B → B
snd < _ , b > = b
intuitionistic logic

data _∨_ (A B : Set) : Set where
  left : A → A ∨ B
  right : B → A ∨ B

case : {A B C : Set} → A ∨ B → (A → C) →
  (B → C) → C
case (left a) x _ = x a
case (right b) _ y = y b
intuitionistic logic

record ⊤ : Set where
  constructor tt

data ⊥ : Set where

exFalso : {A : Set} → ⊥ → A
exFalso ()

¬ : Set → Set
¬A=A→⊥
intuitionistic logic

_=>_ : (A B : Set) → Set
A => B = A → B

modusPonens : {A B : Set} → A => B → A → B
modusPonens f a = f a

_<=>_ : Set → Set → Set
A <=> B = (A => B) ∧ (B => A)
intuitionistic logic

∀′ : (A : Set)(B : A → Set) → Set
∀′ A B = (a : A) → B a

data ∃ (A : Set)(B : A → Set) : Set where
  exists : (a : A) → B a → ∃ A B

witness : {A : Set}{B : A → Set} → ∃ A B → A
witness (exists a _) = a
intuitionistic logic

data Man : Set where
  person : Man

isMan : Man → Set
isMan m = ⊤

isMortal : Man → Set
isMortal m = ⊤

socratesIsMortal : {Socrates : Man} →
  (∀′ Man isMortal ∧ isMan Socrates) => isMortal Socrates
socratesIsMortal {soc} < lemma , _ > = lemma soc
The End

               Agda Wiki
          http://is.gd/8YgYM

Dependently Typed Programming in Agda
           http://is.gd/8Ygyz

      Dependent Types at Work
         http://is.gd/8YggR

        lemmatheultimate.com

Contenu connexe

Tendances

Cg my own programs
Cg my own programsCg my own programs
Cg my own programs
Amit Kapoor
 
ECMAScript 6 major changes
ECMAScript 6 major changesECMAScript 6 major changes
ECMAScript 6 major changes
hayato
 
Rfgtopgffffffffffffffffffffffffffffff
RfgtopgffffffffffffffffffffffffffffffRfgtopgffffffffffffffffffffffffffffff
Rfgtopgffffffffffffffffffffffffffffff
gsxr1810
 
Gauss in java
Gauss in javaGauss in java
Gauss in java
baxter89
 
Factoring Trinomials
Factoring TrinomialsFactoring Trinomials
Factoring Trinomials
guest42b71e
 
P pch4
P pch4P pch4
P pch4
haleca
 

Tendances (17)

CLIM Undergraduate Workshop: (Attachment) Performing Extreme Value Analysis (...
CLIM Undergraduate Workshop: (Attachment) Performing Extreme Value Analysis (...CLIM Undergraduate Workshop: (Attachment) Performing Extreme Value Analysis (...
CLIM Undergraduate Workshop: (Attachment) Performing Extreme Value Analysis (...
 
Integral table
Integral tableIntegral table
Integral table
 
Additional mathematics
Additional mathematicsAdditional mathematics
Additional mathematics
 
Numerical Method Assignment
Numerical Method AssignmentNumerical Method Assignment
Numerical Method Assignment
 
Cg my own programs
Cg my own programsCg my own programs
Cg my own programs
 
하스켈 프로그래밍 입문 4
하스켈 프로그래밍 입문 4하스켈 프로그래밍 입문 4
하스켈 프로그래밍 입문 4
 
하스켈 프로그래밍 입문 3
하스켈 프로그래밍 입문 3하스켈 프로그래밍 입문 3
하스켈 프로그래밍 입문 3
 
Quadratic functions
Quadratic functionsQuadratic functions
Quadratic functions
 
ECMAScript 6 major changes
ECMAScript 6 major changesECMAScript 6 major changes
ECMAScript 6 major changes
 
Rfgtopgffffffffffffffffffffffffffffff
RfgtopgffffffffffffffffffffffffffffffRfgtopgffffffffffffffffffffffffffffff
Rfgtopgffffffffffffffffffffffffffffff
 
Tablas integrales
Tablas integralesTablas integrales
Tablas integrales
 
Integrales
IntegralesIntegrales
Integrales
 
Computer graphics
Computer graphics   Computer graphics
Computer graphics
 
Gauss in java
Gauss in javaGauss in java
Gauss in java
 
The Ring programming language version 1.8 book - Part 73 of 202
The Ring programming language version 1.8 book - Part 73 of 202The Ring programming language version 1.8 book - Part 73 of 202
The Ring programming language version 1.8 book - Part 73 of 202
 
Factoring Trinomials
Factoring TrinomialsFactoring Trinomials
Factoring Trinomials
 
P pch4
P pch4P pch4
P pch4
 

Similaire à Intro To Agda

Евгений Курбацкий. Зачем нужны зависимые типы
Евгений Курбацкий. Зачем нужны зависимые типыЕвгений Курбацкий. Зачем нужны зависимые типы
Евгений Курбацкий. Зачем нужны зависимые типы
Andrey Vlasovskikh
 
Agda であそぼ
Agda であそぼAgda であそぼ
Agda であそぼ
erutuf13
 
Java code to find the closest pair using divide and conquer algorith.pdf
Java code to find the closest pair using divide and conquer algorith.pdfJava code to find the closest pair using divide and conquer algorith.pdf
Java code to find the closest pair using divide and conquer algorith.pdf
fashioncollection2
 
Introduction to Monads in Scala (2)
Introduction to Monads in Scala (2)Introduction to Monads in Scala (2)
Introduction to Monads in Scala (2)
stasimus
 
Fundamentals of AlgebraChu v. NguyenIntegral Exponents
Fundamentals of AlgebraChu v. NguyenIntegral ExponentsFundamentals of AlgebraChu v. NguyenIntegral Exponents
Fundamentals of AlgebraChu v. NguyenIntegral Exponents
DustiBuckner14
 
Real World Haskell: Lecture 5
Real World Haskell: Lecture 5Real World Haskell: Lecture 5
Real World Haskell: Lecture 5
Bryan O'Sullivan
 
curve fitting lecture slides February 24
curve fitting lecture slides February 24curve fitting lecture slides February 24
curve fitting lecture slides February 24
TaiwoD
 
Cs221 lecture4-fall11
Cs221 lecture4-fall11Cs221 lecture4-fall11
Cs221 lecture4-fall11
darwinrlo
 
Assessments for class xi
Assessments  for class  xi Assessments  for class  xi
Assessments for class xi
indu psthakur
 

Similaire à Intro To Agda (20)

Truth, deduction, computation lecture g
Truth, deduction, computation   lecture gTruth, deduction, computation   lecture g
Truth, deduction, computation lecture g
 
Евгений Курбацкий. Зачем нужны зависимые типы
Евгений Курбацкий. Зачем нужны зависимые типыЕвгений Курбацкий. Зачем нужны зависимые типы
Евгений Курбацкий. Зачем нужны зависимые типы
 
04-Sets-Relations-A.pdf
04-Sets-Relations-A.pdf04-Sets-Relations-A.pdf
04-Sets-Relations-A.pdf
 
Folding Unfolded - Polyglot FP for Fun and Profit - Haskell and Scala - with ...
Folding Unfolded - Polyglot FP for Fun and Profit - Haskell and Scala - with ...Folding Unfolded - Polyglot FP for Fun and Profit - Haskell and Scala - with ...
Folding Unfolded - Polyglot FP for Fun and Profit - Haskell and Scala - with ...
 
Folding Unfolded - Polyglot FP for Fun and Profit - Haskell and Scala
Folding Unfolded - Polyglot FP for Fun and Profit - Haskell and ScalaFolding Unfolded - Polyglot FP for Fun and Profit - Haskell and Scala
Folding Unfolded - Polyglot FP for Fun and Profit - Haskell and Scala
 
Agda であそぼ
Agda であそぼAgda であそぼ
Agda であそぼ
 
Java code to find the closest pair using divide and conquer algorith.pdf
Java code to find the closest pair using divide and conquer algorith.pdfJava code to find the closest pair using divide and conquer algorith.pdf
Java code to find the closest pair using divide and conquer algorith.pdf
 
Tema Numeros Reales
Tema Numeros RealesTema Numeros Reales
Tema Numeros Reales
 
Recursive Definitions in Discrete Mathmatcs.pptx
Recursive Definitions in Discrete Mathmatcs.pptxRecursive Definitions in Discrete Mathmatcs.pptx
Recursive Definitions in Discrete Mathmatcs.pptx
 
Algebra formulas
Algebra formulasAlgebra formulas
Algebra formulas
 
Introduction to Monads in Scala (2)
Introduction to Monads in Scala (2)Introduction to Monads in Scala (2)
Introduction to Monads in Scala (2)
 
Intuitionistic First-Order Logic: Categorical semantics via the Curry-Howard ...
Intuitionistic First-Order Logic: Categorical semantics via the Curry-Howard ...Intuitionistic First-Order Logic: Categorical semantics via the Curry-Howard ...
Intuitionistic First-Order Logic: Categorical semantics via the Curry-Howard ...
 
Fundamentals of AlgebraChu v. NguyenIntegral Exponents
Fundamentals of AlgebraChu v. NguyenIntegral ExponentsFundamentals of AlgebraChu v. NguyenIntegral Exponents
Fundamentals of AlgebraChu v. NguyenIntegral Exponents
 
Real World Haskell: Lecture 5
Real World Haskell: Lecture 5Real World Haskell: Lecture 5
Real World Haskell: Lecture 5
 
Appendex
AppendexAppendex
Appendex
 
curve fitting lecture slides February 24
curve fitting lecture slides February 24curve fitting lecture slides February 24
curve fitting lecture slides February 24
 
Cs221 lecture4-fall11
Cs221 lecture4-fall11Cs221 lecture4-fall11
Cs221 lecture4-fall11
 
Assessments for class xi
Assessments  for class  xi Assessments  for class  xi
Assessments for class xi
 
Polynomials and Curve Fitting in MATLAB
Polynomials and Curve Fitting in MATLABPolynomials and Curve Fitting in MATLAB
Polynomials and Curve Fitting in MATLAB
 
Compiling fµn language
Compiling fµn languageCompiling fµn language
Compiling fµn language
 

Dernier

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Dernier (20)

Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 

Intro To Agda

  • 1. Intro to Agda by Larry Diehl (larrytheliquid)
  • 3. induction centric data Nat : Set where   zero : Nat   suc : Nat -> Nat one = suc zero two = suc (suc zero)
  • 4. unicode centric data ℕ : Set where   zero : ℕ   suc : ℕ → ℕ suc₂ : ℕ → ℕ suc₂ n = suc (suc n)
  • 5. unicode in emacs r → bn ℕ :: ∷ member ∈ equiv ≡ and ∧ or ∨ neg ¬ ex ∃ all ∀
  • 6. built-ins data ℕ : Set where   zero : ℕ   suc : ℕ → ℕ {-# BUILTIN NATURAL ℕ #-} {-# BUILTIN ZERO zero #-} {-# BUILTIN SUC suc #-} nine = suc₂ 7
  • 8. infix & pattern matching infixl 6 _+_ infixl 7 _*_ _+_ : ℕ → ℕ → ℕ zero + n = n suc m + n = suc (m + n) _*_ : ℕ → ℕ → ℕ zero * n = zero suc m * n = n + m * n
  • 9. emacs goal mode _+_ : ℕ → ℕ → ℕ  n+m=?   _+_ : ℕ → ℕ → ℕ n + m = {!!} _+_ : ℕ → ℕ → ℕ n + m = { }0 -- ?0 : ℕ
  • 10. coverage checking data Day : Set where   Sunday Monday Tuesday : Day   Wednesday Thursday : Day   Friday Saturday : Day   isWeekend : Day → Bool isWeekend Sunday = true isWeekend Saturday = true isWeekend _ = false
  • 11. termination checking (fail) isWeekend : Day → Bool isWeekend day = isWeekend day isWeekend : Day → Bool isWeekend Sunday = true isWeekend Saturday = isWeekend Sunday isWeekend _ = false
  • 12. termination checking (win) _+_ : ℕ → ℕ → ℕ zero + n = n suc m + n = suc (m + n) _*_ : ℕ → ℕ → ℕ zero * n = zero suc m * n = n + m * n
  • 13. data type polymorphism data List (A : Set) : Set where   []  : List A   _∷_ : (x : A) (xs : List A) → List A -- open import Data.List
  • 14. type-restriction append : List ℕ → List ℕ → List ℕ append [] ys = ys append (x ∷ xs) ys = x ∷ (append xs ys)
  • 15. parametric polymorphism append : (A : Set) → List A → List A → List A append A [] ys = ys append A (x ∷ xs) ys = x ∷ (append A xs ys)
  • 16. implicit arguments append : {A : Set} → List A → List A → List A append [] ys = ys append (x ∷ xs) ys = x ∷ (append xs ys) -- append = _++_
  • 17. indexed types data Vec (A : Set) : ℕ → Set where   []  : Vec A zero   _∷_ : {n : ℕ} (x : A) (xs : Vec A n) →            Vec A (suc n) bool-vec : Vec Bool 2 bool-vec = _∷_ {1} true    (_∷_ {0} false [])   bool-vec : Vec Bool 2 bool-vec = true ∷ false ∷ []
  • 18. indexed types append : {n m : ℕ} {A : Set} → Vec A n →   Vec A m → Vec A (n + m) append [] ys = ys append (x ∷ xs) ys = x ∷ (append xs ys)
  • 19. coverage checking head : {A : Set} → Vec A 9 → A head (x ∷ xs) = x   head : {n : ℕ} {A : Set} → Vec A (suc n) →  A head (x ∷ xs) = x   head : {n : ℕ} {A : Set} →   Vec A (1 + 1 * n) → A head (x ∷ xs) = x  
  • 20. records record Car : Set where   field     make : Make     model : Model     year : ℕ electricCar : Car electricCar = record {     make = Tesla   ; model = Roadster   ; year = 2010  }
  • 21. records record Car : Set where   constructor _,_,_   field     make : Make     model : Model     year : ℕ electricCar : Car electricCar = Tesla , Roadster , 2010 carYear :  ℕ carYear = Car.year electricCar
  • 22. truth & absurdity record ⊤ : Set where data ⊥ : Set where T : Bool → Set T true = ⊤ T false = ⊥
  • 23. preconditions even : ℕ → Bool even zero = true even (suc zero) = false even (suc (suc n)) = even n evenSquare : (n : ℕ) → {_ : T (even  n)} → ℕ evenSquare n = n * n
  • 24. preconditions nonZero : ℕ → Bool nonZero zero = false nonZero _ = true postulate _div_ : ℕ → (n : ℕ) →    {_ : T (nonZero n)} → ℕ
  • 25. propositional equality infix 4 _≡_ data _≡_ {A : Set} (x : A) : A → Set where   refl : x ≡ x testMultiplication : 56 ≡ 8 * 7 testMultiplication = refl
  • 26. preconditions lookup : {A : Set}(n : ℕ)(xs : List A)   {_ : T (n < length xs)} → A lookup n []{()} lookup zero (x ∷ xs) = x lookup (suc n) (x ∷ xs) {p} = lookup n xs {p} testLookup : 2 ≡ lookup 1 (1 ∷ 2 ∷ []) testLookup = refl
  • 27. finite sets data Fin : ℕ → Set where   zero : {n : ℕ} → Fin (suc n)   suc  : {n : ℕ} (i : Fin n) → Fin (suc n) finTest : Fin 3 finTest = zero finTest₂ : Fin 3 finTest₂ = suc (suc zero)
  • 28. precondition with indexes lookup : {A : Set}{n : ℕ} → Fin n → Vec A n → A lookup zero (x ∷ xs) = x lookup (suc i) (x ∷ xs) = lookup i xs   testLookup : 2 ≡ lookup (suc zero) (1 ∷ 2 ∷ []) testLookup = refl testLookup₂ : 2 ≡ lookup (fromℕ 1) (1 ∷ 2 ∷ []) testLookup₂ = refl
  • 29. with doubleOrNothing :ℕ→ℕ doubleOrNothing n with even n doubleOrNothing n | true = n * 2 doubleOrNothing n | false = 0   doubleOrNothing :ℕ→ℕ doubleOrNothing n with even n ... | true = n * 2 ... | false = 0
  • 30. views parity : (n : ℕ) → Parity n parity zero = even zero parity (suc n) with parity n parity (suc .(k * 2)) | even k = odd k parity (suc .(1 + k * 2)) | odd k = even (suc k) half :ℕ→ℕ half n with parity n half .(k * 2) | even k = k half .(1 + k * 2) | odd k = k
  • 31. inverse data Image_∋_ {A B : Set}(f : A → B) :   B → Set where   im : {x : A} → Image f ∋ f x inv : {A B : Set}(f : A → B)(y : B) →   Image f ∋ y → A inv f .(f x) (im {x}) = x
  • 32. inverse Bool-to-ℕ : Bool → ℕ Bool-to-ℕ false = 0 Bool-to-ℕ true = 1 testImage : Image Bool-to-ℕ ∋ 0 testImage = im testImage₂ : Image Bool-to-ℕ ∋ 1 testImage₂ = im testInv : inv  Bool-to-ℕ 0 im ≡ false testInv = refl testInv₂ : inv  Bool-to-ℕ 1 im ≡ true testInv₂ = refl
  • 33. intuitionistic logic data _∧_ (A B : Set) : Set where   <_,_> : A → B → A ∧ B fst : {A B : Set} → A ∧ B → A fst < a , _ > = a snd : {A B : Set} → A ∧ B → B snd < _ , b > = b
  • 34. intuitionistic logic data _∨_ (A B : Set) : Set where   left : A → A ∨ B   right : B → A ∨ B case : {A B C : Set} → A ∨ B → (A → C) →   (B → C) → C case (left a) x _ = x a case (right b) _ y = y b
  • 35. intuitionistic logic record ⊤ : Set where   constructor tt data ⊥ : Set where exFalso : {A : Set} → ⊥ → A exFalso () ¬ : Set → Set ¬A=A→⊥
  • 36. intuitionistic logic _=>_ : (A B : Set) → Set A => B = A → B modusPonens : {A B : Set} → A => B → A → B modusPonens f a = f a _<=>_ : Set → Set → Set A <=> B = (A => B) ∧ (B => A)
  • 37. intuitionistic logic ∀′ : (A : Set)(B : A → Set) → Set ∀′ A B = (a : A) → B a data ∃ (A : Set)(B : A → Set) : Set where   exists : (a : A) → B a → ∃ A B witness : {A : Set}{B : A → Set} → ∃ A B → A witness (exists a _) = a
  • 38. intuitionistic logic data Man : Set where   person : Man isMan : Man → Set isMan m = ⊤ isMortal : Man → Set isMortal m = ⊤ socratesIsMortal : {Socrates : Man} →   (∀′ Man isMortal ∧ isMan Socrates) => isMortal Socrates socratesIsMortal {soc} < lemma , _ > = lemma soc
  • 39. The End Agda Wiki http://is.gd/8YgYM Dependently Typed Programming in Agda http://is.gd/8Ygyz Dependent Types at Work http://is.gd/8YggR lemmatheultimate.com