I am trying to write a function mSmallest that takes two natural numbers, n and m as inputs and produces a vector. The output vector contains the m smallest members of the finite set with n members.
For example mSmallest 5 3 is supposed to produce [FS (FS Z), FS Z, Z] which is a Vect 3 (Fin 5)
I would like to restrict the input argument m to be less than n. I tried something like this:
mSmallest : (n : Nat) -> (m : Nat) -> {auto p : n > m = True} -> Vect m (Fin n)
mSmallest Z Z = ?c_3
mSmallest Z (S k) = ?c_5
mSmallest (S k) m = ?c_2
The second case should not be possible because of the input p. How do I make it so that the Z (S k) case is eliminated?
Also, is there a better way of defining the mSmallest function?
I don't think n > m = True is constructive enough; if you use the GT proposition instead, you can eliminate the first two branches since there's no way to pattern-match on p in that case:
-- Note that mSmallest is accepted as total with just this one case!
total mSmallest : (n : Nat) -> (m : Nat) -> {auto p : n `GT` m} -> Vect m (Fin n)
mSmallest (S k) m {p = LTESucc p} = replicate m FZ
(this one uses a dummy implementation of mSmallest for the interesting case since that should be orthogonal to the original question).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With