[課題1]
教科書の実行例(p.134 図3.18, p.147 例3.2)を変更して実行し,正しくない動作をする例を見つけよ.正しくない動作の原因箇所をプログラム中から探し,どのように修正すれば良いかを考え,修正せよ.
1行目を追加すればおk
newOperator=newOperator.instantiate(theBinding);
plan.addElement(newOperator);
theCurrentState = newOperator.applyState(theCurrentState);
かるーく解説
ここで変数を書き換えないとデリートしたい条件の一部が変数(?x)のままになってしまい
applyState内で削除することが出来ない
また同様に追加も変数名で行われてしまい、のちのエラーにもつながる
たぶん
- 課題1もとくんのだとループに入る模様?
- 現状態にAonAとか入るとどうしようもなくなってループ?
- 暫定的な解決案
applyState(Vector theState)で、デリートリスト使って
現状態からデリートするときに存在しないやつがデリート対象になってても
エラーがでない仕様になってるからそこをいじってやれば一応とまりそう
まずapplyStateを以下のように置き換える
失敗したとき現状態を空にするようにしてみた
public Vector applyState(Vector theState) {
// DELETEリストを状態から削除
for (int i = 0; i < deleteList.size(); i++) {
if (theState.removeElement(deleteList.elementAt(i))) {
}
else {
theState.clear();
return theState;
}
}
// ADDリストを状態に追加
for (int i = 0; i < addList.size(); i++) {
theState.addElement(addList.elementAt(i));
}
return theState;
}
そんでもとくんが追加したあたりを
newOperator = newOperator.instantiate(theBinding);//
plan.addElement(newOperator);// プランに具体化したオペレータを追加
theCurrentState = newOperator
.applyState(theCurrentState);// 現状態を更新?
if (theCurrentState.isEmpty() == true) {
System.out.println("\n ?失敗? \n");
// 失敗したら元に戻す.
theBinding.clear();
for (Enumeration e = orgBinding.keys(); e
.hasMoreElements();) {
String key = (String) e.nextElement();
String value = (String) orgBinding.get(key);
theBinding.put(key, value);
}
theCurrentState.removeAllElements();
for (int k = 0; k < orgState.size(); k++) {
theCurrentState.addElement(orgState
.elementAt(k));
}
plan.removeAllElements();
for (int k = 0; k < orgPlan.size(); k++) {
plan.addElement(orgPlan.elementAt(k));
}
} else {
System.out.println("8 " + theCurrentState);
return i + 1;// 選択点の次を返す?
}
こんな感じでイフ分岐させれば一応はじかれます
空が返ってきたら失敗判定
- ただ家でやったらオーバーフローにならないループみたいな動きしててあやしい。
- planningメソッドのFailが表示されるとこの分岐に入ったときにその動きしてた。
- cPointが常に0だけどいいのかな?
planningAGoalの方に以下のメソッド追加
boolean opCheck(Operator op, Vector theCurrentState){
//ontable Xが有ればremoveのOPをけしちゃる
//あとは汎用性を持たせればおk
if(theCurrentState.contains("ontable B")&&op.name.startsWith("remove B"))
return false;
return true;
}
んで
for (int j = 0; j < addList.size(); j++) {
if ((new Unifier()).unify(theGoal, (String) addList
.elementAt(j), theBinding)) {
Operator newOperator = anOperator.instantiate(theBinding);
Vector newGoals = (Vector) newOperator.getIfList();
System.out.println(newOperator.name + "イ");
//オペレーターが正しいか調べる。
if(opCheck(newOperator,theCurrentState)){ ←これ
planningAGoalの、ここのForループにIFを追加して
forの閉じ括弧の手前で追加したIFに対応する閉じ括弧を追加する
あとはopCheckをB以外でも動くようにすればおk
最終更新:2010年12月06日 13:52