まず、関数型プログラミング (および一般的なプログラミング) はほぼ完全に新しいので、これがばかげた質問のように思われる場合は、事前にお詫び申し上げます。とにかく、私はいくつかのプログラミング演習を行ってきましたが、これまでのところうまくいきましたが、これには行き詰まりました:
関数 fn : int -> int を作成する必要があります。この関数は、n > 0 に対して最小の m > n を見つけ、m と n が相対素数にならないようにします。これは私がこれまでに作ったものです:
(* returns true if p,q are relative primes, else false *)
fun relativePrimes (1,q) = true
| relativePrimes (p,q) = if p <> 0 then relativePrimes(q mod p,p) else false;
私はこの機能を
fun nextNotRelativePrime n = if relativePrimes (n,n+1) = false then n+1
else if relativePrimes (n,n+2) = false then n+2 else n*2; (* and so on... *)
ここでの問題は、この関数が n <= 9 でしか機能しないことです。もちろん、より多くのケースで拡張できますが、すべての n で機能するわけではありません。
関数が呼び出されるたびにp = nが同じままである間、relativePrimes(p、q)でq(最大n * 2)に対してnを1ずつインクリメントする方法が必要です。方法はわかりませんが。