[Agda] ordering uniqueness

Twan van Laarhoven twanvl at gmail.com
Thu Oct 10 18:29:58 CEST 2013


Hello Marco,


I think this is easiest to prove by induction on m and n. See the attachment for 
my alternative proof.

I just typed in the theorem, used C-c,C-c to split on m and n. The only 
interesting case is (suc m) (suc n). There you need induction, together with 
some lemmas to show that this is actually possible. To prove the lemmas, again I 
used case splitting together with auto to fill in the right hand side.


As a remark on style, the case splitting often exposes hidden variables with 
irrelevant arguments. You can often clean that up quite a bit. For example your 
'swap' function can be written as just

     swap : ∀ {m n} → Ordering m n → Ordering n m
     swap (less m k) = greater m k
     swap (equal n) = equal n
     swap (greater n k) = less n k


Twan

On 10/10/13 00:10, Marco Maggesi wrote:
> Hello!
>
> I'm new to Agda.
> I wrote a proof of the following theorem
> ​ (see
> attached file)​:
>
>
> ​  ​
> ordering-uniqueness : {m n : ℕ} {x y : Ordering m n} → x ≡ y
>
> I'd be interested to see if there
> ​are​
>   simpler proof
> ​s​ of the same fact.
> Also general remarks about idiom and style are welcome.
>
> Thanks,
> Marco
>
>
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
>

-------------- next part --------------
module 2013-10-10-ordering-uniqueness where

open import Function
open import Data.Nat
open import Data.Nat.Properties
open import Relation.Binary.PropositionalEquality

ordering-suc : {m n : ℕ} → Ordering m n → Ordering (suc m) (suc n)
ordering-suc (less m k) = less (suc m) k
ordering-suc (equal m) = equal (suc m)
ordering-suc (greater m k) = greater (suc m) k

ordering-pred : {m n : ℕ} → Ordering (suc m) (suc n) → Ordering m n
ordering-pred (less ._ k) = less _ k
ordering-pred (equal ._) = equal _
ordering-pred (greater ._ k) = greater _ k

ordering-suc-pred : {m n : ℕ} → (x : Ordering (suc m) (suc n)) → ordering-suc (ordering-pred x) ≡ x
ordering-suc-pred (less ._ _) = refl
ordering-suc-pred (equal ._) = refl
ordering-suc-pred (greater ._ _) = refl

ordering-unique : (m n : ℕ) (x y : Ordering m n) → x ≡ y
ordering-unique zero zero (equal .0) (equal .0) = refl
ordering-unique zero (suc n) (less .0 .n) (less .0 .n) = refl
ordering-unique (suc m) zero (greater .0 .m) (greater .0 .m) = refl
ordering-unique (suc m) (suc n) x y = 
  sym (ordering-suc-pred x) ⟨ trans ⟩
  cong ordering-suc (ordering-unique m n (ordering-pred x) (ordering-pred y)) ⟨ trans ⟩
  ordering-suc-pred y

swap : ∀ {m n} → Ordering m n → Ordering n m
swap (less m k) = greater m k
swap (equal n) = equal n
swap (greater n k) = less n k


More information about the Agda mailing list