prepress-tips
対話・検索・選択によるプログラミング
最終更新:
prepress-tips
-
view
最終更新日時: 2008/10/29
- 形式手法モデル理論アプローチを利用すれば プログラムの内部構造に立ち入って ライブラリを利用することができる。
そのようなライブラリの利用を前提とした対話的プログラミングを考えてみる。
※ ここで使っているソースの詳細は 形式手法モデル理論アプローチ 3 を参照してください。
perlで 狼・山羊・キャベツの川渡し
最初の対話
- mainで 何をしますか?
- title を表示する。
- Wgc問題を解く。
- 解いた結果 answer を表示する。
- 終了。
- title はどんな方法で表示しますか?
- ここでライブラリを検索して いろいろな説明などを読み
msgで表示する方法を選ぶとする。
- ここでライブラリを検索して いろいろな説明などを読み
- Wgc問題はどんな方法で解きますか?
- ここでもライブラリを検索し いろいろな説明などを読んで
goal_seekerで解く方法を選ぶとする。
- ここでもライブラリを検索し いろいろな説明などを読んで
- 解いた結果はどんな方法で表示しますか?
- 先ほどと同じく msgで表示する方法を選ぶとする。
ここまでで 次のソースができる。
ライブラリから次のソースを読み込む。
未解決の部分は次のようになる。
これでエラーは出ないが 確認のため 次のようにしておく。
これで実行すれば ソースに問題のないことが確認できる。
2回目の対話
- title は?
- Wgc問題の title
- answer は?
- Wgc問題の answer
- Wgc問題について ‥
- title は?
- '狼・山羊・キャベツの川渡し問題'
- answer は?
- @answer
- 状態とするものは?
- 川の左側を 文字列で表したもの
- 初期状態は?
- "wgcf"
- ここで @answer を初期化しておく
- 状態を文字列でユニークに表現する方法を用意する必要があります。
その方法は?- ここでライブラリを検索し uniqueを選ぶとする。
ここまでで 次のソースができる。
ライブラリから次のソースを読み込む。
未解決部分は次のようにしておく。
これらを前のソースに追記すると、未解決部分はオーバーライドされ、
これで実行すれば ソースに問題のないことが確認できる。
これで実行すれば ソースに問題のないことが確認できる。
3回目の対話
- Wgc問題について ‥
- ゴールは?
- ""
- ゴールですることは?
- 状態の推移を 文字列に変えて 解に追加する
- 状態の推移は?
- @sequence
- @sequence は 初期状態で初期化しておく
- 文字列に変える方法は?
- "answer: ".join ' → ', @sequence
これでソースは次のようになり
未解決部分は次のようにする。
これらを前のソースに追記し実行すれば ソースに問題のないことが確認できる。
4回目の対話
- Wgc問題について ‥
- 新しい状態ですることは?
- 状態を状態の推移に記録する
- 前の状態に戻すには?
- 状態の推移の最後の記録を消す
これでソースは次のようになり
未解決部分は次のようにする。
これらを前のソースに追記し実行すれば ソースに問題のないことが確認できる。
最後の対話
- Wgc問題について ‥
- ある状態で実行できることは?
- 状態に"f"が含まれれば 状態を1文字ずつに分けたもの
そうでないならば 状態に含まれない文字を1つずつに分けたもの
- 状態に"f"が含まれれば 状態を1文字ずつに分けたもの
- ある状態で実行できることを実行したあとの状態は?
- 状態に"f"が含まれないならば 状態に"f"と実行するものを加える
そうでないならば 状態から"f"と実行するものを除く
- 状態に"f"が含まれないならば 状態に"f"と実行するものを加える
- 状態が満たさなくてはいけないことは?
- 状態に"f"が含まれれば
状態に "w","g"のどちらがあり かつ "g","c"のどちらかがあること
( 両方あってもよい )
そうでないならば
状態に "w"と"g"がともにはなく かつ "g"と"c"がともにはない こと
- 状態に"f"が含まれれば
これでソースは次のようになり
未解決部分はなく 対話は終了。
これを前のソースに追記し実行すれば ソースに問題のないことが確認できる。
これを前のソースに追記し実行すれば ソースに問題のないことが確認できる。
完成したソース
オーバーライド部分を削除して 最終的にできたソースは次のようになる。
ソースの書式を変えてみる
書き換えルール
ソースの記述のしかたを 次のようなルールで 書き換えてみる。
{ ? main proc ←→ proc } sub name { ? name proc ←→ proc } { package name; ? package name func ←→ func 1; } @name; ←→ ? @name
先ほどのソースは 次のように書き換えられる。
書き換えの利点
- 対話がソースに反映され メンテナンスしやすくなる。
- プログラムの構造に関して 言語特有の表現が除去される。
- その結果 ‥
- 他言語への変換がしやすくなる。
- プログラムの構造を 言語に依存せずに 確認することができる。
- 違う言語のプログラムを 組み合わせて使う 可能性が増える。
のでは なかろうか?
書き換えを戻すスクリプト
- 書き換えたテキストをソースに戻すスクリプトは 次の通り。
- goal_seekerで使わない関数をコメントアウトしました。
- 使うときは IN の前の < を半角に変えてください。
- 使い方の例:
perl txt_to_pl.pl wgc.txt > wgc.pl
- このテーマは役立ちそうなので もう少し調べる。→ ソースの書式を変えてみる