見出し画像

TOPOS-Ξ を学ぼう!その4「mappingの中」

「日直の朝」


一連の動作をTOPOS-Ξで表現してみましょう。朝の日直の作業を`mapping`として定義します。

space Classroom {
    properties {
        continuous: Topology<Boolean> = true
        dimension: Topology<Number> = 3
        observable: Topology<Boolean> = true
    }

    // 日直の仕様
    shape DutyStudent {
        properties {
            name: String
            partner_name: String
            current_date: Date
        }

        // 朝の黒板準備タスク
        mapping morning_board_preparation() {
            properties {
                continuous: Boolean = true
                sequential: Boolean = true  // タスクは順序通りに実行
            }
            
            path {
                // 教室への入室
                unlock_classroom ->
                enter_classroom ->
                turn_on_lights ->
                
                // 黒板の準備
                approach_blackboard ->
                check_blackboard_state ->
                
                // 黒板消去(必要な場合)
                verify_eraser_condition ->
                pick_eraser ->
                erase_board_completely ->
                dust_eraser ->
                replace_eraser ->
                
                // 日付と日直名の記入
                pick_new_chalk ->
                write_date ->
                write_duty_header ->
                write_own_name ->
                write_partner_name ->
                return_chalk ->
                
                // 最終確認
                step_back ->
                verify_written_content
            }
        }

        // 日付書き込みのサブタスク
        mapping write_date() {
            properties {
                continuous: Boolean = true
                position: Vector2D = {x: 50, y: 20}  // 黒板左上部
            }
            
            path {
                format_date ->          // 日付のフォーマット
                position_chalk ->       // チョークの位置決め
                write_year_month ->     // 年月を書く
                write_day ->           // 日を書く
                write_day_of_week      // 曜日を書く
            }
        }

        // 日直名書き込みのサブタスク
        mapping write_duty_names() {
            properties {
                continuous: Boolean = true
                position: Vector2D = {x: 50, y: 40}  // 日付の下
            }
            
            path {
                write_duty_label ->     // "日直"という文字を書く
                write_own_name ->       // 自分の名前を書く
                write_separator ->      // 区切り文字を書く
                write_partner_name     // パートナーの名前を書く
            }
        }
    }

    // 黒板の状態検証
    mapping verify_board_state() {
        properties {
            continuous: Boolean = true
        }
        
        path {
            check_cleanliness ->       // 黒板の清潔さを確認
            verify_date ->             // 日付の正確さを確認
            verify_duty_names ->       // 日直名の正確さを確認
            assess_overall_appearance  // 全体的な見た目を確認
        }
    }
}

このコードでは以下のような要素を考慮しています:

  1. 時系列の連続性

    • 朝の一連の作業を順序立てて定義

    • 各ステップの連続性を保証

  2. 黒板操作の詳細

    • 消去作業の完全性

    • 書き込み位置の正確な指定

    • チョークと黒板消しの適切な取り扱い

  3. 書き込み内容の構造化

    • 日付の標準的なフォーマット

    • 日直名の適切な配置

    • 視認性の確保

  4. 検証プロセス

    • 各ステップでの確認

    • 最終的な外観の確認

    • エラー状態の検出

このように、朝の日直の作業を位相的に連続な操作として表現することで、作業の順序や依存関係を明確に定義することができます。


読んでいて、疑問がわいた人は正解です。
「pathってなんだよ!」

pathの中身はなんだということですよね?
pathの中身は、定義されたmappingの発動順を示しています。
mappingは、pathブロックに書かれたmappingで定義された動作(写像)を呼び出します。->はその順序を示しています。次はこれといっているわけです。
ここで、ふと気が付きます。pathで呼び出しているということはそれは、どこかでmappingとして定義しなければいけないのでは?その通りです。TOPOS-Ξには、言語仕様にてすでに定義済のpathがあります。
上記のソースコードには、定義されていないpathもあります。いや、むしろ定義されていないpathの萌芽多いです。pathでとりあえず何をするかを書いておいて、後で細かことはmappingで定義するということです。
えー?
えーじゃありません。それがプログラミングです。
でも、わかりやすいでしょ?mapping内のpathブロックによって、何をするかが明確になります。
実際に細かく何をするかは、別途mappingで定義します。ここで、疑問を解決します。その時、実際の「計算」

をプログラミングすることになります。
foo = foo +1;
bar = bar - 1;
foobar = foo * bar;
なんて書くわけです。これをspaveやshapeの中に書くとわかりにくくなるでしょ?数学の宿題でいえば、ひっ算は別のメモ用紙で。ってな具合の話です。
あー、だんだんわからなくなってきちゃったなぁ。

この後、pathにういての話やソースコードの分割について、話をしてから、実働部隊mappingについて、改めて話します。このことはいったんおいておいて、次へどうぞ。