disnet / contracts.js

Contract library for JavaScript
http://www.contractsjs.org
MIT License
149 stars 8 forks source link

`sqrt(x) < x` not a valid check #27

Open CrossEye opened 9 years ago

CrossEye commented 9 years ago

In examples/dependent.js, we have this contract for a supposed square root function:

@ (x: Pos) -> res: Num | res <= x

And the failing implementation of sqrt is

return x * x;

Both of these have some issues in the range (0, 1). Note that sqrt(0.25); //=> 0.5 and that 0.5 < 0.25; //=> false. Similarly, in the same range 0.7 * 0,7 = 0.49, and 0.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.

disnet commented 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!

CrossEye commented 9 years ago

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
disnet commented 9 years ago

Good call, that's probably a bit more clear.