現実世界において 【 動く物 】 を作る場合には、その挙動を実現できる構造にしておく必要がありますが、質量と体積を持った構造物の場合、少なくとも1つの関節を持たなければ、6DoFの空間座標の変化しか出来ない構造になっています。その為、現実世界において目の前で存在している出来事は時間軸と空間軸の中での座標の変化であり、日常を考える場合だと、ユークリッド空間上の時間軸と座標軸の座標変動であり、それがどう言った法則によって発生しているのか?を考える事になります。

 

 例えば、ボールが坂を転がる場合、中学校の理科で登場した斜面とベクトルの概念がそのまま存在してますし、その時に 【 重力 】 などが関係しますが、これを分力にすることで斜面にかかる物体が斜面を押し付ける力と坂を移動する力に分ける事ができます。当然、この場合、理想空間上での、環境における係数がない状態での法則性の話になりますから、物体の挙動に関する法則性をベクトルで示し、それを力がどの程度かかるのかを理解する為の術になりますが、この時にボールのような球体だと回転運動が発生するので、平面的あ物ではなく立体的にベクトルの推移が発生します。円柱だと球体よりは平面的になりますが、平面的な要素のあるものとそうでないものでは結果が違います。また、小学校4年生ではモーターに触れる事になりますが、このモーターの軸は回転しています。この回転運動が発生した場合、軸の中心だと小さな回転になりますが、これに円盤を加えると、円盤の半径に応じて移動距離が変わります。この状態で円盤の外周に近い場所に一つの点を打つとその点が大きく回転しますが、こえrは半径が大きくなるほど移動距離が伸びます。この時に中心からその点に向かって伸ばした直線と直角になるように回転方向に向かってベクトルが伸びているのですが、物体を止めるような形状になっていないので、理想空間上では延々と回転する事になります。

 

 ちなみに、円柱状の物を回転させる場合、円弧の一点に垂線を引き、回転させると、半円の面白い軌跡を描きます。これはどの円でも同じですが、半径に応じてサイズが変わる物の円ですから、同じ状態で軌跡を描くことになります。この半円状の曲線を 【 サイクロイド 】 と言いますが、このサイクロイド曲線には面白い特性があります。

 

 この曲線を用意して物体を転がすと、斜面よりも高速に移動させることができます。これが、サイクロイド曲線を最速効果曲線として利用したものになります。

 

 また、サイクロイド曲線には等時性と言う物があり、一つのサイクロイド曲線を用意した時に、最下点に到達する時間は同じと言う特性があります。二点を繋ぐ直線で構成された坂道だと考えられない条件ですが、サイクロイド曲線だと曲線の特性上そう言った挙動になります。これは重力の実が働いている場合に発生する条件になりますが、現実世界のように係数がある環境下でもサイクロイド曲線上にレーンを作って、距離の異なる場所にボールを置いて一斉に転がすと、同時に最下点に到達します。

 

 これは、 【 サイクロイド曲線 】 と言うモジュールがあり、物理法則として、周期が一定になる曲線があるので、そう言った面白い挙動になります。同じボールを使った場合でもこの曲線の特性関わらないので、用意された挙動になります。これは、 【 サイクロイド曲線が実装された挙動 】 なので、 【 ボールを動かすためのギミック 】 として、サイクロイド曲線が機能しているのでそう言った面白い挙動になります。

 

 ちなみに、この面白い物理現象を発生させるサイクロイド曲線ですが、高校の数学IIIで出てきます。

 

■ サイクロイド曲線                  

 

   媒介変数Θを用いた時

 

      x=a(θ-sinθ)

      y=a(1-cosθ)

 

   と表される曲線をサイクロイドと呼ぶ

 

 

6DoFの範囲内でしか移動の自由度がないというのは剛体の特性ですが、ギミックの実装によって挙動のコントロールができます。

 

 

動と可動域                    

 

 動くものを作る場合、物体の座標を移動させることで実現しますが、この時に、剛体として一つの塊の場合、座標を変える事しか出来ません。その為、 【 動作 】 の実装が出来ないのと、自然界の物理法則に準じた動きしか出来ません。その為、動作を実装する場合には、関節機構のように 【 剛体の塊とは異なる仕組み 】 を実装する必要があります。

 

 

