[課題8]
三角形の上には四角形を乗せることができないという制約を扱えるようにせよ.
- ソースは課題8の下に貼っときます。
- ブロックの色や形(以下要素)は具体化に縛りが付いた制限付き変数(その要素を持ったブロックでしか具体化されないだけで他は?xとかと一緒)として扱ってるので、オペレーターのリストの?yをsquareに変えるだけで行けました。
- ただ、var2メソッドと、BlockOp.isHaveメソッド、Unifier.tokenMatchingメソッドが間違ってたから動かなかった。
変数はrenameメソッドでリネームされるので、square5とかになるんだけど、変数かどうか判定するvar2メソッドが、ブロックの要素と完全一致しないと変数と判定しない仕様になってました。
var2メソッドを以下に変更
boolean var2(String str1) {
// ブロックの要素(色、形)なら変数
//return BlockOp.elements.contains(str1);
Iterator ite = BlockOp.elements.iterator();
while(ite.hasNext()) {
if(str1.startsWith((String) ite.next())) {
return true;
}
}
return false;
}
同様の理由でBlock.isHaveメソッドを以下に変更
boolean isHave(String element) {
if(element.startsWith(this.name) || element.startsWith(this.color)
|| element.startsWith(this.shape)){
return true;
}
return false;
}
Unifier.tokenMatchingメソッドは、(var2,var2),(var,var2)(var2,var)の組に対応してなかった。この場合は何か知らんけどvarMatchingに投げとけば動くので、
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);
if (var2(token1) && var2(token2))
return varMatching(token1, token2);
if (var(token1) && var2(token2))
return varMatching(token1, token2);
if (var2(token1) && var(token2))
return varMatching(token1, token2);
return false;
}
に変更(なげぇw)
- なんかふつーに三角の上に置いちゃうぜ -- こーへ (2010-12-16 14:34:31)
最終更新:2010年12月16日 14:34