@@ -0,0 +1,38 @@
1+module Data.Nat.Views
2+
3+ltAcc : (m : Nat) -> LT n m -> Accessible LT n
4+ltAcc Z x = absurd x
5+ltAcc (S k) (LTESucc x) = Access (\val, p => ltAcc k (lteTransitive p x))
6+
7+public export
8+data Half : Nat -> Type where
9+ HalfOdd : Half (S (n + n))
10+ HalfEven : Half (n + n)
11+
12+public export
13+data HalfRec : Nat -> Type where
14+ HalfRecZ : HalfRec 0
15+ HalfRecEven : Lazy (HalfRec n) -> HalfRec (n + n)
16+ HalfRecOdd : Lazy (HalfRec n) -> HalfRec (S (n + n))
17+
18+export
19+half : (n : Nat) -> Half n
20+half Z = HalfEven {n=0}
21+half (S k) with (half k)
22+ half (S (S (n + n))) | HalfOdd = rewrite plusSuccRightSucc (S n) n in
23+ HalfEven {n=S n}
24+ half (S (n + n)) | HalfEven = HalfOdd
25+
26+halfRecFix : (n : Nat) -> ((m : Nat) -> LT m n -> HalfRec m) -> HalfRec n
27+halfRecFix Z hrec = HalfRecZ
28+halfRecFix (S k) hrec with (half k)
29+ halfRecFix (S (S (n + n))) hrec | HalfOdd
30+ = rewrite plusSuccRightSucc (S n) n in
31+ HalfRecEven (hrec (S n) (LTESucc (LTESucc (lteAddRight _))))
32+ halfRecFix (S (n + n)) hrec | HalfEven
33+ = HalfRecOdd (hrec n (LTESucc (lteAddRight _)))
34+
35+export
36+halfRec : (n : Nat) -> HalfRec n
37+halfRec n = accInd halfRecFix n (ltAcc (S n) (LTESucc lteRefl))
38+