アットウィキロゴ

[課題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メソッド

  • Plannerクラス
    • グローバル変数で
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;
}

  • Unifyクラス
    • tokenMatchingメソッドの書き換え
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;
}

    • blockMatchingメソッドの追加
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
添付ファイル