<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/groupwork/">
    <title>groupwork @ ウィキ</title>
    <link>http://w.atwiki.jp/groupwork/</link>
    <atom:link href="https://w.atwiki.jp/groupwork/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>groupwork @ ウィキ</description>

    <dc:language>ja</dc:language>
    <dc:date>2011-01-30T22:21:32+09:00</dc:date>
    <utime>1296393692</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/groupwork/pages/1.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/groupwork/pages/24.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/groupwork/pages/2.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/groupwork/pages/23.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/groupwork/pages/21.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/groupwork/pages/19.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/groupwork/pages/15.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/groupwork/pages/18.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/groupwork/pages/20.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/groupwork/pages/17.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/groupwork/pages/1.html">
    <title>トップページ</title>
    <link>https://w.atwiki.jp/groupwork/pages/1.html</link>
    <description>
      -[[授業ページ&gt;http://www-toralab.ics.nitech.ac.jp/lecture/kpro/2010/index.html]]

***プロジェクト名（フォルダ名）はVectorで統一してください
-やり方:イクリプスの左側のツリーでプロジェクト選択した状態でF2
****各々の範囲についてレポート作成してください

***スライド・発表→空
***ＧＵＩ→こーへ
***くろーら→なおき
***ふれーむ→もと
***正規表現→なべ


インスコしたソフトのバージョンアップをチェックしてほしいな・・・
*保存フェーズ
＠GUI
インストール済みにチェック
↓
installスロットにその時点のdateを入れる。(入れる＆保存を同時にやるメソッドを作ります→installed(softID)みたいな)
＠frame
installスロットに更新があったら、ファイルで情報を保存しておく

*更新チェックフェーズ
@GUI
アップデートチェックみたいなボタンつくる→フレームのアップデートメソッドを呼び出す→更新があるソフトIDが返る
@フレーム
アップデートメソッドが呼び出されたらインストール情報が保存されたソフトについて
URLをクローラに渡して抽出保存してもらい、スロット値を更新する（特にDATE）
install != date　になっているソフトIDを返す
@クローラー、正規表現
与えられたURL(ソフトのメインページを渡す予定)についてDL＆抽出保存するメソッドよろ
↑softCrawler(ArrayList&lt;String&gt;)メソッドにソフトのメインページURL渡せばダウンロード抽出保存してくれるよ。ArrayListのがいっぺんにたくさんできていいかなと思ったんだけど、使いづらければString引数にするわ（なおき

*進捗
SoftwareFrame vecSoftwares = new SoftwareFrame();
ecSoftwares.makeFrame();//フレーム作成
vecSoftwares.makeInstance();//（落とした）抽出ファイルからインスタンス作成(+以前のインストール情報ファイルからinstallにも代入)

vecSoftwares.uninstalled(&quot;se016873&quot;);//インストール済みのチェックボタンをはずしたとき(インストール情報ファイル削除＆installスロットにnull代入)
vecSoftwares.installed(&quot;se016873&quot;);//インストール済みのチェックをつけたとき(インストール情報ファイル(上書き)保存＆installスロットにdateスロットの値代入)
vecSoftwares.updateChecker();//インストール済みソフトについて更新をしらべる。返りはハッシュセット

*Crawler（1/30 4:00更新）
コンストラクタは引数を与えなくても大丈夫になったので外からメソッド呼び出すときは使いやすくなりました。

-カテゴリーページからソフトをダウンロードしたい場合→(new VectorCrawler()).cateCrawler(String)でURLを引数に
-複数のソフトをダウンロードしたい場合→(new VectorCrawler()).softCrawler(ArrayList&lt;String&gt;)でソフトのメインURLのリストを引数に
-ソフトを一つだけダウンロードしたい場合→(new VectorCrawler()).downloadSoft(String)でソフトのメインURLを引数に




































----


**@wikiへようこそ
-ウィキはみんなで気軽にホームページ編集できるツールです。
-このページは自由に編集することができます。
-メールで送られてきたパスワードを用いてログインすることで、各種変更（サイト名、トップページ、メンバー管理、サイドページ、デザイン、ページ管理、等）することができます

**まずはこちらをご覧ください。
-[[@wikiの基本操作&gt;http://atwiki.jp/guide/category2.html]]
-[[用途別のオススメ機能紹介&gt;http://atwiki.jp/guide/category22.html]]
-[[@wikiの設定/管理&gt;http://atwiki.jp/guide/category6.html]]

**分からないことは？
-[[@wiki ご利用ガイド&gt;http://atwiki.jp/guide/]]
-[[よくある質問&gt;http://atwiki.jp/guide/category1.html]]
-[[無料で会員登録できるSNS内の@wiki助け合いコミュニティ&gt;http://sns.atfb.jp/view_community2.php?no=112]]
-[[@wiki更新情報&gt;http://www1.atwiki.jp/guide/pages/264.html]]
-[[@wikiへのお問合せフォーム&gt;http://atwiki.jp/helpdesk]]
等をご活用ください

**@wiki助け合いコミュニティの掲示板スレッド一覧
#atfb_bbs_list(112)

**その他お勧めサービスについて
-[[大容量１Ｇ、PHP/CGI、MySQL、FTPが使える無料ホームページは@PAGES&gt;&gt;http://atpages.jp/]]
-[[無料ブログ作成は@WORDをご利用ください&gt;&gt;http://atword.jp/]]
-[[2ch型の無料掲示板は@chsをご利用ください&gt;&gt;http://atchs.jp/]]
-[[フォーラム型の無料掲示板は@bbをご利用ください&gt;&gt;http://atbb.jp/]]
-[[お絵かき掲示板は@paintをご利用ください&gt;&gt;http://atpaint.jp/]]
-[[その他の無料掲示板は@bbsをご利用ください&gt;&gt;http://atbbs.jp/]]
-[[無料ソーシャルプロフィールサービス @flabo(アットフラボ)&gt;&gt;http://sns.atfb.jp]]

**おすすめ機能
-[[気になるニュースをチェック&gt;http://atwiki.jp/guide/17_174_ja.html]]
-[[関連するブログ一覧を表示&gt;http://atwiki.jp/guide/17_161_ja.html]]

**その他にもいろいろな機能満載！！
-[[@wikiプラグイン&gt;http://atwiki.jp/guide/category17.html]]
-[[@wiki便利ツール&gt;http://atwiki.jp/guide/category32.html]]
-[[@wiki構文&gt;http://atwiki.jp/guide/category16.html]]
-[[@wikiプラグイン一覧&gt;http://www1.atwiki.jp/guide/pages/264.html]]
-[[まとめサイト作成支援ツール&gt;http://atwiki.jp/matome/]]

**バグ・不具合を見つけたら？ 要望がある場合は？
お手数ですが、メールでお問い合わせください。    </description>
    <dc:date>2011-01-30T22:21:32+09:00</dc:date>
    <utime>1296393692</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/groupwork/pages/24.html">
    <title>フレーム</title>
    <link>https://w.atwiki.jp/groupwork/pages/24.html</link>
    <description>
      -ソフトウェアフレーム
--ソフト名→str
--ソフトID→str→IDでインスタンス作るからスロットではない
--ベクターのページのURL→str
--ダウンロードURLの直リン→str
--検索用キーワード集→str
--簡単な説明→str
--詳細説明→str
--画像→jpgのファイル名だからstr
--対応OS→Str？OSフレーム？
--カテゴリー→str?カテゴリフレーム？
--フリー、シェアなどソフトの種類→str?種類フレーム？
--作者→作者フレーム
--ユーザー評価値→int
--評価ユーザー数→int
--ユーザーコメント→コメントフレーム
--バージョン　ｓｔｒ？（ダウンロードページにある）
--サイズ　いんｔ（ダウンロードページにある）
--インスコされたか否か（これは正規表現とは関係ないけど）

OSフレームは作らなくてSTRで十分良いかな
-カテゴリフレーム
--親カテゴリ
--子カテゴリ
インスタンス用に自分のカテゴリ名

-作者フレーム
--作者名→str
--作者ハンドル→str
--作者ID→str→インスタンス用
--作者HP→str
--作品→ソフトウェアフレームが入る

-コメント詳細フレーム
--ヘッダ（ナンバー、日付、ハンドルネーム）→str→インスタンス用→おそらくユニークだろう・・・完全ではないが
--soft-ID　どのソフトウェアのコメントか
--タイトル→str
--ボディ→str    </description>
    <dc:date>2011-01-23T14:23:04+09:00</dc:date>
    <utime>1295760184</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/groupwork/pages/2.html">
    <title>メニュー</title>
    <link>https://w.atwiki.jp/groupwork/pages/2.html</link>
    <description>
      **メニュー
-[[トップページ]]
-[[授業ページ&gt;&gt;http://www-toralab.ics.nitech.ac.jp/lecture/kpro/2010/index.html]]
-[[フレーム]]
----
**更新履歴
#recent(10)
----
**リンク
-[[@wiki&gt;&gt;http://atwiki.jp]]
-[[@wikiご利用ガイド&gt;&gt;http://atwiki.jp/guide/]]
-[[プラグイン紹介&gt;プラグイン]]
&amp;link_editmenu(text=ここを編集)    </description>
    <dc:date>2011-01-23T12:12:44+09:00</dc:date>
    <utime>1295752364</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/groupwork/pages/23.html">
    <title>最新版</title>
    <link>https://w.atwiki.jp/groupwork/pages/23.html</link>
    <description>
      16日15時
planner→こーへーのフォルダから　647行目にエラー、文の最後にtaticっていう意味不明な文字が書いてあったのでそれを消した
　　　→確認したところ直樹があっぷしたplannerの変更部分は適応済み
ぐい→こーへーのフォルダから。（なべちゃんがアップしたGui2をplannerと合体するように改訂したやつ）
pぐら→最新
ぶろっく→[[課題8]]にあっぷしてあったやつから    </description>
    <dc:date>2010-12-16T15:20:36+09:00</dc:date>
    <utime>1292480436</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/groupwork/pages/21.html">
    <title>課題8</title>
    <link>https://w.atwiki.jp/groupwork/pages/21.html</link>
    <description>
      ***[課題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) &amp;&amp; !var(token2))
			return varMatching(token1, token2);
		if (!var(token1) &amp;&amp; var(token2))
			return varMatching(token2, token1);
		if (var(token1) &amp;&amp; var(token2))
			return varMatching(token1, token2);
		if (var2(token1) &amp;&amp; !var2(token2))
			return blockMatching(token1, token2);
		if (!var2(token1) &amp;&amp; var2(token2))
			return blockMatching(token2, token1);
		if (var2(token1) &amp;&amp; var2(token2))
			return varMatching(token1, token2);
		if (var(token1) &amp;&amp; var2(token2))
			return varMatching(token1, token2);
		if (var2(token1) &amp;&amp; var(token2))
			return varMatching(token1, token2);
		return false;
	}
に変更（なげぇｗ）
----
- なんかふつーに三角の上に置いちゃうぜ  -- こーへ  (2010-12-16 14:34:31)
#comment    </description>
    <dc:date>2010-12-16T14:34:31+09:00</dc:date>
    <utime>1292477671</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/groupwork/pages/19.html">
    <title>課題6</title>
    <link>https://w.atwiki.jp/groupwork/pages/19.html</link>
    <description>
      ***[課題6]
ブロックが操作される様子をGUIで表示せよ．

AWT(java.awt)のコンポーネントを自作するときはpaint()を直接オーバライドしますが、Swingのコンポーネント (JComponentの子孫)ではpaintComponent()をオーバライドします。Swingでは、paint()が３つのメソッド (paintBorder(), paintComponent(), paintChildren())を呼び出すからです。
引数のないrepaint()はpaint()を呼び出し、そしてpaint()がpaintComponent()を呼び出します。

あっはっは

**何かがおかしい
[[課題8]]適用後、挙動がおかしくなった。プランナーはPlace返してるのに、put on tableする。
具体的には、
スタート状態
ontable B
ontable A
clear B
clear A
handEmpty

ゴール状態
A on B
で
***** This is a plan! *****
pick up A from the table
Place A on B

て返ってくるけど、Aを持ちあげて、そいつを何故か床に置いちまうんだわこれがorz
よくわからんので、任せた！
変更前は問題なかった…よな？（なおき

----
- 結果を受け取って→表示でおｋ？  -- ｍｔ  (2010-12-08 11:11:23)
- とりあえずそれで  -- ko  (2010-12-08 17:49:26)
#comment    </description>
    <dc:date>2010-12-16T12:08:07+09:00</dc:date>
    <utime>1292468887</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/groupwork/pages/15.html">
    <title>課題2</title>
    <link>https://w.atwiki.jp/groupwork/pages/15.html</link>
    <description>
      ***[課題2]
教科書のプログラムでは，オペレータ間の競合解消戦略としてランダムなオペレータ選択を採用している．これを，あらかじめオペレータに優先度を付けておき，優先度が高いものから適用するような競合解消戦略に変更せよ．

-オペレータをキューに入れてクルクル回せばループしないし、いいんじゃないでしょーか
-つーことで作ってみます。
----
- それいいやん  -- mt  (2010-12-06 09:14:59)
- でも２回連続でリムーブしなきゃいかんとき、リムーブ→ピックアップ→リムーブ→ピックアップ　とかのループにならんかな？  -- mt  (2010-12-06 09:15:51)
----
- たぶんなるけど、そのループを解消すんのはむずそうだな  -- こーへ  (2010-12-06 23:49:10)
- 一回使ったインスタンシエーションを使わなくするor優先度を下げるなどでなんとかなるかも…  -- こーへ  (2010-12-06 23:50:01)

----
- 競合自体を起こさなくするためのゴールリストのソートアルゴリズム　--　こーへ
- 説明は長くなるから、ソースだけ。聞きたいことあったら聞いてちょん  -- こーへ  (2010-12-15 21:02:49)

/*
  * ゴールリストをプランニングしやすい順番にならべかえるメソッド
  * 
  * @param	ゴールリストを表すArrayList&lt;String&gt; goalList
  */
 public void sortGoals(ArrayList&lt;String&gt; goalList){
	 /*
	  * step 1
	  *
	  *それぞれのゴール要素をADDリストに持つオペレータを1つずつ決定する
	  */
	 ArrayList&lt;Operator&gt; theOperators = new ArrayList&lt;Operator&gt;();
	 HashMap&lt;Operator,String&gt; operatorsMap = new HashMap&lt;Operator,String&gt;();
	 for(int i = 0; i &lt; goalList.size(); ++i){
		 ArrayList&lt;Operator&gt; conflict = new ArrayList&lt;Operator&gt;();
		 for(int j = 0; j &lt; operators.size(); ++j){
			 ArrayList&lt;String&gt; theAddList = operators.get(j).getAddList();
			 for(int k = 0; k &lt;theAddList.size(); ++k){
				 HashMap&lt;String,String&gt; aBinding = new HashMap&lt;String,String&gt;();
				 if((new Unifier()).unify(theAddList.get(k), goalList.get(i), aBinding)){
					 Operator instanced = operators.get(j).instantiate(aBinding);
					 conflict.add(instanced);
					 
					 //ついでに動的な優先度決定指標となる1階層展開されたゴール要素を保存しておく
					 allGoals.addAll(instanced.getIfList());
				 }
			 }
		 }
		 //適応できるオペレータがない場合プランニング失敗
		 if(conflict == null)	return;
		 
		 //オペレータの競合が起こった場合静的な優先度に基づいてオペレータを1つに絞る
		 Operator anOperator = null;
		 int maxPriority = -1;
		 for(int j = 0; j &lt; conflict.size(); ++j){
			 if(j == 0){
				 anOperator = conflict.get(j);
			 } else if(maxPriority &lt; conflict.get(j).getPriority()){
				 maxPriority = conflict.get(j).getPriority();
				 anOperator = conflict.get(j);
			 }
		 }
		 theOperators.add(anOperator);
		 //ゴール要素とオペレータの対応関係を保存
		 operatorsMap.put(anOperator,goalList.get(i));
	 }
	 
	 /*
	  * step 2
	  *
	  *オペレータのペアに対して一方がもう一方にどれだけ貢献する可能性があるかの尺度（以下&quot;貢献度&quot;と呼ぶ）を
	  *すべてのペアに対して計算し、それらを行列として保持する
	  *
	  * ここで
	  * オペレータA(opA)のオペレータB(opB)に対する貢献度　=
	  * （opAのADDリストに含まれるopBのIFリストの要素数　+ opBのDELETEリストに含まれるopAのIFリストの要素数） (&gt;= 0である)
	  * としている
	  */
	 int size = operatorsMap.size();
	 Integer[][] contributionMat = new Integer[size][size];
	 //rowContributed は行列の各行の貢献度の和（各オペレータの非貢献度の和と考えられる）を要素に持つリスト
	 Integer[] rowContributed = new Integer[size];
	 for(int i = 0; i &lt; size; ++i){
		 rowContributed[i] = 0;
		 for(int j = 0; j &lt; size; ++j){
			 contributionMat[i][j] = 0;
		 }
	 }
	 for(int i = 0; i &lt; size; ++i){
		 Operator columnOp = theOperators.get(i);
		 ArrayList&lt;String&gt; columnAddList = columnOp.getAddList();
		 ArrayList&lt;String&gt; columnDeleteList = columnOp.getDeleteList();
		 for(int j = 0; j &lt; size; ++j){
			 Operator rowOp = theOperators.get(j);
			 ArrayList&lt;String&gt; rowIfList = rowOp.getIfList();
			 if(i != j){
				 for(int k = 0; k &lt; rowIfList.size(); ++k){
					 for(int l = 0; l &lt; columnAddList.size(); ++l){
						 if(rowIfList.get(k).equals(columnAddList.get(l))){
						// if((new Unifier()).unify(rowIfList.get(k), columnAddList.get(l))){
							 contributionMat[i][j]++;
							 rowContributed[j]++;
						 }
					 }
					 for(int l = 0; l &lt; columnDeleteList.size(); ++l){
						 if(rowIfList.get(k).equals(columnDeleteList.get(l))){
						 //if((new Unifier()).unify(rowIfList.get(k), columnDeleteList.get(l))){
							 contributionMat[j][i]++;
							 rowContributed[i]++;
						 }
					 }
				 }
			 }
		 }
	 }
	 
	 //貢献度行列表示
	 for(int i =0; i&lt;size; ++i){
		 for(int j =0;j&lt;size;++j){
			 System.out.print(contributionMat[i][j]+&quot; &quot;);
		 }
		 System.out.println(&quot;&quot;);
	 }
	 
	 /*
	  * すべてのオペレータの順序付けが完了するまでstep3,step4を繰り返す
	  */
	 ArrayList&lt;Integer&gt; indexies = new ArrayList&lt;Integer&gt;();
	 for(int i = 0; i &lt; size; ++i){
		 indexies.add(i);
	 }
	 int d = 0;
	 Operator[] sortedOp = new Operator[size];
	 while(!indexies.isEmpty()){
	 /*
	  * step 3
	  * 非貢献度が最小のオペレータを調べる
	  * 複数ある場合はすべて保持
	  */
	 Integer[] index = new Integer[size];
	 int c = 0;
	 int min = 0;
	 for(int j = 0; j &lt; indexies.size(); ++j){
		 if(j == 0){
			 min = rowContributed[indexies.get(j)];
			 index[c++] = indexies.get(j);
		 } else if(rowContributed[indexies.get(j)] &lt; min){
			 min = rowContributed[indexies.get(j)];
			 c = 0;
			 index[c++] = indexies.get(j);
		 } else if(rowContributed[indexies.get(j)] == min){
			 index[c++] = indexies.get(j);
		 }
	 }

	 /*
	  * step 4
	  * step 3で得られたオペレータを初期値として、
	  * 貢献度を参考に効率的と考えられる順序でオペレータを取り出して行く
	  */
	 boolean increase = true;
	 while(increase){
		 increase = false;
		 //抽出したオペレータから順に保存
		 for(int i = 0; i &lt; c; ++i){
			 System.out.println(d+theOperators.get(index[i]).name);
			 sortedOp[d++] = theOperators.get(index[i]);
			 indexies.remove(index[i]);
		 }
		 //次に貢献されているオペレータを抽出
		 int c1 = 0;
		 Integer[] index1 = new Integer[size];
		 for(int i = 0; i &lt; c; ++i){
			 for(int j = 0; j &lt; size; ++j){
				 if(contributionMat[index[i]][j] &gt; 0 &amp;&amp; indexies.contains(j)){
					 //他のオペレータからも貢献されている場合、それらすべてのオペレータが取り出されてからこのオペレータを取り出す
					 boolean thisIsMax = true;
					 for(int k = 0; k &lt; size; ++k){
						 if(k != index[i] &amp;&amp; contributionMat[k][j] &gt;= contributionMat[index[i]][j]){
							 contributionMat[index[i]][j] = 0;
							 thisIsMax = false;
							 break;
						 }
					 }
					 if(thisIsMax){
						 index1[c1++] = j;
						 increase = true;
					 }
				 }
			 }
		 }
		 c = c1;
		 index = index1;
	 }
	 
	 //書き換えられた貢献度行列を表示
	 for(int i = 0; i &lt; size; ++i){
		 for(int j = 0; j &lt; size; ++j)
		 System.out.print(contributionMat[i][j]+&quot; &quot;);
	 System.out.println(&quot;&quot;);
	 }
	
	 /*
	 //残ったオペレータを取り出す
	 for(int i : indexies){
		 sortedOp[d++] = theOperators.get(i);
	 }
	 */
	 }
	 
	 //所与のゴールリストを並べ替える
	 goalList.clear();
	 for(int i = 0; i &lt; size; ++i){
		 goalList.add(operatorsMap.get(sortedOp[i]));
		 //System.out.println(sortedOp[i].name);
	 }
 }
#comment    </description>
    <dc:date>2010-12-15T22:00:09+09:00</dc:date>
    <utime>1292418009</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/groupwork/pages/18.html">
    <title>課題5</title>
    <link>https://w.atwiki.jp/groupwork/pages/18.html</link>
    <description>
      ***[課題5]
グループでスムーズに開発を進めるためには，役割分担，進捗状況の管理，情報共有などが必要になる．このとき，何に気をつけるべきか，必要なことは何かを，グループ作成書類Grep6で考察せよ．

----
- 全員が数行分くらい考えてここに書く  -- こーへ  (2010-12-07 00:18:03)
- んで、だれか担当決めてまとめる  -- こーへ  (2010-12-07 00:18:23)
- 役割分担　 話し合い 個々の能力を把握し、適材適所 極端に負担を偏らせない 途中でも臨機応変に仕事を分担 助け合い 自分の強み、弱みを客観的に把握しておくことが重要、構成員に伝えておく    進捗状況の管理 全体を管理する人間を決め、極端な遅れがあれば支援させる。 大きな問題を発見した際や、行き詰まった時には相談。 各課題ごとに話し合う機会をもうける。    情報共有 Wikiなどを利用し、情報を一カ所に集めておく。 必要な機能として、全員に編集可、どこからでも閲覧可等 作成したものを置く場所を決めておく。 新しく情報が追加された際や、情報の変更、更新があった場合の通知  -- そらうみ  (2010-12-13 14:20:21)
- 見にくくなったー  -- そらうみ  (2010-12-13 14:21:03)
- なんかあったら箇条書きでもなんでもいいから書いてくれ　文章にまとめるから  -- そらうみ  (2010-12-13 14:21:48)
- 与えられた問題にたいする多視点から得られる解決策を話し合い、改善していくことが重要。ここで言う多視点とは各個人の能力の違いにおいてあらわれてくる価値観の違いとも見ることができる（ｂｙ　打矢さん）  -- こーへ  (2010-12-15 20:58:22)
#comment    </description>
    <dc:date>2010-12-15T20:58:22+09:00</dc:date>
    <utime>1292414302</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/groupwork/pages/20.html">
    <title>課題7</title>
    <link>https://w.atwiki.jp/groupwork/pages/20.html</link>
    <description>
      ***[課題7]
初期状態と目標状態(ゴール)をテキストファイルで編集できるようにせよ．

----
- GUI上で目標と初期状態のtxt読み込めるようにしといた  -- たーけ  (2010-12-13 00:25:36)
#comment    </description>
    <dc:date>2010-12-13T00:25:36+09:00</dc:date>
    <utime>1292167536</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/groupwork/pages/17.html">
    <title>課題4</title>
    <link>https://w.atwiki.jp/groupwork/pages/17.html</link>
    <description>
      ***[課題4]
教科書のプログラムでは，ブロックの色や形を考えていないので、色と形を扱えるようにせよ。具体的には，Aが赤で三角形，Bが青で四角形，Cが黄で四角形とし，色と形を使ってゴールを指定できるようにせよ. 例えば，&quot;red on blue&quot; や&quot;square on blue&quot;のように．

-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&lt;Block&gt; list = new ArrayList&lt;Block&gt;();
	static HashSet&lt;String&gt; elements = new HashSet&lt;String&gt;();

	/**
	 * ブロックの追加
	 * 
	 * @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(&quot;isHave&quot;);
		return list.get(indexOf(name)).isHave(element);
	}

	/**
	 * nameStrのブロックのindexを返す
	 * 
	 * @param nameStr
	 * @return
	 */
	public int indexOf(String nameStr) {
		System.out.println(&quot;indexOf&quot;);
		for (int index = 0; index &lt; 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&lt;Block&gt; blockList = initBlock();

--メソッド追加
	/**
	 * ブロックの設定
	 * 
	 * @return
	 */
	private ArrayList&lt;Block&gt; initBlock() {
		bop.addBlock(&quot;A&quot;, &quot;red&quot;, &quot;triangle&quot;);
		bop.addBlock(&quot;B&quot;, &quot;blue&quot;, &quot;square&quot;);
		bop.addBlock(&quot;C&quot;, &quot;yellow&quot;, &quot;square&quot;);
		bop.addBlock(&quot;D&quot;, &quot;green&quot;, &quot;triangle&quot;);

		return BlockOp.list;
	}

-Unifyクラス
--tokenMatchingメソッドの書き換え
	boolean tokenMatching(String token1, String token2) {
		if (token1.equals(token2))
			return true;
		if (var(token1) &amp;&amp; !var(token2))
			return varMatching(token1, token2);
		if (!var(token1) &amp;&amp; var(token2))
			return varMatching(token2, token1);
		if (var(token1) &amp;&amp; var(token2))
			return varMatching(token1, token2);
		if (var2(token1) &amp;&amp; !var2(token2))
			return blockMatching(token1, token2);
		if (!var2(token1) &amp;&amp; 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とかにしてやってみて
----
#comment    </description>
    <dc:date>2010-12-12T20:39:14+09:00</dc:date>
    <utime>1292153954</utime>
  </item>
  </rdf:RDF>
