プロジェクトの本文や、活動報告についての感想、ご意見、ご質問を、ぜひコメントでお寄せいただければと思います。現在は支援募集期間中であり、本企画の実施期間ではないため、お寄せいただいた感想などについてはリターンとしてではなく、お返事や回答をさせていただきます。 また、私個人についてはこちらをご覧ください。 では本題です。 「科目でのプログラミング」では、「表計算でいろいろできる」ということを書きました。そのあたりを、もうすこし考えてみたいと思います。とは言っても、あまり目新しいものではないとは思いますが。 まず、こちらをご覧ください: この場合、画面左側を、データと計算結果の表として使うとします。対して、カラムJ, K, Lには、計算のツールが用意されているとします。この画像の場合、K4は、「上のセルに足す」ということで、「=K3+1」という内容が入っています。 これでどういうことができるかというと、2行目の「データB2」などには初期データが入っているとします。そこで、セルB3にセルK4をコピーすると、この場合であればセルB2に1を加えた値がセルB3に表示されます。 同じような感じで、必要な要素を画面右側に用意しておいてやれば、コピー&ペーストと、セルの内容のすこしの書き換えで表計算でのプログラミングがやりやすくなります。 なお、ここで重要なのは、この場合であれば「時刻1」などという書き方です。ここは、通常のプログラムであれば「外側のループ」になるかもしれません。ですがこの例の場合だと、「外側のループ」が展開され、「時刻1」、「時刻2」のように縦に並ぶと読みます。 これであらゆる問題が解決とはいきませんが、すくなくとも手軽な解決方法ではあるでしょう。 解決できない問題の大きなものとしては、センサーからの入力や、外部機器の制御といったことが挙げられます。それらを重視する人もいるかと思いますが、私はそれらはどうでもいいと考えています。どうでもいいというのは正確ではないかも知れません。 というのも、それらを扱った場合、どれほどの児童・生徒が制御などの仕組を理解できるのかという疑問があるからです。「命令を書けば制御できる」という理解はあまりに拙いものであり、ドライバ、ハードウェアなどを無視した姿勢に思えます。 おそらくはという条件が付きますが、パパートの初期のLOGOにおけるタートルなどの影響が、そのような制御を含めようという発想の原点にあり、そこで足踏みをしているにすぎないのではないかと思います。あるいは、「課題においてデータ構造やアルゴリズムを指定するか」に書いたように:>「動いたことで確認とする」というのは、実は極めて甘い基準であり、かつ外部機器の制御などなどを含めて「動けばいい」という態度を採用することはありえない選択にしか思えません。ここで、「きちんと動くことを証明する」のであれば、制御などの前にやることがいくらでもあるかと思います。 もちろん、パパートなどは外部機器を使ってはいても、それは「動けばいい」という態度ではなかったことは、はっきりしています(『マインドストーム』など)。「動いたこと」から逆向きに、「なぜきちんと動いたのか」という問題に戻っていました。ですが、現在においては、そこまで意識して教育が行なわれているのかについては、すくなからず疑問があります。 あるいは、外部機器を用いても、「きちんと動くことを証明する」ことは可能でしょう。ですが、外部機器との通信という重要な部分は、おそらくブラック・ボックスとして扱かわなければならないだろうと思います(時代的に、採用されている通信技術の違いもあります)。そこをブラック・ボックスにするのであれば、やはりそれらを使う前にやることがいくらでもあるかと思います。 対して、この画像の場合だと “import なんとか” というようなマジック・ワードはありませんが、普通にプログラミングをするのであれば、そのようなマジック・ワードは隠さないほうがいいと考えています。それは、モジュールやライブラリという概念は、プログラミングにおいて重要であろうと考えているからです。 つまるところ、児童・生徒に、「コンピュータは魔法の箱」とは思って欲しくはありません。それは外部機器も含めての話です。もっとも、ここはある程度の妥協が必要で、児童・生徒に対してコンピュータ・アーキテクチャをきっちりやるのは、現実的とは言い難いでしょう。 なお、上の画像で示したものは、以前から思ってはいた程度のものであり、どれほど実用的なのかはわかりません。私自身が表計算をこのような目的で使う場合、関数などを直書きしますので。もし興味を持たれた方がいらっしゃいましたら、ぜひご支援と、そしてコメントをお寄せください。本企画の期間中、あるいは第二版に向けて検討したいと思います。実際、表計算ではありませんが同じような感じのものは存在するので、表計算でもすでに存在していてもおかしくはないと思いますが。
繰り返しになりますが。プロジェクトの本文や、活動報告についての感想、ご意見、ご質問を、ぜひコメントでお寄せいただければと思います。現在は支援募集期間中であり、本企画の実施期間ではないため、お寄せいただいた感想などについてはリターンとしてではなく、お返事や回答をさせていただきます。 また、私個人についてはこちらをご覧ください。 では本題です。 2020年からのプログラミングの必修化は、「プログラミングで教科を学ぶ」というコンセンプトです。これを素直に解釈したいと思います 科目が、「日本語」、「算数・数学」、「理科(物理、化学、生物、地学)」、「社会(日本史、世界史、地理)」、それと「英語 (or 外国語)」だとします。ほかに「音楽」、「図画工作」なんかも対象にはなるのかもしれませんが。 この中で、プログラミングをそのまま導入できそうなのは、「算数・数学」と「理科 (物理)」といったところでしょうか。 残りをすこし整理すると「語学(日本語、外国語)」、「理科(化学、生物、地学)」、「社会(日本史、世界史、地理)」となります。「社会 (道徳 or 倫理)」あたりも入れえときたいような気もしますが、それはあとで余裕があたら書きます。 「理科 (化学、生物、地学)」、「社会(日本史、世界史、地理)」あたりで共通しそうなのは、データ・ベース、あるいは表計算−−かつスクリプトを使わずに−−でもかまわないかもしれないということです。表計算でセルに値や関数を入れるのは、ある意味、グラフィカルなプログラミングとも言えるかと思います (ヴィジュアル・プログラミングという言葉もありますが、これはデザインの世界でも使われる言葉なので、ここではグラフィカルなプログラミングと言っておきます)。どうせなら、「算数・数学」と「理科 (物理)」も、表計算でかまわないようい思いますが。あるいは、知識ベースとして表計算を使うなら、「もういっそのことProlog使う?」と思えるものでもあります。 「理科 (地学)」では、環境の変化の計算というのは計算の対象になるかもしれません。環境の変化、とくに地球の熱収支については小学校ではやらないかもしれませんが、私の小品『Jailbreak』(あるいは『Jailbreak』)では、熱収支は資料を用い、熱収支の変化、およびそれによる環境の変化の簡単な計算は表計算で行ないました。 あるいは、日食・月食あたりの計算も表計算で可能でしょうし、そのグラフ化も、動画になるかはともかくとして表計算で可能でしょう。 さらにあるいは、「理科 (生物)」や、「社会 (いろいろ)」は「捕食-被食関係」だとか、その「ロトカ・ヴォルテラの方程式」なんかをやってみるということもあるかもしれません。ですが、考えてみればこれも表計算でできる。 それら以外のことについては、やはりデータ・ベースか、あるいはやはり表計算でできるかと思います。 といったところで考えると、表計算で計算をするか、表計算を知識ベースとして使うかで、ことが済んでしまうようにも思えます。もっとも、表計算だとプログラミングにおいてあちこちに出てくる、探索を扱うのはすこし難しいかもしれませんが。知識ベースとして表計算を使うなら、先にも書きましたが、「もういっそのことProlog使う?」とも思えます。 これに当てはまりにくいのが「語学 (日本語 or 外国語)」かなとは思います。と言うのも、児童・生徒が形態素解析や統語解析をするのは難しいと思うからです。もっとも、そのデータを試料として児童・生徒に渡すなら、計量言語学みたいなことはできる気がします。それも表計算で。それ以外の使い方だと、単語帳でしょうか。対話モデルも、試料を用意すればできるかもしれません。 そうすると、「プログラミングで教科を学ぶ」というコンセンプトがあったとしても、かなりの部分は表計算で済んでしまうような気もします。表計算で済んでしまうのが悪いというわけでもなく、すくなくとも、おかしな業界団体があったとしても、そこが口を出す機会が減るだろうという利点はあるかと思いますが。 ですが、「プログラミングで教科を学ぶ」というコンセンプトをどう生かすのかはかなり難しい課題のように思えます。「プログラミングで教科を学ぶ」というコンセンプトを外すと、「検索してみましょう」みたいな話もあるのかもしれませんが、それだと現状と変わらないように思います。 試験的な授業が行なわれてはいますが、詳細は知りません。実際どうやっているんでしょうか? 根っこに戻ってみると、「小学校段階におけるプログラミング教育の在り方について(議論の取りまとめ)」あたりには、こうあります:| ○ プログラミング教育とは、子供たちに、コンピュータに意図した処理を| 行うよう指示することができるということを体験させながら、発達の段| 階に即して、次のような資質・能力を育成するものであると考えられる。|| 【知識・技能】| (小)身近な生活でコンピュータが活用されていることや、問題の解決に| は必要な手順があることに気付くこと。| (中)社会におけるコンピュータの役割や影響を理解するとともに、簡単| なプログラムを作成できるようにすること。| (高)コンピュータの働きを科学的に理解するとともに、実際の問題解決| にコンピュータを活用できるようにすること。|| 【思考力・判断力・表現力等】| ・ 発達の段階に即して、「プログラミング的思考」(自分が意図する一| 連の活動を実現するために、どのような動きの組合せが必要であり、一| つ一つの動きに対応した記号を、どのように組み合わせたらいいのか、| 記号の組合せをどのように改善していけば、より意図した活動に近づく| のか、といったことを論理的に考えていく力) [5]を育成すること。|| 【学びに向かう力・人間性等】| ・ 発達の段階に即して、コンピュータの働きを、よりよい人生や社会づ| くりに生かそうとする態度を涵養すること。|| [5] いわゆる「コンピュテーショナル・シンキング」の考え方を踏まえつ| つ、プログラミングと論理的思考との関係を整理しながら提言された| 定義である。 ここにも出てくる「プログラミング的思考」と言っているあたりで、プログラミングにしても他のことにしても、「明後日の方向を向いているんだろうなぁ」とは想像できるのですが。とくに “[5]” は注ですが、もうなんか、これだけで「あ、これ駄目だ」という雰囲気というか匂いというか、そんな感じが。 昔々ですが、「プログラミングを勉強すると、数学ができるようになる」というようなことが言われていた時期がありました。もちろん、因果関係と言えるほどに強い関係が両者にあるわけではありません。すくなくとも小中高くらいでは。ですが、その延長線上でまだやってるのかというような印象があります。もちろん、パパートやその他の研究者のやってきていることは少なく見積もっても無駄ではありませんが、一枚フィルターを通すと台無しになる例のような気がします。 ついでになりますが、「社会 (道徳 or 倫理でしょうか)」についてですが、Prologなどに条文を書き直してやり、矛盾点などを探すという研究が、それなりの歴史を持って行なわれています。そのように、法律などが論理的であるかを確認してみるのも面白い課題だと思います。あるいは、一歩進めて、論理に基づく法律、つまり「論理法」を考えてみるのも面白い課題だと思います。もっとも、これは児童・生徒を対象にするには難しいかもしれませんが。
繰り返しになりますが。プロジェクトの本文や、活動報告についての感想、ご意見、ご質問を、ぜひコメントでお寄せいただければと思います。現在は支援募集期間中であり、本企画の実施期間ではないため、お寄せいただいた感想などについてはリターンとしてではなく、お返事や回答をさせていただきます。 また、私個人についてはこちらをご覧ください。 では本題です。 今回は、「計算ってなんだ?」に示したのとは異なる、計算の概念を考えてみたいと思います。 すこし不思議かもしれない話をしましょう。 “2 + 3” という計算は、いったいどうやりますか? “2 + 3” の答えは、もちろん “5” です。普通に足し算をすれば、自然とそうなります。じゃぁ、 “2 + 3” という計算は、なんなんでしょう? つまりは、足し算、そしてその他のすべての計算はなんなんだという話ですが。 たとえば、 “2 + 1 + 1 + 1” だって、答えは “5” になります。これは “2 + 3” とは違うんでしょうか? あるいは、 “1 + 1 + 1 + 1 + 1” とは違うんでしょうか? さらにあるいは、 “1 + 1” から始まる、とても大きな表を考えてみましょう。 この表で、 “2” と “3” のところから、 “5” を見付けることもできます。 “2 + 3” が、この表から “5” を見付けてくることだって考えたらいけないんでしょうか? いけないとしたら、なぜなんでしょう? もちろん、「その表を、まず作らないといけない」という声もあるでしょう。 しかし、そうなんでしょうか。もしそうだとしたら、たとえば、“150” っていう数は、 “1” をずっと足していって、最後に “149 + 1” という足し算をしないと出てこない数ということになりはしませんか? でも、そう考えると、私はここで突然 “150” っていう数を出しました。 でも、そんなことはできないはずだっていうことにならないでしょうか? ここで頭を捻ってくれたり、「それもそうだ」と思ってくれたとしましょう。ついでにもうすこし頭を捻ってもらいましょう。さっきの足し算の表が、足し算をする前からどこかに存在すると考えたらいけない理由ってなにかあるでしょうか? そう考えていけない理由はありません。 これは、足し算という、プログラムの中では一部分でしかないものでした。でも、プログラム全体についてこういう考えかたをしてはいけない理由はあるんでしょうか? そう考えていいのなら、「足し算」というプログラム (すぐ上で「プログラムの中では一部分」と書いていますが、そこの指摘はなしです) が、 “2” と “3” と、それに対する “5” をどうにかして結び付けたっということになります。その結び付けかたは、普通に足し算をしたり、 “2 + 1 + 1 + 1” だったり、表を見たりと、いろいろあります。どの結び付けかたならよくて、どの結び付けかたはよくないなんてことはないでしょう。きちんと結び付いていれば、それでかまわないわけです。 この考え方は、「プログラムとは、入力を出力に写像する」というような考え方で、別段 珍しい考え方でもありません。 検索エンジンにキーワードを入れて、結果を得るのも同じように考えられます。潜在的に存在するあらゆる検索結果に、キーワードを写像させるわけです。こちらの例だと、すこし奇妙に思えるかもしれませんが。 ともかく、「プログラムとは、入力を出力に写像する」と考えれば、プログラミングとは、入力と出力をどうやって結び付けるのかを書くことだと言えるでしょう。「どうやって結び付けるのか」の中身は、いろいろあるわけですが。 プログラミングとは手続きや手順を書くことと同義ではないというのは、このようなこともあっての話です。
繰り返しになりますが。プロジェクトの本文や、活動報告についての感想、ご意見、ご質問を、ぜひコメントでお寄せいただければと思います。現在は支援募集期間中であり、本企画の実施期間ではないため、お寄せいただいた感想などについてはリターンとしてではなく、お返事や回答をさせていただきます。 また、私個人についてはこちらをご覧ください。 この記事は、medium.comからの転載を元にしています。 では、本題です。 まず、この記事では、「ガジェット・コンピューティング」にて触れた、S. ウォルフラムの言葉:>物理的システムは計算システムと考えられており,コンピューターが>行なうのと同様のやり方で情報を処理していると考えられている。 これに関係しています。 計算のモデルとしては、たぶん4つあります。チューリング・マシン、λ計算、ユニフィケーション(それより “Warren’s Abstract Machine”、あるいはWAMを挙げた方がいいのかな)、それとスタック・マシンです。スタック・マシンは別扱いにする必要があるのかどうかはわかりませんが。あ、それとデータ・フローやコントロール・フローは、やはり別扱いにしたほうがいいのかもしれません。ですが、とりあえずこの4つということで。 チューリング・マシンはそのあたりのCPUとかとプログラミング言語が相当します。オブジェクト指向とかは書き方の問題なので、ここでは本質的な問題にはなりません。 λ計算は、Lisp系とか関数型の言語、それとLispマシンが相当します。 ユニフィケーションは、一応prologが対応します。昔あったprologマシンというのがどういう程度のものだったのかは知りません。 スタック・マシンは、FORTHとかです。でもスタック付きのチューリング・マシンとかもあるからなぁ。上にも書きましたが別の扱いにするのが適切かどうか。 基本的には、それぞれ等価というわけでもないですけど、同等ということがわかっています。「同等」というのは、どれかのモデルで計算できることは、他のモデルでも計算できるという意味です。 それぞれモデルとしては異なりますが、共通点もあります。というのも、計算が始まる前の状態とか内容とかと、計算が終った時の状態とか内容とかが異なっているということです。つまり、内容Aから内容Bへの変更を行なうことが計算と言えるでしょう。 あるいは、入力Cから出力Dを求めることも計算と言えるでしょう。ですがチューリング・マシンだとテープの内容の変化が内容Aから内容Bへの変更であるとともに、入力Cから出力Dを求めることでもあります。λ計算でも、項Aから項Bへの変更であり、それが入力Cから出力Dを求めることでもあります。まぁ内容A+入力Cから内容B+出力Dを求めることが計算だとしましょう。ただし、入力と出力は必須ではありません。内容の変化に共なう副作用程度のものです。入力は埋め込んでおけばいいことですし、出力は変化した内容(の一部)を出力装置に出すだけですから。 えーと、λ計算は関数型のプログラミング言語のモデルとしてよく使われています。そして関数型の言語では内部の状態が変化しない、あるいはそもそも内部に状態などない方が望ましいと言われています。これはλ計算だからという話ではなく、「関数」型だからという話です。y=2*xとかに内部の状態はありませんよね。そういう話です。λ計算そのものは、λ項の書き換えによって計算をします。 “λ”という文字には意味はありません。例えばΣはサメーションの頭文字をギリシア文字に置き換えたもので演算そのものを意味します。“Π” はプロダクションの頭文字をギリシア文字に置き換えたもので演算そのものを意味します。“∫”はインテグラルですが、これは何なんだろ? でも演算そのものを意味します。つまりどれも “+” とかと同じような演算子です。ですが”λ”は「λ項ですよ」ということを示すだけです。実際の書き換えはαとかβとかよばれる規則で行なわれます。”λ”という文字を使うこと自体、結局それに落ち着いたというだけの事ですし。 チューリング・マシンは、アルゴリズムを書ける計算であればなんでも計算できることが証明されています。その証明は面倒なので省略します。ともかく内容A+入力Cから内容B+出力Dをどうやって求めるのかを書けるなら、どんな計算でも可能なのです。 こうした場合、普通の計算機で行なうことだけが計算ではないことは明らかです。例えばドミノ倒し。内容なり状態なりが変化しますので、計算です。あまり計算ぽくないとは思いますが、それでも計算です。まぁ何を計算しているのかは知りませんけど。 さて、そうした場合、「計算ではないこと」というのはあるのでしょうか。 それを考えるには、もう少し計算について考えてみる必要があります。状態や内容が変われば、それは何であれ計算なのでしょうか。そう言ってしまうのはちょっと荒らっぽいように思います。 チューリング・マシンの場合、テープには記号が書かれており、テープを読み書きするヘッドには、読み込んだ内容とヘッド自体が保持している状態に応じてどういう動作をするかというルールが含まれています。実際にどういう計算をするかはともかく、そういうものがチューリング・マシンと定義されています。 λ計算だと上でちょっと触れましたがαとかβとかの書き換え規則があること、そしてそれらを適用することが決っています。 ユニフィケーションでもどうやるかは決っています。 スタック・マシンだとスタックを読んで結果をスタックに戻すということが決っています。 つまり、状態や内容をどのように書き換えるのかの規則や手順が決っています。この「どのように書き換えるのかの規則や手順」というのはプログラムではなく、それぞれのモデルの計算そのものについての定義として決っているということです。それに基づいてどのように、そして何を計算するのかがプログラムにあたりますが、それはその規則とかとは別物です。 そうすると逆に言えば、無秩序に状態や内容を書き換えても、それは計算とは呼ばないわけです。 この段階で、もう一度「計算ではないこと」というものが存在するのかを考えてみます。 プログラムではなく、もっと内側の規則が無い場合、状態や内容が書き変わっても計算とは呼べません。では、人間がやる普通に言う計算を別とすれば、やはり計算機がやっていることだけが計算なのでしょうか? いや、ちょっと待ってください。例えば恒星や惑星や衛星や恒星系や銀河は重力という規則に従って、状態や内容、つまりそれぞれの位置が書き変わっています。あるいは複数の原子は、おもに電磁気力によって互いに影響し、反応したり化合物を作ったりと、状態や内容を書き換えています。これらは計算ではないのでしょうか? それはわかりません。 あるSFナンセンスコメディ作品では、ディープ・ソートとディープ・ブルーという巨大な計算機が登場します。とくに後者は「地球」とも呼ばれていました。 もし重力や電磁気力、量子論、超ひも理論による物理的な状態や内容の書き換えが計算なのだとしたら、宇宙は何を計算しているのでしょうか? そこでもう一度考えてみましょう。「計算ではないこと」という事柄は存在するのでしょうか? わかりません。何かを計算しているのだとしても、何を計算しているのかはわかりません。 計算については定式化されていますが、ではどこまでそれを敷衍できるのかは結局わからないのかもしれません。もしこの宇宙が何かを計算しているのだとしたら、何兆年か先の冷えきった宇宙が計算の結果なのでしょうか? それともそこに至るまでのどこかが計算結果なのでしょうか? 誰が、あるいは何が計算をさせているのでしょうか? 私やあなたも計算の要素なのでしょうか? どれもわかりません。 そこでもう一度考えてみましょう。「計算ではないこと」という事柄は存在するのでしょうか? わかりません。何かを計算しているのだとしても、何を計算しているのかはわかりません。 正直、「計算ではないこと」というのは存在しないのかもしれません。誰が、あるいは何が計算をさせているのかすらわからずとも。あるいは、計算させている誰か、あるいは何かが存在しないとしても。
繰り返しになりますが。プロジェクトの本文や、活動報告についての感想、ご意見、ご質問を、ぜひコメントでお寄せいただければと思います。現在は支援募集期間中であり、本企画の実施期間ではないため、お寄せいただいた感想などについてはリターンとしてではなく、お返事や回答をさせていただきます。 また、私個人についてはこちらをご覧ください。 この記事は、medium.comからの転載を元にしています。 では、本題です。 いわゆるDNAコンピューティングはDNAの合成過程 or 結果による計算だったりするわけですが、それとは別物です。そっちは、スパゲッティ・コンピューティングあるいはパスタ・コンピューティング (「ガジェット・コンピューティング」で紹介した「スパゲッティ・ソート」とある意味同類です。えーと、Google Scholarで、「DNA RNA Turing Machine」で検索してみてください。日本語の文献に絞ると、関係なさそうなのが数個表示されるだけみたいです。1973年とかの文献があったりします。あー、サイトの会員(法人 or 個人)でないと見れないのが多いな。これはGoogle Booksだから読めるかな? “A DNA and restriction enzyme implementation of Turing machines”, PWK Rothemund — DNA based computers, 1996. こっちの方が良いかな? Brown大の図書館みたいなので、見れると思いますけど。”The fundamental physical limits of computation”, C. H. Bennett, R. Landauer, Scientific American, 1985. 何となく思いついたのは、修士の頃(199x年)だったと思います。ゲームの設定を考えている時だったと思いますが。「DNA(というより細胞か?)とチューリング・マシンは似てるかもしれない」というものです。 DNA(無限長ではありませんが)をテープに、DNAから情報を読み取るRNAをヘッド(の一部)に置き換えて考えてみます。RNAがDNAから読み出した情報は、化学物質として細胞内に散布(?)されます。で、細胞内のそういう物質の濃度なりなんなりを、ヘッドの残りの部分である「状態」に置き換えてみます。チューリング・マシンでは、テープ上のデータの書き換えが行われますが、DNAでは損傷部分の修復の場合とコピーエラーをのぞき、書き換えはないだろうと思いますが。 こういう対応付けが可能なのかどうかは分かりませんが、なんとなく対応付けができそうな気がします。そうすると、「細胞は計算している」なんてことが言えるのかもしれません。おまけに、生化学より計算しているという方を重視するなら、DNAの書き換えも問題無しですし。「やはりすごいな、チューリング!」という感じでしょうか。 まぁ、生化学のことは何も知らないので、どれくらいの妥当性があるのか知りません。 で、ちょっとファイル整理みたいなことをしていて、「そう言えばそんなこと考えたね」というのがあったり思い出したりしたので、検索してみたのでした。この類の研究はどこまで進んでいるのかというのが気になります。ちょっと週末に時間を取って眺めてみようかな。