■ 多関節ロボット                    

 

 剛体に関節を入れることで挙動が増えるのですが、もっとも単純な構造は1つの接続部と可動域の追加になります。これは手動で操作する物だと、小学校の図画工作でも使う 【 ハサミ 】 などがこの構造になります。同じ構造の物だと、ペンチやニッパーなども一つの稼働用のギミックを持つものになります。基本的に、テコを2つ重ねた構造の物になりますが、手元の開閉と作動部が同じ挙動になるような構造物ですが、二つの物がテコで動く構造になっています。可動部にヒンジ機構を持つものだと、ホッチキスもそうなっていますが、関節を入れることで、物体を掴んだり、切断する事ができますが、この構造は軸回転を使った物になります。この関節の気候が増えると、挙動を二値で判定をしてもbit数が増えるので組み合わせの総数が指数関数的に増加する訳ですが、ロボットもサーボモーターの制御によって挙動をコントロールする事ができます。ロボットについては、産業用だと目的に応じたロボットが使用されていますが、

 

 

 

のように様々なタイプがあります。また、微細な作業が可能なので、

 

 

のようなっ作業個行われていますが、シリコンウエハーの製造などは手作業でできるサイズの物ではないので、自動処理で製造されています。ソリューションだと、フルオートメーション(FA)がありますが、

 

 

 

のように作業に応じてそれに準じたロボットが配置され流れ作業で処理を行っています。

 

 ソリューションを見ると、個別の作業で特化した動作が異なるので、全く違う動きをするロボットが用意されている訳ですが、これが、処理の違いによる実装する物の違いになります。この内容は、構造物を作る場合には、どう言ったアプローチを選択しても発生する物になりますから、プログラムを組む場合でも同様の事が言えます。

 

 また、FAで製造を行うと、ベルトコンベアで工程に準じてロボットが作業をすることになりますが、この時に最適な手順で完成品を作るようになっています。また、問題が発生しない限りは流れ作業になっていますから、工程を分けて流れ作業をすると効率的な製造が出来るという事になります。この流れ作業は 【 プログラムの逐次処理 】 と同じですから、工程が決まっている場合、流れ作業のように処理が進行していく事になります。FA施設の場合、稼働すると一つのサイクルを目的の回数だけループさせて製造を行うので、ここで 【 反復 】 が存在するので、逐次と反復で制御されており、そのループの中に包含されている逐次処理の中に各作業工程が存在しており、それをロボットが担っています。前述のように、各ロボットは異なる作業工程をになっていますから、異なる処理を実装している訳ですが、これがプログラム内に実装されている 【 個別の関数 】 のような物になります。つまり、プログラムを構築する場合も、流れ作業のようなメインのループが存在し、その中に実装されている工程が順次処理で実装されている訳ですが、その処理も、処理を実現させるためのクラスや関数で構築されているので、処理単位で関数やクラスを用いています。FA施設は、製造における各工程の処理単位としてロボットを配置しているのですが、こうしてプログラムとFA施設の構造を対比してみると、全く同じことが確認できます。

 

 このことから、構想物を考える場合、一つの流れ図が存在し、その挙動になるようなモジュールを個別に配置して、工程に準じて動かす事で、実現するような仕様になっています。その為、 【 構造物を考える場合の基本的な物 】 になります。

 

 

 理と条件分岐                   

 

 産業用ロボットには、前述のようにアイテムをピックアップして指定の物を仕分けするピッキングが可能な物もありますが、この場合、 【 形状の一致 】 という形でそれを処理しています。つまり、この条件では、 【 等式による判定 】 を行っているので、ロボットレベルで実装することでそう言った仕組みを作ることができます。

 

 そう言ったシステムがないレガシーな構造物でも、カウンターを使った数値制御が出来る仕様になっているので、 【 等式・不等式 】 を用いた判定が出来るようになっています。

 

 このように処理を考える場合には、目的に応じて 【 判定 】 を入れる必要がありますが、作業が行われるレーン上の工程において存在する 【 工程 】 の中に 【 数値の指定 】 や 【 形状の判断 】

が含まれる場合には、条件分岐が発生します。

 

■ 機械と条件分岐                  

 

 機械と条件分岐ですが、構造物を作る場合には、条件分岐は必ず実装する事になりますが、この理由は至極単純で 

 

      安全装置の実装

      エラー発生時に停止する

 

と言う二つの物を必要とする為、 【 条件分岐 】 が存在します。

 

 安全装置については、ロボットではなく工具レベルで存在していますが、家庭用の配線のブレーカーなどもそうですし、インパクトドライバーのトルクでの判定もそれに該当します。前者は火災などの防止のために実装された機構で、後者は、ねじ山を破壊しない為の構造になります。インパクトレンチの構造については、

 

 

の動画で紹介されていますが、内部でハンマー部分がスプリングで押されており、下側のスプリングが圧迫された状態になると、金属が固定されるのですが、この状態になると回転は上にあるスプリングの遊びによって空転するような仕組みになっています。

 

