@popovitsj ha una buona inclinazione.
SML utilizza la corrispondenza dei pattern per determinare quale versione della definizione della funzione utilizzare.
fun sqrt x s = if ((s*s) <= x) then s | sqrt x s = if (s*s) > x then sqrt x (s - 1);
Non è deterministico e SML non ha la struttura di tornare indietro e provare un'altra definizione se quello che prova fallisce (cioè come Prolog).
In questo scenario puoi semplicemente usare
fun sqrt x s = if s * s <= x then s else sqrt x (s-1);
Questa funzione è logicamente valida solo se si passa un valore che, se originariamente,, fallirà l'espressione IF.
Non l'ho testato, ma credo che dovrebbe aiutare.