Proof: Difference between revisions
Content added Content deleted
(→{{header|Agda}}: Fixed Agda example) |
(→{{header|Agda}}: Updated Agda example) |
||
Line 36: | Line 36: | ||
-- 1.1. The natural numbers. |
-- 1.1. The natural numbers. |
||
-- |
-- |
||
-- ℕ-formation: ℕ is set. |
-- ℕ-formation: ℕ is set. |
||
-- |
-- |
||
-- ℕ-introduction: |
-- ℕ-introduction: zero ∈ ℕ, |
||
-- |
-- a ∈ ℕ | (suc a) ∈ ℕ. |
||
-- |
-- |
||
data ℕ : Set where |
data ℕ : Set where |
||
zero : ℕ |
zero : ℕ |
||
suc : ℕ → ℕ |
suc : ℕ → ℕ |
||
⚫ | |||
{-# BUILTIN NATURAL ℕ #-} |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
-- 2.1. The rule of addition. |
-- 2.1. The rule of addition. |
||
-- |
-- |
||
-- via ℕ-elimination. |
-- via ℕ-elimination. |
||
-- |
-- |
||
infixl 6 _+_ |
infixl 6 _+_ |
||
_+_ : ℕ → ℕ → ℕ |
_+_ : ℕ → ℕ → ℕ |
||
zero + n = n |
|||
suc m + n = suc (m + n) |
suc m + n = suc (m + n) |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
-- 3.1. Sum of any two even numbers is even. |
-- 3.1. Sum of any two even numbers is even. |
||
-- |
-- |
||
-- This function takes any two even numbers and returns their sum as an even |
-- This function takes any two even numbers and returns their sum as an even |
||
-- number, this is the type, i.e. logical proposition, algorithm itself is a |
-- number, this is the type, i.e. logical proposition, algorithm itself is a |
||
Line 77: | Line 74: | ||
-- typechecker performs that proof (by unification, so that this is a form of |
-- typechecker performs that proof (by unification, so that this is a form of |
||
-- compile-time verification). |
-- compile-time verification). |
||
-- |
-- |
||
even+even≡even : {m n : ℕ} → 2×ℕ m → 2×ℕ n → 2×ℕ (m + n) |
even+even≡even : {m n : ℕ} → 2×ℕ m → 2×ℕ n → 2×ℕ (m + n) |
||
even+even≡even |
even+even≡even zero₁ n = n |
||
even+even≡even (2+ m) n = 2+ (even+even≡even m n) |
even+even≡even (2+ m) n = 2+ (even+even≡even m n) |
||
-- The identity type (for propositional equality). |
-- The identity type (for propositional equality). |
||
-- |
-- |
||
infix 4 _≡_ |
infix 4 _≡_ |
||
data _≡_ {A : Set} (m : A) : A → Set where |
data _≡_ {A : Set} (m : A) : A → Set where |
||
Line 101: | Line 98: | ||
-- 3.2.1. Direct proof of the associativity of addition using propositional |
-- 3.2.1. Direct proof of the associativity of addition using propositional |
||
-- equality. |
-- equality. |
||
-- |
-- |
||
+-associative : (m n p : ℕ) → (m + n) + p ≡ m + (n + p) |
+-associative : (m n p : ℕ) → (m + n) + p ≡ m + (n + p) |
||
+-associative |
+-associative zero _ _ = refl |
||
+-associative (suc m) n p = cong suc (+-associative m n p) |
+-associative (suc m) n p = cong suc (+-associative m n p) |
||
-- Proof _of_ mathematical induction on the natural numbers. |
-- Proof _of_ mathematical induction on the natural numbers. |
||
-- |
-- |
||
-- P 0, ∀ x. P x → P (suc x) | ∀ x. P x. |
-- P 0, ∀ x. P x → P (suc x) | ∀ x. P x. |
||
-- |
-- |
||
ind : (P : ℕ → Set) → P |
ind : (P : ℕ → Set) → P zero → ((m : ℕ) → P m → P (suc m)) → (m : ℕ) → P m |
||
ind _ P₀ _ |
ind _ P₀ _ zero = P₀ |
||
ind P P₀ next (suc n) = next n (ind P P₀ next n) |
ind P P₀ next (suc n) = next n (ind P P₀ next n) |
||
-- 3.2.2. The associativity of addition by induction (with propositional |
-- 3.2.2. The associativity of addition by induction (with propositional |
||
-- equality, again). |
-- equality, again). |
||
-- |
-- |
||
+-associative′ : (m n p : ℕ) → (m + n) + p ≡ m + (n + p) |
+-associative′ : (m n p : ℕ) → (m + n) + p ≡ m + (n + p) |
||
+-associative′ m n p = ind P P₀ is m |
+-associative′ m n p = ind P P₀ is m |
||
Line 122: | Line 119: | ||
P : ℕ → Set |
P : ℕ → Set |
||
P m = m + n + p ≡ m + (n + p) |
P m = m + n + p ≡ m + (n + p) |
||
P₀ : P |
P₀ : P zero |
||
P₀ = refl |
P₀ = refl |
||
is : (m : ℕ) → P m → P ( |
is : (m : ℕ) → P m → P (suc m) |
||
is _ Pi = cong suc Pi |
is _ Pi = cong suc Pi |
||
Line 148: | Line 145: | ||
-- Some helper proofs. |
-- Some helper proofs. |
||
m+0≡m : (m : ℕ) → m + |
m+0≡m : (m : ℕ) → m + zero ≡ m |
||
m+0≡m |
m+0≡m zero = refl |
||
m+0≡m (suc m) = cong suc (m+0≡m m) |
m+0≡m (suc m) = cong suc (m+0≡m m) |
||
m+1+n≡1+m+n : (m n : ℕ) → m + ( |
m+1+n≡1+m+n : (m n : ℕ) → m + (suc n) ≡ suc (m + n) |
||
m+1+n≡1+m+n |
m+1+n≡1+m+n zero n = refl |
||
m+1+n≡1+m+n (suc m) n = cong suc (m+1+n≡1+m+n m n) |
m+1+n≡1+m+n (suc m) n = cong suc (m+1+n≡1+m+n m n) |
||
-- 3.3. The commutativity of addition using equational reasoning. |
-- 3.3. The commutativity of addition using equational reasoning. |
||
-- |
-- |
||
+-commutative : (m n : ℕ) → m + n ≡ n + m |
+-commutative : (m n : ℕ) → m + n ≡ n + m |
||
+-commutative |
+-commutative zero n = sym (m+0≡m n) |
||
+-commutative (suc m) n = |
+-commutative (suc m) n = |
||
begin |
begin |
||
suc m + n |
|||
~⟨ refl ⟩ |
~⟨ refl ⟩ |
||
suc (m + n) |
|||
~⟨ cong suc (+-commutative m n) ⟩ |
~⟨ cong suc (+-commutative m n) ⟩ |
||
suc (n + m) |
|||
~⟨ sym (m+1+n≡1+m+n n m) ⟩ |
~⟨ sym (m+1+n≡1+m+n n m) ⟩ |
||
n + suc m |
|||
∎ |
∎ |
||
-- 3.4. |
-- 3.4. |
||
-- |
-- |
||
even+even≡odd : {m n : ℕ} → 2×ℕ m → 2×ℕ n → 2×ℕ+1 (m + n) |
even+even≡odd : {m n : ℕ} → 2×ℕ m → 2×ℕ n → 2×ℕ+1 (m + n) |
||
even+even≡odd |
even+even≡odd zero₁ zero₁ = {!!} |
||
even+even≡odd _ _ = {!!} |
even+even≡odd _ _ = {!!} |
||
-- ^ |
-- ^ |
||
-- That gives |
-- That gives |
||
-- |
-- |
||
-- ?0 : 2×ℕ+1 (zero + zero) |
-- ?0 : 2×ℕ+1 (zero + zero) |
||
-- ?1 : 2×ℕ+1 ( |
-- ?1 : 2×ℕ+1 (m + n) |
||
-- |
-- |
||
-- but 2×ℕ+1 (zero + zero) = 2×ℕ+1 0 which is uninhabited, so that this proof |
-- but 2×ℕ+1 (zero + zero) = 2×ℕ+1 0 which is uninhabited, so that this proof |
||
-- can not be writen. |
-- can not be writen. |
||
-- |
-- |
||
-- The absurd (obviously uninhabited) type. |
-- The absurd (obviously uninhabited) type. |
||
-- |
-- |
||
-- ⊥-introduction is empty. |
-- ⊥-introduction is empty. |
||
-- |
-- |
||
data ⊥ : Set where |
data ⊥ : Set where |
||
-- The negation of a proposition. |
-- The negation of a proposition. |
||
-- |
-- |
||
infix 6 ¬_ |
infix 6 ¬_ |
||
¬_ : Set → Set |
¬_ : Set → Set |
||
Line 200: | Line 196: | ||
-- 4.1. Disproof or proof by contradiction. |
-- 4.1. Disproof or proof by contradiction. |
||
-- |
-- |
||
-- To disprove even+even≡odd we assume that even+even≡odd and derive |
-- To disprove even+even≡odd we assume that even+even≡odd and derive |
||
-- absurdity, i.e. uninhabited type. |
-- absurdity, i.e. uninhabited type. |
||
-- |
-- |
||
even+even≢odd : {m n : ℕ} → 2×ℕ m → 2×ℕ n → ¬ 2×ℕ+1 (m + n) |
even+even≢odd : {m n : ℕ} → 2×ℕ m → 2×ℕ n → ¬ 2×ℕ+1 (m + n) |
||
even+even≢odd |
even+even≢odd zero₁ zero₁ () |
||
even+even≢odd |
even+even≢odd zero₁ (2+ n) (2+ m+n) = even+even≢odd zero₁ n m+n |
||
even+even≢odd (2+ m) n (2+ m+n) = even+even≢odd m n m+n |
even+even≢odd (2+ m) n (2+ m+n) = even+even≢odd m n m+n |
||
-- 4.2. |
-- 4.2. |
||
-- |
-- |
||
-- even+even≢even : {m n : ℕ} → 2×ℕ m → 2×ℕ n → ¬ 2×ℕ (m + n) |
-- even+even≢even : {m n : ℕ} → 2×ℕ m → 2×ℕ n → ¬ 2×ℕ (m + n) |
||
-- even+even≢even zero zero () |
-- even+even≢even zero zero () |
||
-- ^ |
-- ^ |
||
-- rejected with the following message: |
-- rejected with the following message: |
||
-- |
-- |
||
-- 2×ℕ zero should be empty, but the following constructor patterns |
-- 2×ℕ zero should be empty, but the following constructor patterns |
||
-- are valid: |
-- are valid: |