エラーの場合、意図した状態とは異なる場合に停止する必要がありますが、これは、量産体制の場合、エラーの出た状態で量産をすると不良ロットが発生するので、相当数の不良品が出てしまうためです。そうなると、チェック機構で全数調査をして、ライン上の数だけで不良品の増加を防ごうと思うと、チェック機構をその都度入れて問題があるとラインと止める必要があります。その為、品質管理の観点から考えても、こうした気候は実装する事になります。

 

 過電流による火災防止と言うと、バイメタルが登場する以前には、ヒューズを実装してそうした構造を実装していた時代もあるので、19世紀からそう言った安全装置は存在します。ちなみに、プラグ式ヒューズを発明したのは、歴史の教科書でも登場するトーマス・エジソンです。

 

 プラグ式フューズの場合、焼き切れたら交換する必要がありますが、バイメタルは温度変化で動くサーマルリレーに実装されていますが、現在の家庭内のブレーカーではこう言った機構は実装されています。

 

 

 このように 【 構造物を作る場合、必然的の条件分岐も実装される 】 のですが、数値や条件の指定をする場所だけでなく、安全装置も含まれるので、ソリューション内のいたるところに条件分岐が存在していることになります。この構造物は、 【 エラー処理を物理的にアナログで行っている 】 訳ですが、アナログな方法でも条件分岐を実装できるという事例がこれになります。

 

 つまり、条件分岐は構造物を構成する時には必須な条件になるので、歯車で動く事態から存在するのですが、実装をする方法も処理によって変わってきます。

 

 

 礎学習と構造物                 

 

 先日、学習においては 【 基礎を学んだ後に応用を学ぶ 】 というごく当たり前のことについて書きましたが、これは、何をする場合でも同じことが言えます。AIも自分で物事を判断して学習する事が出来るのですが、この分野を 【 深層学習 】 と言います。これは、ディープラーニングと呼ばれる分野なので、データマイニグ(強化学習の中の教師なし学習)とは異なる分野になりますが、この場合、

 

【 やっていいことと悪い事だけを用意してその中で動いていく 】

 

と言う物になります。AIは、やっていい事で、より問題がない物だけを選んで動くのですが、ダメな物を選ばないように選択しながら条件を学習します。

 

 この学習の時にも、AIは何も知らない状態で学習を始めるので、それに準じたカリキュラムを組んであげる必要があります。その為、最初は最も簡単な条件から行い、それがクリア出来たら難しい課題で学習してもらうことになります。例えば、

 

         □                      □  □ 

  ▲     □     ▲          □  □  □ ▲    G

■■■ ■■■■  ■■■ ■■  ■  ■■■■■■■■■■

 

のようなコースがあったとします。この時に、▲が移動するキャラで接触するとミスになり、□が足場で、Gを目指すとします。この場合、動くものに対応できるわけもなく。高低差があると難易度が高いので、最初は、足元の判定の回避方法を考えてもらう事になります。この時に、キャラは2段分以上の高さをジャンプできるとすると、□は飛べるのですが、最初に用意するカリキュラムは。

 

                                         G

■■■ ■■■■  ■■■ ■■  ■  ■■■■■■■■■■

 

で落ちないように進むものです。と言っても、進行方向にしか進まないことを制限しているわけではないので、自由な動き方をしてしまいますが、ゴールを目指すという命題と 【 正しい事 】 として認識させているので、その通りに進みます。可否で考えると、可の方を選択し、より可の条件が高いものを選択するので、ゴールするという物が前提となっているので、これが最大値が指定された物になります。つまり、その中で進むにはどうすればいいのか?を模索しながら、自分なりのルートを作り進むことになります。これがクリアできると落ちなくなるのですが、次に、障害物を入れた

 

         □                      □  □ 

         □                 □  □  □      G

■■■ ■■■■  ■■■ ■■  ■  ■■■■■■■■■■

 

の状態にします。そうすると、前のアルゴリズムではどうにもならなかったので、障害物でつまり始めるのですが、飛ぶことでクリアできるようになるので、最初の部分を超える事が出来るようになります。しかし、後半の部分は前のアルゴリズムでは無理あできないようになっているので進めなくなりますが、これも学習をしているとクリアできるようになります。この後に、

 

         □                      □  □ 

  ▲     □     ▲          □  □  □ ▲    G

■■■ ■■■■  ■■■ ■■  ■  ■■■■■■■■■■

 

に挑戦してもらうことになりますが、 【 ← ▲ → 】 と言う移動を行い、プレイヤーとの座標を縮めるルーチンで動いてくるようにした場合、固定物だけの条件とは異なるので難易度が一気に上がります。その為、最初の2つよりも学習の時間は長くなりますが、クリアできるようになります。ただし、この学習段階で明らかに無駄な事をして学習で詰まってしまう事があるのですが、その場合、【 その動きは間違っている 】 という事を教えてあげればいいので、評点を下げて、その行動がダメな事を知らせると選択しなくなります。

 

 このようにAIが隔週する場合、問題と答えをセットとして学習して、その問題と答えの組み合わせから条件式を組んで傾向から予測をする

