0 | module Data.Primitives.Views
12 | data Divides : Integer -> (d : Integer) -> Type where
13 | DivByZero : Divides x 0
14 | DivBy : (div, rem : _) ->
15 | (prf : rem >= 0 && rem < d = True) ->
16 | Divides ((d * div) + rem) d
20 | divides : (val : Integer) -> (d : Integer) -> Divides val d
21 | divides val 0 = DivByZero
24 | let dividend = if d < 0 then -(val `div` abs d)
26 | remainder = abs (val - dividend * d) in
27 | believe_me (DivBy {d} dividend remainder
28 | (believe_me (Refl {x = True})))
32 | data IntegerRec : Integer -> Type where
33 | IntegerZ : IntegerRec 0
38 | IntegerSucc : IntegerRec (-
1 + n) -> IntegerRec n
39 | IntegerPred : IntegerRec (1 + (-n)) -> IntegerRec (-n)
43 | integerRec : (x : Integer) -> IntegerRec x
44 | integerRec 0 = IntegerZ
45 | integerRec x = if x > 0 then IntegerSucc (assert_total (integerRec (-
1 + x)))
46 | else believe_me (IntegerPred {n = -x}
47 | (assert_total (believe_me (integerRec (1 + x)))))
52 | data Divides : Int -> (d : Int) -> Type where
53 | DivByZero : IntV.Divides x 0
54 | DivBy : (div, rem : _) ->
55 | (prf : rem >= 0 && rem < d = True) ->
56 | IntV.Divides ((d * div) + rem) d
64 | divides : (val : Int) -> (d : Int) -> Divides val d
65 | divides val 0 = DivByZero
68 | let dividend = if d < 0 then -(val `div` abs d)
70 | remainder = abs (val - dividend * d) in
71 | believe_me (DivBy {d} dividend remainder
72 | (believe_me (Refl {x = True})))
76 | data IntRec : Int -> Type where
82 | IntSucc : IntRec (-
1 + n) -> IntRec n
83 | IntPred : IntRec (1 + (-n)) -> IntRec (-n)
87 | intRec : (x : Int) -> IntRec x
89 | intRec x = if x > 0 then IntSucc (assert_total (intRec (-
1 + x)))
90 | else believe_me (IntPred {n = -x}
91 | (assert_total (believe_me (intRec (1 + x)))))