@popovitsjには良い傾向があります。
SMLは、パターンマッチングを使用して、使用する関数定義のバージョンを決定します。
fun sqrt x s = if ((s*s) <= x) then s | sqrt x s = if (s*s) > x then sqrt x (s - 1);
非決定論的であり、SMLにはバックトラックする施設があり、試行されたものが失敗した場合(つまり、Prologのようなもの)。
このシナリオでは、使用することができます
fun sqrt x s = if s * s <= x then s else sqrt x (s-1);
この関数は、元々渡されたときにIF式を失敗させる値を渡している場合にのみ、論理的に有効です。
私はこれをテストしていませんが、それが役立つはずだと思います。