use vstd::prelude::*;
verus! {
pub proof fn choose_smallest(low: int, high: int, p: spec_fn(int)->bool) -> (res:int)
requires
exists |i:int| #![trigger(p(i))] low <= i < high && p(i),
ensures
low <= res < high,
p(res),
forall |i:int| #![trigger(p(i))] low <= i < res ==> !p(i),
decreases
high - low,
{
if p(low) {
low
} else {
choose_smallest(low + 1, high, p)
}
}
}