【 教師あり学習 】 と、データの分布から特徴を分類して、その結果、どう言った傾向があるのか?を導き出す 【 教師なし学習 】 がありますが、それとは別に、用意された良し悪しの条件に準じて、目の前の課題を自発的に考えてクリアしていく 【 深層学習 】 が存在します。

 

 人が学習する場合も、AIと同じ学習を行っているのですが、疑問があった場合には、多くの場合で答えが存在しますが、法則性のあるものには、その法則を示す方程式や恒等式と言う法則を示す答えが存在している訳です。その為、これを学習する為には、 【 OOの運動の法則はなぜそうなっているのだろうか? 】 と考えた時、解明されている物については 【 研究結果により導き出された、正しい結論である定理と、それを数式で証明した運動方程式が存在する 】 わけです。

 

 この条件で考えると、問題と答えが一緒に存在する訳ですが、知識を付ける場合、この二つをセットで記憶しているはずです。つまり、人が知識を付ける時、AIと同じように 【 強化学習 】 を行っていて、素の中の 【 教師あり学習 】 によって知識と言う思考を行う上での材料をストックしている訳です。

 

 物事を考える場合、情報を整理して、組み立てる必要があります。この場合、 【 最初にデータを分類してグループ化して傾向を見る 】 ことになりますが、これが、AIが行っている 【 教師なし学習 】 になります。つまり、人も思考や判断をする場合に、情報がなければ何もできませんが、その場合に必要になるのは、 【 整理された情報 】 になります。その上でそのデータから傾向を見て判断をして、対策などを練る訳ですが、これが、ビッグデータを用いたデータマイニングと全く同じ処理になります。

 

 AIも決められたルールの中で課題に取り組むときには、考え、失敗しながらも繰り返して目標に向かって頑張ります。なので、時には間違いますし、失敗もします。学習をしている時にはそう言ったことが多く見えるのですが、これは、 【 何もわからない中で物事に着手している 】 からです。解らない事は、誰が行っても失敗もするし間違うかもしれませんが、そうならないように努力をしなければ、何時まで経っても同じ場所で足踏みをしてしまいます。強化学習では、簡単な課題でも、AIは学習時にはいろいろとミスもしますし、不思議な振る舞いをすることがありますが、正しい答えがある場合には、それに準じたものに向かってくれます。学習とは、簡単な物から始めなければ対応できませんから、課題として孫座敷いてあるものをレイヤー単位で分けて、簡素な順に学習していく事になります。この学習は、人が物事を新規に学習する場合も同じで、 【 簡単な基礎分野から応用分野を学ぶ 】 事になります。その基礎分野の学習は、後のカリキュラムで必要な知識になるので、その基礎固めが重要になります。先程の強化学習の事例では、最初に足場の状態と右に進むという基礎的な事を学んだうえで、固定された障害物への対処を行い、移動する障害物への対処を行うという流れのステップアップを用意していますが、学校で学ぶカリキュラムも同じです。その為、いきなり応用分野を学習しようとすると基礎がないので何も解らなくなるので 【 理解をする前に挫折する事になる 】 わけです。

 

 つまり、 【 基礎分野の理解と習得 】 をしないと、次のステップで挫折するのですが、これは、強化学習でAIが学習する上でも同じなので、 【 合格点が出るような学習をして課題をクリアしないで次の課題に着手すると酷い結果になるので、最初のカリキュラムからやり直しになる 】 訳です。当然、深層学習や遺伝的アルゴリズムのような物は時間を多く必要とするので、 【 おかしなレベルのモデルで学習を切り上げると、相当ひどい物が出来上がる 】 ので、そう言ったおかしな結果を学んでもらうのではなく、 【 確実な物 】 を目指してもらうことになります。その為には、明らかに不要な条件は最初から 【 それはしなくても大丈夫 】 と教えてあげておかなければなりませんし、 【 ルール 】 についても学習しないと全く使えない物が出来上がるので、環境などの条件は事前に用意してその上で学習をしてもらうことになります。AIも 【 何度失敗しても目標に向かって頑張る事で結果に行きつくことが出来る 】 のですが、 【 人が見てあげて、あきらかに間違っている場合だと、答えではなく、ダメな物を教えてあげる必要がある(教師がり学習ではないので、あくまでも答えに直結する最短ルートを教えるのではなく、自分で考えて進む上で間違いを選択しないようにしてあげるだけです。) 】 わけです。この辺りは、人が何かを学習する上でも同じです。

 

 この条件を見ると、強化学習は用意された条件から答えに行くための模索をする物になりますが、知恵とは、強化学習と深層学習が連動して動作している物(人の場合はそうなっています。)なので、これが個別の物だけ機能しても人の場合だと無理があるので、データのストックに強化学習を行い、その上で傾向と対策を選択できるようにして、教師なし学習によって関連付けをしたデータの扱いを考える事になります。ただ、何をする場合でも世の中に置いて新しいことに着手する時には、深層学習を行う時のように自分で考える事になりますが、AIですら条件だけで動くと情報がないので迷ったり間違ったりするわけですが、人が現実世界で何かに対処する時には知恵を使います。その為、強化学習でデータ解析を行い傾向と対策を導き出し、深層学習で対応しなければならない事例の場合、そのデータを基に条件の抽出を行って、不要な条件を削除してある程度の条件の範囲を抽出できるわけです。ただし、人の場合、あくまでも同じ時間軸に存在し、思考及び行動できるのは一人だけですから、遺伝的アルゴリズムのように、その思考を行える存在を複数用意し、より良い結果に行きついたモデルを元に学習を進めるようなことはできません。

 

 学習というのは、知識を得る事になりますが、その知識と言うのも最終的に判断をする上での 【 推論 】 を行う上で必要な材量になります。その時に使用するのが数学になりますが、数学の学習もカリキュラムが用意されていますから、 【 より精度の高い知識の定着と理解 】 を元にステップアップするような流れになっています。

 

 これについては、プログラミング教育も同じですが、初等教育で学ぶ【 共通したカリキュラム 】 については一律ですが、元から習い事をしている人との差が出るのは当然な内容と言えます。これを楽器に置き換えると解り易いのですが、小学校の授業で音楽の授業はありますが、この時に、楽器を習っている人だと既に譜面が読める状態で小学校に入っているはずですから、音符を見た事がない人よりも音楽の知識は長けています。これは、予習で先行して学習しているレベルが、カリキュラムよりも相当先に行っているためです。この条件で考えると、現在のようにプログラミング学習がない時代でも、 【 カリキュラムにおける能力的な差が環境の違いで生じている 】 と言うごく当たり前の内容が理解しやすいと思いますが、スタート段階で同じなのは、国の用意している制度だけなので、スタート段階での個人の能力差は環境で違ってくるわけです。ただし、ピアノを習って弾ける状態で小学校に入った人がいた場合、その人は、解らない譜面を見て理解をしながら練習してそれに至っているので、強化学習と深層学習のような模索と学習の反復で学習モデルを実装した事でそれができるようになっているわけです。つまり、そう言った 【 知識 】 を 【 経験 】 と一緒に得ているので 【 能力として身についている 】 わけです。

 

  その為、スタートラインが同じでも慣習や環境の中で身についている物がカリキュラムの中で既に経験済みの物だと、簡単にできる人も居ると思いますし、それが、経験はしたことはなくても、環境や慣習の中において関連する物が存在する場合だと、コツを掴んで出来るようになるまでの時間も短いわけです。つまり、これは 【 実装機能の有無 】 の話なので、それがない人だと、何もない状態からスタートするので、自分の中に学習モデルを構築し、それを知識や能力として使用するまでに時間がかかってしまうわけです。これが悪いという訳ではなく、 【 そう言った仕様の物 】 なので、当然のように差が発生する訳です。

 

 その為、学習の速度は個人差が生じますが、学習をする上において

 

