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: 0 ∈ ℕ,
-- ℕ-introduction: zero ∈ ℕ,
-- a ∈ ℕ | (suc a) ∈ ℕ.
-- a ∈ ℕ | (suc a) ∈ ℕ.
--
--

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


-- 1.2. The even natural numbers.
{-# BUILTIN NATURAL ℕ #-}
--
data 2×ℕ : ℕ → Set where
zero₁ : 2×ℕ zero
2+_ : {m : ℕ} → 2×ℕ m → 2×ℕ (suc (suc m) )

-- 1.3. The odd natural numbers.
--
data 2×ℕ+1 : ℕ → Set where
one : 2×ℕ+1 (suc zero)
2+_ : {m : ℕ} → 2×ℕ+1 m → 2×ℕ+1 (suc (suc m) )


-- 2.1. The rule of addition.
-- 2.1. The rule of addition.
--
--
-- via ℕ-elimination.
-- via ℕ-elimination.
--
--
infixl 6 _+_
infixl 6 _+_
_+_ : ℕ → ℕ → ℕ
_+_ : ℕ → ℕ → ℕ
0 + n = n
zero + n = n
suc m + n = suc (m + n)
suc m + n = suc (m + n)

-- 1.2. The even natural numbers.
--
data 2×ℕ : ℕ → Set where
zero : 2×ℕ 0
2+_ : {m : ℕ} → 2×ℕ m → 2×ℕ (2 + m)

-- 1.3. The odd natural numbers.
--
data 2×ℕ+1 : ℕ → Set where
one : 2×ℕ+1 1
2+_ : {m : ℕ} → 2×ℕ+1 m → 2×ℕ+1 (2 + m)


-- 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 zero n = n
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 0 _ _ = refl
+-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 0 → ((m : ℕ) → P m → P (suc m)) → (m : ℕ) → P m
ind : (P : ℕ → Set) → P zero → ((m : ℕ) → P m → P (suc m)) → (m : ℕ) → P m
ind _ P₀ _ 0 = 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 0
P₀ : P zero
P₀ = refl
P₀ = refl
is : (m : ℕ) → P m → P (1 + m)
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 + 0 ≡ m
m+0≡m : (m : ℕ) → m + zero ≡ m
m+0≡m 0 = refl
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 + (1 + n) ≡ 1 + (m + n)
m+1+n≡1+m+n : (m n : ℕ) → m + (suc n) ≡ suc (m + n)
m+1+n≡1+m+n 0 n = refl
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 0 n = sym (m+0≡m n)
+-commutative zero n = sym (m+0≡m n)
+-commutative (suc m) n =
+-commutative (suc m) n =
begin
begin
(suc m + n)
suc m + n
~⟨ refl ⟩
~⟨ refl ⟩
(suc (m + n) )
suc (m + n)
~⟨ cong suc (+-commutative m n) ⟩
~⟨ cong suc (+-commutative m n) ⟩
(suc (n + m) )
suc (n + m)
~⟨ sym (m+1+n≡1+m+n n m) ⟩
~⟨ sym (m+1+n≡1+m+n n m) ⟩
(n + suc 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 zero zero = {!!}
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 (.m + .n)
-- ?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 zero zero ()
even+even≢odd zero₁ zero₁ ()
even+even≢odd zero (2+ n) (2+ m+n) = even+even≢odd zero n m+n
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: