[Agda] more unification using more complex with abstractions
rick
rick at rickmurphy.org
Tue Jul 31 20:31:40 CEST 2018
Sorry, one correction on mu below.
Instead of what I listed, please use the following:
_>>_ : {X Y Z : Set} -> (X -> Y) -> (Y -> Z) -> (X -> Z)
(f >> g) x = g (f x)
mu : ∀ {X} -> (xss : List (List X))
-> listMap (unit >> mult) xss == xss
mu [] = refl []
mu (xs ,- xs₁) with listMap (unit >> mult) xs₁ | mu xs₁
... | r | s = {!!}
I got lazy and thought I could remove the composition operator, but it's
just as east to list it.
--
rick
On 07/31/2018 02:00 PM, rick wrote:
> Given
>
> data List (X : Set) : Set where
> [] : List X
> _,-_ : (x : X)(xs : List X) -> List X
>
> data _==_ {X : Set} : X -> X -> Set where
> refl : (x : X) -> x == x
>
> _++_ : {A : Set} -> List A -> List A -> List A
> [] ++ ys = ys
> (x ,- xs) ++ ys = x ,- (xs ++ ys)
>
> foldr : {A B : Set} -> (A -> B -> B) -> B -> List A -> B
> foldr c n [] = n
> foldr c n (x ,- xs) = c x (foldr c n xs)
>
> unit : ∀{A} -> A -> List A
> unit x = x ,- []
>
> mult : {X : Set} -> List (List X) -> List X
> mult = foldr _++_ []
>
> Agda unifies the following:
>
> um : ∀ {X} -> (xs : List X) -> mult (unit xs) == xs
> um [] = refl []
> um (x ,- xs) with mult (unit xs) | um xs
> um (x ,- []) | [] | s = refl (x ,- [])
> um (x ,- (x₁ ,- xs)) | [] | ()
> um (x ,- .(x₁ ,- [])) | x₁ ,- []
> | refl .(x₁ ,- []) = refl (x ,- (x₁ ,- []))
> um (x ,- .(x₁ ,- (x₂ ,- r))) | x₁ ,- (x₂ ,- r)
> | refl .(x₁ ,- (x₂ ,- r))
> = refl (x ,- (x₁ ,- (x₂ ,- r)))
>
> which proves propositional equality if you add a layer to the outside
> of the list then flatten it.
>
> The initial goal before pattern matching on with abstractions was (x
> ,- r) == (x ,- xs).
>
> However, given
>
>
> listMap : {A B : Set} -> (A -> B) -> List A -> List B
> listMap f xs = foldr (\ x r -> f x ,- r) [] xs
>
> Agda does not unify the following :
>
> mu : ∀ {X} -> (xss : List (List X))
> -> listMap (mult (unit xss)) == xss
> mu [] = refl []
> mu (xs ,- xs₁) with listMap (mult (unit xs₁)) | mu xs₁
> ... | r | s = {! ((xs ++ []) ,- r) == (xs ,- xs₁) !}
>
> which adds a layer to each list inside the list of lists, then
> flattens it.
>
> I should qualify my statement and say does not unify within a few
> pattern matching attempts before I stop to assess whether I can simplify.
>
> I can prove the following lemma :
>
> lem : ∀{X} -> (xs : List X)
> -> (xs ++ []) == xs
> lem [] = refl []
> lem (x ,- xs) with (xs ++ []) | lem xs
> lem (x ,- []) | [] | s = refl (x ,- [])
> lem (x ,- (x₁ ,- xs)) | [] | ()
> lem (x ,- []) | x₁ ,- [] | ()
> lem (x ,- []) | x₁ ,- (x₂ ,- r) | ()
> lem (x ,- (x₁ ,- xs)) | .x₁ ,- .xs | refl .(x₁ ,- xs) = refl (x ,- (x₁
> ,- xs))
>
> which seems to allow for proving the concatenation on the first
> component of the pair on the left hand side.
>
> Can I use the lemma and if so how can I use it to cause Agda to unify mu?
>
> Thanks in advance for your help! And for all the great work on Agda.
>
--
rick
More information about the Agda
mailing list