【 基礎が理解出来ていないと、他の分野まで理解不能になる 】

 

と言う問題があります。基礎もできていない状態で応用を理解すれば先に進んだ事になる訳ではありませんから、基礎を固めた上での知識の積み上げが必要になる訳です。物理と数学の分野だと、代数も当然のように登場しますが、三平方の定理は後の三角関数(円関数)につながていますし、中学校のベクトルも物理で必要になります。また、高校の三角関数は、平面空間上での出来事を扱う場合に、ベクトルを用いた処理では 【 軸回転と軸の移動 】 などで使うので必須の知識となります。(と言うより、微分・積分と三角関数の登場頻度は結構高いです。)

 

 その為、三角関数の理解が三平方の定理や三角形の特性と言う幾何学であり、微分・積分の概念が数列やヒストグラムやグラフになりますが、積分は 【 積が分かる 】 とも読めますが、面積や体積を出すときに使用します。その為、 【 微分は傾き 】 で 【 積分は面積 】 と言う特性があります。

 

 数学もカリキュラムがあるのは、応用分野の理解に必要な基礎固めで用意されている物ですから、無意味なものは何一つありません。

 

 

 ログラミングと構造                

 

 プログラミングについては、基礎分野だとテクノロジーに触れて、実際に触ってみる事で学習することが重要ですが、前述のように構造物は、FA施設のソリューションのように 【 工程 】 が存在していて、その工程の中には 【 個別の処理 】 が存在し、その個別の処理を実現する為の 【 構造物 】 が存在します。ソリューションも処理ですから、個別の処理についても同様に工程が存在し、目的の動作になるような物が実装されている訳ですが、この構造を作る作業はプログラミングでも同じです。

 

 その為、 【 意図した挙動 】 = 【 アルゴリズム 】 と言う等式を作る必要があり、このアルゴリズムを実装する為にプログラミング言語を使う事になります。

 

 

