Skip to content

[ refactor ] Possible refactoring of #2509 / #2513 ? #2517

Closed
@jamesmckinna

Description

@jamesmckinna

This issue may be regarded (and hence instantly dismissed) as a status:duplicate of #2509... but posted for 'documentation'/alternative implementation purposes.

I'm happy with the merged #2513 , fixing #2509 , and so too is the author of the OP. Thanks to @MatthewDaggitt for the speedy turnround time!

That said, a brain-worm has been worrying away at me as to whether a pattern-matching-free solution was available (slightly better abstraction wrt presentation/implementation of the Sublist relation...?), and it seems there is: relative to the existing solution in Data.List.Relation.Unary.All.Properties, we can refactor as follows

all⊆concat : (xss : List (List A)) → All (Sublist._⊆ (concat xss)) xss
all⊆concat {A = A} xss = All.tabulate xs∈xss⇒xs⊆concat[xss] where
  xs∈xss⇒xs⊆concat[xss] : xs ∈ xss → xs Sublist.⊆ concat xss
  xs∈xss⇒xs⊆concat[xss] {xs = xs} xs∈xss
    with prf ← Sublist.concat⁺ (Sublist.map Sublist.⊆-reflexive (Sublist.from∈ xs∈xss))
    rewrite List.++-identityʳ xs
    = prf

(and further simplification may be even be possible in the definition of prf itself? The ⊆-reflexive step is to pass from a rather simple relation via map to the more complex iterated Sublist (Sublist R) ... so this seems to have the flavour of the triangular identities for Sublist as a suitable 'monad' on relations... but I can't quite see the details yet)

This suggests that we might, instead, refactor by lifting out the above where-bound lemma into a self-standing one in Data.List.Relation.Binary.Sublist.Propositional.Properties (maybe even in Setoid? but then the proposed refactoring seems to stumble on the parameterisation on the Setoid, and the lemma shifts from A to List A... :-(, so perhaps the answer is to pull back all the way to Heterogeneous.Properties?) of the form

xs∈xss⇒xs⊆concat[xss] : xs ∈ xss  xs ⊆ concat xss
xs∈xss⇒xs⊆concat[xss] {xs = xs} xs∈xss
  with prf  concat⁺ (Sublist.map ⊆-reflexive (from∈ xs∈xss))
  rewrite List.++-identityʳ xs
  = prf

leaving the final implementation (under Data.List.Relation.Unary.All.Properties? or should this move as well?) simply as:

all⊆concat : (xss : List (List A))  All (Sublist._⊆ (concat xss)) xss
all⊆concat {A = A} xss = All.tabulate Sublist.xs∈xss⇒xs⊆concat[xss]

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions