Open CrossEye opened 9 years ago
Ha, good catch. That contract is definitely not what we want to say.
Maybe something like this is better.
@ (x: Pos) -> res:Num | res > (Math.sqrt(x) - 0.1) &&
res < (Math.sqrt(x) + 0.1)
Thanks for letting me know!
I would suggest that, since a sqrt function is what you're trying to define, using another one in its contract is perhaps a little odd. Is a syntax like this acceptable?:
@ (x: Pos) -> res:Num | (res * res + 0.1) > x && (res * res - 0.1) < x
Good call, that's probably a bit more clear.
In
examples/dependent.js
, we have this contract for a supposed square root function:And the failing implementation of sqrt is
Both of these have some issues in the range
(0, 1)
. Note thatsqrt(0.25); //=> 0.5
and that0.5 < 0.25; //=> false
. Similarly, in the same range0.7 * 0,7 = 0.49
, and0.49 < 0.7
, so this succeeds for range(0, 1)
.I'm brand-new here, and don't know if this is acceptable. Obviously, any value that makes such a contract fail is a demonstration that the implementation is wrong, but I don't know what standard you want to set with the examples.