■ 単体のソースコード                

 

 プログラミングを学ぶ場合、単体のソースコードを記述したファイルを作る作業から始まります。これは、学校のカリキュラムでScratchを使う場合もそうですし、Mbotを使う場合も同様の事が言えます。

 

 小学校では、これをブロック型言語で使うことになりますが、考え方としては、

 

 

 

 

のように 【 処理が連動している 】 ことをイメージして考えます。

 

 学習段階だと、 【 課題 】 が出てそれに答えるような流れになると思いますが、その場合、 【 課題は何だろう? 】 から考えます。そして、 【 どうすれば動くのだろう? 】 と考える事になりますが、FA施設に置き換えて考えると 【 流れ作業 】 と言う条件がありますが、これはプログラムも同じで、 【 プログラムは、処理がそのまま流れていくので、基本的には、流れ作業を行っているFA施設などと同じ 】 と考える事ができます。

 

 そうなると、 【 処理順番 】 と 【 行う作業 】 も存在する訳ですが、プログラムも全く同じなので、

 

      何をすればその結果になるのだろうか?

 

      どう言った作業を用意するとそれになるのだろうか?

 

      どう言った手順で行うとそれになるのだろうか?

 

を考える事になります。中学校の技術・家庭の時間に調理を行うカリキュラムがあると思いますが、料理には工程があるので、製造には工程が存在することを体験できます。と言うか、1年生だと木工とかがあった気がしますが、この場合も、 【 図面を引いて材料を加工して組み上げる 】 という工程があります。木工だと後で修正が効きますが、調理は、工程や分量を間違うと、 【 習性不能になる 】 ので、材料と分量と工程の全ての重要度が高くなっています。

 

 例えば、 【 ドーナツ 】 を作るとします。これは、意外と簡単で、ホットケーキミックスがあると、ホットケーキを作る工程の焼きの部分を揚げるだけですから、結構簡単な物になりますが、小麦粉から作る場合、ホットケーキミックス総統の物を用意する事になるので、適切な分量の材料を別途用意する事になります。

 

 お好み焼きの粉やホットケーキミックスは失敗しないようなレベルで工程が簡素化されているのですが、それでも粉を材料を混ぜる工程と焼きの工程が存在します。工程が間違うと似ても似つかないものになる訳ですが、失敗すると習性が効かないのでどうにもなりません。

 

 このように、日常でも

 

【 材料と工程を重視しなければまともな結果に至らない 】

 

と言う条件は多く存在する訳ですが、プログラミングも料理のように材料と分量が存在し、処理を行う為にはしかるべき工程が存在します。

 

 

■ 基本構造                       

 

 プログラミングを行う場合、処理そのものは、流れ作業と同じなので、

複数の処理が用意されていて、それが流れ作業で動作している状態になっています。この時の、流れをどうするのかを考える時に、流れ図を作って整理します。これが 【 フローチャート 】 になります。前日。

 

 

のように 【 採掘 】 => 【 精錬 】 => 【 生成 】 のように処理を大まかに分けた状態で、それを個別の作業に分類して、

 

 

 

のような処理の流れを作りました。このように、 【 必要な処理 】 が工程の中には存在しているので、それがどう言った状態で成立すれば、挙動が成立するのか?を考える事になります。

 

 プログラムは、

 

      順次(逐次)

      分岐(条件分岐)

      反復(ループ処理)

 

で構築されています。流れ作業のベルトコンベアは順次のように物が流れてきますが、それを複数製造するので、

 

      順次(逐次)

      反復(ループ処理)

 

になります。プログラミング言語も同様で、基本は 【 順次 】 なので、上の行から下の行に向かって内容が実行されます。これは、インタプリタ言語もコンパイル型言語も同じです。現在は、この2つを体験できるようになっていますが、オブジェクト指向の言語になっているので、クラスを用いてプログラミングを行う事になりますが、クラスを使わない条件でも、 【 関数内の処理 】 のように 【 一つの構造体 】 を見てみると、 【 上から順に実行されている 】 はずです。

 

 その為、処理の集合体のソースコードそのものを見ると、処理の順番の入れ替えが可能な物もありますが、これは、処理の優先度を変えたとしても問題がないような条件になります。また、関数や変数やクラスは変数を使用する処理の前に実装する必要がありますが、この処理の構造物とその処理を行う上での変化する数値の入れ子である変数については、処理の前に記述されていれば、順番の制約はありません。

 

 その為、 【 一連の流れを行う 】 と言うだけの処理だと、Scratchでもそうですが、 

 

