Skip to content

Instantly share code, notes, and snippets.

@Rotsor
Last active May 24, 2017 23:02
Show Gist options
  • Save Rotsor/021b532e5828ac2fd8af57654fc96bf8 to your computer and use it in GitHub Desktop.
Save Rotsor/021b532e5828ac2fd8af57654fc96bf8 to your computer and use it in GitHub Desktop.
module problem3 where
-- see:
-- https://www.reddit.com/r/DailyProver/comments/6d4oct/finite_cancellative_semigroups/
-- https://coq-math-problems.github.io/Problem3/
open import Relation.Binary.PropositionalEquality
open import Data.Product
Injective : {A B : Set} (f : A B) Set
Injective f = x y f x ≡ f y x ≡ y
Surjective : {A B : Set} (f : A B) Set
Surjective f = fx ∃ (λ x f x ≡ fx)
Dedekind-finite : Set Set
Dedekind-finite X = {f : X X} Injective f Surjective f
record Assumptions : Set₁ where
field
A : Set
finite : Dedekind-finite A
add : A A A
assoc : a b c add (add a b) c ≡ add a (add b c)
cancellationʳ : x a b add a x ≡ add b x a ≡ b
cancellationˡ : x a b add x a ≡ add x b a ≡ b
nonempty : A
record Result (AA : Assumptions) : Set where
open Assumptions AA
field
identity : A
inverse : A A
identityˡ : x add identity x ≡ x
identityʳ : x add x identity ≡ x
inverseˡ : x add (inverse x) x ≡ identity
inverseʳ : x add x (inverse x) ≡ identity
module _ (AA : Assumptions) where
open Assumptions AA
example = nonempty
subtract : A A A
subtract a b = proj₁ (finite (cancellationʳ b) a)
subtract-law : a b add (subtract a b) b ≡ a
subtract-law a b = proj₂ (finite (cancellationʳ b) a)
identity = subtract example example
identityʳ : x add x identity ≡ x
identityʳ x = cancellationʳ example _ _ (
trans
(assoc _ _ _)
(cong (add x)
(subtract-law example example)))
identityˡ : x add identity x ≡ x
identityˡ x =
cancellationˡ example _ _ (trans
(sym (assoc example identity x))
(cong (λ z add z x) (identityʳ example)))
inverse = λ x subtract identity x
inverseˡ : x add (inverse x) x ≡ identity
inverseˡ = subtract-law identity
inverseʳ : x add x (inverse x) ≡ identity
inverseʳ x =
cancellationʳ x _ _
(trans
(trans (assoc _ _ _) (trans (cong (add x) (inverseˡ x))
((identityʳ _)))) (sym (identityˡ _)))
result : Result AA
result = record
{ identity = identity
; inverse = inverse
; identityˡ = identityˡ
; identityʳ = identityʳ
; inverseˡ = inverseˡ
; inverseʳ = inverseʳ
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment