[課題4]
教科書のプログラムでは,ブロックの色や形を考えていないので、色と形を扱えるようにせよ。具体的には,Aが赤で三角形,Bが青で四角形,Cが黄で四角形とし,色と形を使ってゴールを指定できるようにせよ. 例えば,"red on blue" や"square on blue"のように.
- Blockの名前、色、形を構造体みたいにして持てばいいだけじゃないの?ってことで試してみる(なおき
- とりあえずBlockクラスはそれっぽくできてる。blue on redみたいな文からblueとredがブロックだっていう判定まではできた。(なおき
- 色とか形を名前に置き換えるところを作成中(なおき
- Blockクラスをちょい変えた。あとBlockについてごにょごにょするBlockOpクラスを増やしてみた。
- BlockOpクラスにブロックのlist作らない方がいいかもしれないからその辺はまた考える。
- Block.javaはブロックを定義するBlockクラスとブロックの追加とかインデックス調べたりするBlockOpクラスからなる
import java.util.HashSet;
import java.util.ArrayList;
class Block {
String name = new String();
String color = new String();
String shape = new String();
Block(String initName, String initColor, String initShape) {
this.name = initName;
this.color = initColor;
this.shape = initShape;
}
boolean isHave(String element) {
if (this.name.equals(element) || this.color.equals(element)
|| this.shape.equals(element)) {
return true;
}
return false;
}
}
class BlockOp {
static ArrayList<Block> list = new ArrayList<Block>();
static HashSet<String> elements = new HashSet<String>();
/**
* ブロックの追加
*
* @param initName
* @param initColor
* @param initShape
*/
public void addBlock(String initName, String initColor, String initShape) {
list.add(new Block(initName, initColor, initShape));
elements.add(initColor);
elements.add(initShape);
}
/**
* nameのブロックの色または形がelementならtrue
*
* @param name
* @param element
* @return
*/
public boolean isHave(String name, String element) {
System.out.println("isHave");
return list.get(indexOf(name)).isHave(element);
}
/**
* nameStrのブロックのindexを返す
*
* @param nameStr
* @return
*/
public int indexOf(String nameStr) {
System.out.println("indexOf");
for (int index = 0; index < list.size(); index++) {
// System.out.println(index);
if (nameStr.equals(list.get(index).name)) {
return index;
}
}
return -1;
}
}
- 課題1修正後のPlanner.javaの変更部分
- Planner、Unify、Operatorクラスにそれぞれに、色や形とかを変数としてみなすvar2メソッドを追加
private boolean var2(String str1) {
// ブロックの要素(色、形)なら変数
return BlockOp.elements.contains(str1);
}
- あとif(var(tmp))となっている部分をif(var(tmp)||var2(tmp))に書き換える。
具体的には
- PlannerクラスのinstantiateStringメソッド
- OperatorクラスのgetVars、renameVars、instantiateStringメソッド
BlockOp bop = new BlockOp();
↑addBlockを呼び出すのを簡単にしてるだけ?だからいらん可能性高い。
- startメソッドのinitGoalList()とかしてるところに
//ブロックの初期化
ArrayList<Block> blockList = initBlock();
/**
* ブロックの設定
*
* @return
*/
private ArrayList<Block> initBlock() {
bop.addBlock("A", "red", "triangle");
bop.addBlock("B", "blue", "square");
bop.addBlock("C", "yellow", "square");
bop.addBlock("D", "green", "triangle");
return BlockOp.list;
}
boolean tokenMatching(String token1, String token2) {
if (token1.equals(token2))
return true;
if (var(token1) && !var(token2))
return varMatching(token1, token2);
if (!var(token1) && var(token2))
return varMatching(token2, token1);
if (var(token1) && var(token2))
return varMatching(token1, token2);
if (var2(token1) && !var2(token2))
return blockMatching(token1, token2);
if (!var2(token1) && var2(token2))
return blockMatching(token2, token1);
return false;
}
boolean blockMatching(String vartoken, String token) {
if (vars.containsKey(vartoken)) {
if (token.equals(vars.get(vartoken))) {
return true;
} else {
return false;
}
} else {
//
if (new BlockOp().isHave(token, vartoken)) {
replaceBuffer(vartoken, token);
if (vars.containsValue(vartoken)) {
replaceBindings(vartoken, token);
}
vars.put(vartoken, token);
System.out.println(vars);
} else {
return false;
}
}
return true;
}
これで動くはず。ゴールをblue on squareとかにしてやってみて
最終更新:2010年12月12日 20:39