【 ベルトコンベアで部品を流して組み立てるのと同じ考え方 】 

 

になります。

 

 この時に使用するのが、変数で、FA施設のロボットに該当するのが関数になります。Scratchを使った小学校のカリキュラムだと、こうした流れについては、 

 

      ブロックで変数の宣言

      ブロックで処理の実装

 

をすることになりますが、プログラム上で流れて来るものが変数で、ロボットアームに該当する 【 処理の内容 】 をブロックで組んでいく事になります。

 

 順次だけで処理をすると、 【 複数回繰り返す 】 のような処理をする場合コードが無駄に長くなるのですが、その場合の考え方は、小学校2年生で出てくる 【 かけ算 】 の考え方ですから、ループ処理で対応します。つまり、この内容が 【 反復 】 になります。

 

 その為、 【 カウンターのように回数を数えながら処理をする 】 場合だと、ループ処理が必要になります。また、ループ処理の場合、プログラムの構造をどうするのかで実装方法が変わりますが、任意のプログラミング言語でフォームアプリ(GUIを使ったアプリケーション)を作る場合で 【 処理が永続して実行される 】 ような物を作る場合だと、処理が反復して実行される必要があります。その場合、ループ内に処理を包含する必要が出てきます。

 

 例えば、 【 乱数で文字を選出して、足し算の問題を出して解を答えて、正解か不正解かの結果を出すようなプログラム 】 を書いたとします。この場合、 【 順次 】 の処理だけだと、一度回答をするとプログラムの処理が終わるので、そのまま終了してしまいます。

 

 これは、Scratchでスプライトを動かす場合もそうですが、挙動を実装するだけだと、 【 始点から終点にプログラムが流れて終わってしまう 】 訳です。これを連続して行う場合、入力待ちなどを入れてアプリケーションとして 【 ループの継続の可否 】 を確認して処理を実装する事になりそうですが、そうした場合に、反復を選択した時に初期化をして変数(任意の範囲の乱数)で変数Aと変数Bを用意した後に変数Cを用意して 【 C = A + B 】 のように変数を代入し、回答用に変数Dを用意して 【 C = D 】 (プログラムの場合だと、C == D)の判定をします。この時に、その条件を満たせば正解になり、そうでない場合(elseによる処理)を実装で不正解になるようにすれば、計算のプログラムを作ることができます。

 

 この内容を見てもらうと

 

      ブール型で継続の可否の判定を行っている

      比較演算子で一致と不一致の判定をしている

 

訳ですが、こうした 【 判定 】 を行う時には、どのプログラミング言語でも 【 条件分岐 】 を行います。

 

 プログラミングを行う場合、

 

■ 順次                         

 

   プログラム内の処理を順番に行う事。

   プログラムの実行時には順番に処理されるので、コード

   を書いたときには、必ず存在する処理。

 

■ 反復                         

 

   処理を包含して、その内容を指定した条件で繰り返す。

 

   算数の掛け算や割り算のような処理や、等差数列や

   等比数列のように繰り返す事で処理が行われるもの。

 

   カウンターを回しながら特定の数だけ同じ処理をする

   場合やアプリケーションを立ち上げた後に終了処理を

   選択するまで処理が継続するような作りにする場合に

   使用する。

 

■ 条件分岐                      

 

   指定した条件に対して判定を行い、処理を実行する。

 

   プログラムの継続と終了の選択(ループの継続の判

   定)や、ループ回数の指定をした場合にその数値の

   判定をする場合などに使用する。

 

   ゲームのフラグや、条件抽出時に論理演算を用いて

   判定する場合にも条件分岐を用いる。

 

 

