
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 // 全体的な見た目を確認
}
}
}
このコードでは以下のような要素を考慮しています:
時系列の連続性
朝の一連の作業を順序立てて定義
各ステップの連続性を保証
黒板操作の詳細
消去作業の完全性
書き込み位置の正確な指定
チョークと黒板消しの適切な取り扱い
書き込み内容の構造化
日付の標準的なフォーマット
日直名の適切な配置
視認性の確保
検証プロセス
各ステップでの確認
最終的な外観の確認
エラー状態の検出
このように、朝の日直の作業を位相的に連続な操作として表現することで、作業の順序や依存関係を明確に定義することができます。
読んでいて、疑問がわいた人は正解です。
「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について、改めて話します。このことはいったんおいておいて、次へどうぞ。