Skip to content

Linear-time implementation of Data.Nat.Properties.≤′⇒≤? #2442

Open
@jamesmckinna

Description

@jamesmckinna

In a recent Zulip thread the question was raised as to whether a linear-time implementation of the coercion from _≤′_ to _≤_ was possible. After some experiments (and not going via recompute), I wondered about the following:

m≤′n⇒m≤o+n′ : m ≤′ n   {o p}  .(o + n ≡ p)  m ≤ p
m≤′n⇒m≤o+n′ ≤′-refl {o = o} eq = cast-≤ʳ (trans (+-comm _ o) eq) (m≤m+n _ o)
m≤′n⇒m≤o+n′ (≤′-step m≤′n) {o = o} eq = m≤′n⇒m≤o+n′ m≤′n {o = suc o} (trans (sym (+-suc o _)) eq)

m≤′n⇒m≤o+n : m ≤′ n   o  m ≤ o + n
m≤′n⇒m≤o+n m≤′n o = m≤′n⇒m≤o+n′ m≤′n refl

≤′⇒≤ : _≤′_ ⇒ _≤_
≤′⇒≤ m≤′n = m≤′n⇒m≤o+n m≤′n 0

with (independently useful... for replacing uses of subst when dealing with _≤_...?) linear-time coercions given by:

cast-≤ˡ : .(m ≡ o)  m ≤ n  o ≤ n
cast-≤ˡ {o = zero}  _  z≤n       = z≤n
cast-≤ˡ {o = suc _} eq (s≤s m≤n) = s≤s (cast-≤ˡ (cong pred eq) m≤n)

cast-≤ʳ : .(n ≡ o)  m ≤ n  m ≤ o
cast-≤ʳ             _  z≤n       = z≤n
cast-≤ʳ {o = suc _} eq (s≤s m≤n) = s≤s (cast-≤ʳ (cong pred eq) m≤n)

More generally, should we (now start to) reconsider Data.Nat.Properties from the perspective of making its proofs (as well as the definitions in Data.Nat.Base) more computationally efficient?

NB further optimisation may be possible in the base case

m≤′n⇒m≤o+n′ ≤′-refl {o = o} eq = cast-≤ʳ (trans (+-comm _ o) eq) (m≤m+n _ o)

by fusing cast-≤ʳ and the (linear-time!) call to m≤m+n _ o... but I think the above is opaque enough already ;-)

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