の3つが存在しますが、これは、コードの記述が存在しなかったデバイスだけで処理をする時代(カラクリやオートマタなど)を作る場合も同じです。

 

 先ほどのプログラムですが、任意の数を出すとしても、整数のたし算の場合だと、問題は出ないので簡素な作りにできます。また、たし算のループ処理のかけ算にプログラムを変更しても、【 丸め誤差 】は出ないので、影響がありません。引き算の場合だとint型だと問題がないのですが、floatの場合だと、丸め誤差が出るので四捨五入をする必要があるのですが、この条件から、 【 無理数に対する処理を実装する 】 必要が出てきます。引き算の場合だと、中学校以上だと数学のカリキュラムの中に項と符号が出るので、たし算と同じように数値を使うプログラムを使用できますが、小数点数が増えるような条件になると 【 浮動小数点の表示 】 になるので、数学で使用する 【 固定小数点数とは異なる表記 】 になります。その為、固定小数点数の後にeの累乗をしたものをかけ合わせた数値として登場します。

 

 固定小数点数では、小数点以下に数値が大量に並びますが、この場合、 【 整数 】 【 小数点数 】 の表記が異なります。これは、小学校の算数だと、この状態になりますが、中学校の数学だと累乗と指数が登場するので、 【 桁数は指数でコントロールできる 】 と言うとを学びます。つまり、

 

      10000 : 104

      0000.1 : 10-4

 

となるので、10進数のシフトレジストを行う場合、変数に指数を指定しておいて、変数の変動と符号の有無で、整数と小数点数の変化を与える事ができます。二進数のシフトレジストだと、かけ算とわり算で行えるのですが、中学校の数学だと、10進数のシフトレジストも比較的簡単なプログラムで実装する事ができます。現在は、インタプリタ言語も関数やクラスを使えるので、関数に 【 10進数のシフトレジスト 】 としてこの処理を実装しておけば、プログラム内で指数と符号の情報(指数が数値で、符号はブール型)を入力すると、用意した数値の桁数をコントロールする事ができます。

 

 小学校の算数だけで、プログラミングを行う場合、数列と加減法が存在するのと、6年生の正比例のグラフを 【 二軸の数列の構成 】 として考えると、 【 ”かずのせん”が2軸になっただけ 】 なので対応しやすいと思います。mbotの平面座標での動作も、数列が空間内に二軸あり、垂直方向の軸が回転専用になっているので、ブロック型の言語でプログラミングが出来るようになっていますが、Scratchのスプライトのある空間も 【 座標軸 】 になっているので、考え方は同じです。あと、その時に 【 移動距離 】 を指定しますが、座標は移動すると数値が累積されていくので、 【 等差数列 】 のように推移していきます。

 

 その為、Scratchを使って動きを考える場合、 【 かずのせん 】 での 【 たし算 】 と 【 ひき算 】 を行った時の位置の変化と同じですから、座標の変化を行う時に、 【 変化が起きる条件 】 を追加しているので、 【 操作によって動く 】 ようになります。

 

 速度のコントロールは、 【 時間 】 と 【 距離 】 になりますが、プログラムの中で 【 時間 】 のコントロールをする場合、 【 遅延 】 を入れるので、 【 処理待ち 】 を入れる事になります。そうすることで、次の移動までの時間を遅らせる事が出来るので、速度を遅くできます。イメージとしては、道路を法定速度で移動している状態があり、その道路が空いている状態が 【 ディレイなし 】 で、渋滞が発生していて、本来の速度で移動できていない状態が 【 ディレイあり 】 になります。この条件が発生すると、 【 距離は同じでも、速度が変わる 】 ので現実世界でも到着するまでの時間が長くなるわけですが、この考え方で速度を調整する事になります。

 

 演算を行った時に、動きが速すぎる場合、座標変動をするオブジェクトの処理に遅延を入れると速度の調整ができますが、速度をコントロールする場合、

 

      遅延

      移動距離

 

の二つでコントロールできます。

 

 【 距離 】 と 【 時間 】 と 【 速度 】 の関係は小学校で学ぶのですが、プログラム上で 【 移動距離 】 だけ指定すると、そのプログラムの実行時の速度で移動するので、基本的に実行環境における速度以上にはなりません。それを最高速として考えて、必要な速度まで遅延を入れて遅くする事で移動時間を遅らせる事ができます。移動距離は画面上で一つの処理で何ピクセル動くのか?を考える事になるので、距離を長くするとその分速くなります。ただし、距離を長くしすぎるとワープしたような処理になるので、動きを考えると、適正な移動距離で調整をすることになります。その為、挙動に対して適正な速度を実装する場合には、遅延と距離を用いる事になります。

 

 その為、プログラミングを行う場合、小学校の算数の知識でも少し工夫をするといろいろなことができます。

 

 構造物を考える場合、機材もプログラムも、処理の集積になっているのですが、基本的な構造の考え方は同じなので、それがどう言った構造で孫座し知恵居るのかを考える事になります。数学もそうですが、基礎分野が理解できていると、その後の応用や拡張分野の理解が出来るので、理解を深める事ができます。現在のプログラミング言語では、ライブラリやクラスモジュールなどでも実装の関数を使用してプログラムを組む事が出来るようになりますが、これを使う場合も、 【 標準ライブラリでのプログラミングが出来ていないと対応できない 】 ので、基礎を固めた上での応用分野の学習を行う必要があります。