見出し画像

「素数列」:関数型プログラミングの初級問題-37問目-(0分)

 素数についての練習問題と答案です。問題は、OCaml公式ページのものを使いました。答案の作成時間は、約0分でした。

問題37.

 $${\Z}$$の有界閉区間に対し、そこに含まれる全ての素数からなるリストを生成する関数all_primesを書け。

※ 例えば、all_primes 2 13は、[2; 3; 5; 7; 11; 13]になります。

答案

本問の解き方

 問題29の答案で作成したエラストテネスのふるいそのものです。

コード

let all_primes a b =
 let rec sweep m p = function [] -> []
  | head::tail ->
   if m = head then sweep (m+p) p tail
   else head::(sweep (if m < head then m+p else m) p tail) in

 let rec sieve = function [] -> []
  | head::tail -> head::(sieve (sweep head head tail)) in

 let rec seq a b = if a < b then a::(seq (a+1) b) else [b] in

 sieve (seq a b)

 少し変数の整理をしました。

感想

 今回は、何も書いていないので書くことはありません。

次回は、第38問です。
 

おまけ

 文字数が少し足らないので、少しの埋め草です。

論理的思考

 この言葉をためらうことなく使う人は、おそらく論理を学んだことがないのでしょう。
 なぜなら、論理とは人を説得する方法の一つに過ぎません。
 そのため人の数だけ論理がある、は言い過ぎですが、社会の数だけ論理はあるのです。

 では、論理的思考論理的思考と念仏を唱える人たちの言う論理は何の論理なのでしょうか。
 確信はありませんが、察するにどうやら古典論理のように思われます。
 確かに、古典論理は、現代数学の基礎付けを可能とする優れた論理です。
 しかし、古典論理は、万能ではありません。日常生活で使えるようなものではないのです。

 例えば、古典論理は、現代科学とは相容れません。現代科学は帰納的に構築されるものだからです。

 これら二つを組み合わせた場合には、奇妙な理屈が展開されます。
 その一例として、「αケンタウリAは球体である」を論理的思考で検証してみましょう。

 まず、「αケンタウリAは球体である」の対偶を考えます。これは「球体でなければαケンタウリAでない」になります。
 古典論理においては、この対偶が正しければ、もとの「αケンタウリAは球体である」も正しくなります。

 では、これを現代科学の検証方法である実験で確かめましょう。
 ここでは、雄ネジを観察します。
 雄ネジと言っても色々な形のものがあるでしょうが、すくなくとも球体でないことだけは確かです。
 そして、雄ネジはαケンタウリAではありせん
 これより「球体でなければαケンタウリAでない」は正しいことになります。
 さらに古典論理を組み合わせることで「αケンタウリAは球体である」が導かれます。
 以上から「αケンタウリAは球体である」が実験で科学的に検証されたことになります。

 現代科学では、検証回数が多ければ多いほど、科学的な理論の真実性がまします。
 したがって、雄ネジの観察をすればするほど、「αケンタウリAは球体である」が真実である可能性が高くなります。

 この理屈を受け入れることができるでしょうか?
 私には無理です。
 私ならば、αケンタウリAについて何らかの結論を出すには、αケンタウリAに関連する事実を検証する必要があると考えます。

 論理的思考教の人たちからすれば、奇妙に感じる私の考え方のほうこそ奇妙に感じるのでしょうね。

蛇足
 さて、今回のおちは、これまでの話には論理的なギャップが含まれているということです。
 つまり、論理的思考についての言及そのものが論理的思考ではないのです。論理的思考でないならば論理的思考教徒を納得させることはできず、教徒でないなら納得させる必要がなく、必要がないならば論理的思考でなくてもよいのです。

(話が予定よりも長くなり、オチの説明が必要になってしまいました。何とも恰好がつかない話です…)


古往今来得ざれば即ち書き得れば即ち飽くは筆の常也。と云うわけで御座います、この浅ましき乞食めに何卒皆々様のご慈悲をお願い致します。