Idris2/libs/base/Data/Nat/Views.idr

37 lines
1.2 KiB
Idris
Raw Normal View History

2020-05-18 15:59:07 +03:00
module Data.Nat.Views
import Control.WellFounded
||| View for dividing a Nat in half
public export
data Half : Nat -> Type where
HalfOdd : (n : Nat) -> Half (S (n + n))
HalfEven : (n : Nat) -> Half (n + n)
||| View for dividing a Nat in half, recursively
public export
data HalfRec : Nat -> Type where
HalfRecZ : HalfRec Z
HalfRecEven : (n : Nat) -> (rec : Lazy (HalfRec n)) -> HalfRec (n + n)
HalfRecOdd : (n : Nat) -> (rec : Lazy (HalfRec n)) -> HalfRec (S (n + n))
||| Covering function for the `Half` view
public export
half : (n : Nat) -> Half n
half Z = HalfEven Z
half (S k) with (half k)
half (S (S (n + n))) | HalfOdd n = rewrite plusSuccRightSucc (S n) n in
HalfEven (S n)
half (S (n + n)) | HalfEven n = HalfOdd n
public export total
halfRec : (n : Nat) -> HalfRec n
halfRec n with (sizeAccessible n)
halfRec Z | acc = HalfRecZ
halfRec (S n) | acc with (half n)
halfRec (S (S (k + k))) | Access acc | HalfOdd k
= rewrite plusSuccRightSucc (S k) k
in HalfRecEven _ (halfRec (S k) | acc (S k) (LTESucc (LTESucc (lteAddRight _))))
halfRec (S (k + k)) | Access acc | HalfEven k
= HalfRecOdd _ (halfRec k | acc k (LTESucc (lteAddRight _)))