このディレクトリの索引

89:デフォルトの名無しさん:2010/06/05(土) 17:58:44
>>46
% Prolog 

蛾(ごまだらきこけが,ひとりが科). 
開帳(ごまだらきこけが,成虫,'23~32mm'). 
色(ごまだらきこけが,成虫,体と翅,赤味がかった黄色). 
斑点(ごまだらきこけが,成虫,体と翅,前翅,'15個'). 
分布(ごまだらきこけが,本邦広くアジアにひろがっている). 
食性(ごまだらきこけが,幼虫,コケ類). 
長い毛(ごまだらきこけが,幼虫). 
青い点(ごまだらきこけが,幼虫,背中に2列). 
色(ごまだらきこけが,幼虫,灰色). 


90:デフォルトの名無しさん:2010/06/05(土) 19:41:39 
>>46 
% Prolog 

(_ごまだらきこけが,ひとりが科) :- ごまだらきこけが(_ごまだらきこけが). 
開帳(_ごまだらきこけが,成虫,'23~32mm') :- ごまだらきこけが(_ごまだらきこけが). 
色(_ごまだらきこけが,成虫,体と翅,赤味がかった黄色) :- ごまだらきこけが(_ごまだらきこけが). 
斑点(_ごまだらきこけが,成虫,体と翅,前翅,'15個') :- ごまだらきこけが(_ごまだらきこけが). 
分布(_ごまだらきこけが,本邦広くアジアにひろがっている) :- ごまだらきこけが(_ごまだらきこけが). 
食性(_ごまだらきこけが,幼虫,コケ類) :- ごまだらきこけが(_ごまだらきこけが). 
長い毛(_ごまだらきこけが,幼虫) :- ごまだらきこけが(_ごまだらきこけが). 
青い点(_ごまだらきこけが,幼虫,背中に2列) :- ごまだらきこけが(_ごまだらきこけが). 
色(_ごまだらきこけが,幼虫,灰色) :- ごまだらきこけが(_ごまだらきこけが). 


91:デフォルトの名無しさん:2010/06/05(土) 19:44:04 
>>46 
% Prolog 書き直し 

蛾(_ごまだらきこけが,ひとりが科) :- ごまだらきこけが(_ごまだらきこけが). 
開帳(_ごまだらきこけが,成虫,'23~32mm') :- ごまだらきこけが(_ごまだらきこけが). 
色(_ごまだらきこけが,成虫,体と翅,赤味がかった黄色) :- ごまだらきこけが(_ごまだらきこけが). 
斑点(_ごまだらきこけが,成虫,体と翅,前翅,'15個') :- ごまだらきこけが(_ごまだらきこけが). 
分布(_ごまだらきこけが,本邦広くアジアにひろがっている) :- ごまだらきこけが(_ごまだらきこけが). 
食性(_ごまだらきこけが,幼虫,コケ類) :- ごまだらきこけが(_ごまだらきこけが). 
長い毛(_ごまだらきこけが,幼虫) :- ごまだらきこけが(_ごまだらきこけが). 
青い点(_ごまだらきこけが,幼虫,背中に2列) :- ごまだらきこけが(_ごまだらきこけが). 
色(_ごまだらきこけが,幼虫,灰色) :- ごまだらきこけが(_ごまだらきこけが). 

92:デフォルトの名無しさん:2010/06/05(土) 19:49:08 
>>91 たとえば、 
あるものの幼虫はコケ類を食べる。そういうあるもののひとつは、ごまだらきこけがだ。 

と読めばよいと思う。 

93:デフォルトの名無しさん:2010/06/05(土) 20:53:07 
出題者ではありませんが、勝手に批評します。 

>>89 
同じ項構造で他の生物にも適用できるよう、項: 蛾/2 は以下の方が 
命題として適切ではないかと考えます。 

 種(ごまだらきこけが, 蛾). % ごまだらきこけがの種は蛾である。 
 科(ごまだらきこけが, ひとりが). % ごまだらきこけがの科はひとりがである。 

項: 色/2 と 色/3 で混在していますが、どちらかに統一すべきだと考えます。 

 色(ごまだらきこけが, 成虫の体と翅, 赤味がかった黄色). 
 色(ごまだらきこけが, 幼虫, 灰色). 

または 

 色(ごまだらきこけが, 成虫, 体と翅, 赤味がかった黄色). 
 色(ごまだらきこけが, 幼虫, 全体, 灰色). 

>>90 
ごまだらきこけが以外の蛾も多数登録されているものとして、 
食性について問い合わせる場合を考えます。 

 ?- 食性(_蛾, _, コケ類) % コケ類を食べる蛾は何か? 
 _蛾=ごまだらきこけが 

>>90では、変数 _蛾 がアトムにならず変数のままですから、この問い合わせには 
回答できていません。従って、解答としては>>89のほうが適切ではないかと考えます。 

94:93:2010/06/05(土) 21:23:38 
>>93を自己訂正 

>項: 色/3 と 色/4 で混在していますが、どちらかに統一すべきだと考えます。 
> 
> 色(ごまだらきこけが, 成虫の体と翅, 赤味がかった黄色). % 色/3 で統一 
> 色(ごまだらきこけが, 幼虫, 灰色). 
> 
>または 
> 
> 色(ごまだらきこけが, 成虫, 体と翅, 赤味がかった黄色). % 色/4 で統一 
> 色(ごまだらきこけが, 幼虫, 全体, 灰色). 


95:デフォルトの名無しさん:2010/06/05(土) 22:14:49 
>>93 
適切な批評をいただき感謝します。 
色のアリティが二種類になっているのは好ましくないですね。 
種、科については、可能な限り、仕様(ここでは問題文)の文面から 
述語名や変数名を拾うことを旨としているので、出てきませんでした。 
とはいえ、私も「食べる」を「食性」に置き換えたりしていますが、 
言語、概念による補強は必要だし、そうすることで述語として「強く」 
なることも事実ですね。 
>>90については、途中で端折りますが、以下のようなら自然でしょうか。 
ごまだらきこけが(_ごまだらきこけが) :- 
    色(_ごまだらきこけが,幼虫,全体,灰色), 
    色(_ごまだらきこけが,成虫,赤味がかった黄色). 

色(ごまだらきこけが,幼虫,全体,灰色), 
色(ごまだらきこけが,成虫,赤味がかった黄色). 
食性(ごまだらきこけが,幼虫,コケ類).     

96:93:2010/06/05(土) 23:11:54 
>>95 
>>>90については、途中で端折りますが、以下のようなら自然でしょうか。 

いいえ、不自然です。この問題(仕様)はすべてファクト(事実)から構成されています。 
出題者の意図(文脈)は知りませんが、単純なのにわざわざ複雑なルール(推論)を組み込むのは、 
解答として適切であるとは思えません。 

もし納得できないようでしたら、いったんPrologプログラミングから離れて 
数学の命題論理(初等数理論理学の一部)を勉強されることをお勧めします。 

97:デフォルトの名無しさん:2010/06/06(日) 13:11:46 
本質に迫るツッコミktkr 

98:デフォルトの名無しさん:2010/06/06(日) 16:58:56 
>>96 
確かに。命題論理の勉強をします。カツオの定義など支離滅裂ですね。 

私はPrologの核は単位節データベースであって、実際宿題スレでもデータベース板SQLの質問から 
多数問題を採用してきました。一方、 
このスレと「いろんな言語で宿題」スレに共通して、 

親子(為義,義朝). 
親子(義朝,頼朝). 
先祖(A,B) :- 親子(A,B). 
先祖(A,B) :- 親子(A,C),先祖(C,B). 

という定義に於いて、先祖/2はルールなのに、親子/2はなぜ事実なの?親子もルールで 
書いていくとどうなるの?という疑問に対して、何らかの答えだすという試みもして 
きました。 
よく分かっていないことは事実とせず、これからそれについてはルールが来るのだ、 
今のところまだ未定義だけどね、というのが指摘いただいた箇所の意図であり、 
奇妙な表現に拘る言い訳ということになります。 

99:93:2010/06/06(日) 21:12:22 
>>98 
Prologの単位節は「関係の存在」というファクト(事実)を表現しています。 
以下は源一族の家系の一部をファクトだけで表現した一例(の一部)です。 

 親_子(為義, 義朝). % 為義と義朝の間には親-子という関係が存在する。 
 先祖_子孫(為義, 頼朝). % 為義と義朝の間には先祖-子孫という関係が存在する。 

家系が「ファクトだけで表現できる」のが分かるかと思います。 
同様にごまだらきこけが(あるいは蛾という生物系)についてもファクトだけで表現できます。 
ですから、単位節だけで表現できる課題(仕様)については、それだけで解答すべきであると考えます。 

また、複数のファクトから新たな「関係の存在」を表現したのがルール(規則)です。 

 先祖_子孫(A, B) :- 親_子(A, B). 
  % ある人物AとBについて、AとBの間に親-子という関係が存在するならば、 
  % AとBの間には先祖-子孫という関係が存在する。 
 先祖_子孫(A, B) :- 親_子(A, C), 親_子(C, B),. 
  % ある人物AとBとCについて、AとCの間に親-子という関係が存在し、かつCとBの間に 
  % 親-子という関係が存在するならば、AとBの間には先祖-子孫という関係が存在する。 

ファクト(事実)とルール(規則)は、どちらも「関係の存在」を表現しています。 
Prologで記述した場合、その項の名前は関係の名前を指します。 
ここで、>>90,91,95における項「ごまだらきこけが(_)」について、 

 **** ごまだらきこけがは関係ではありません!! **** 

ですから、これらの解答は明らかに不自然です。 

100:93:2010/06/07(月) 00:50:12 
>>99に間違いがあったので、訂正します。 

> 先祖_子孫(A, B) :- 親_子(A, C), 先祖_子孫(C, B),. 
>  % ある人物AとBとCについて、AとCの間に親-子という関係が存在し、かつCとBの間に 
>  % 先祖-子孫という関係が存在するならば、AとBの間には先祖-子孫という関係が存在する。 


101:デフォルトの名無しさん:2010/06/07(月) 08:46:50 
>>95 
こんな定義ならどうなんだ。 

確信度(_ごまだらきこけが,ごまだらきこけが,60) :- 
    色(_ごまだらきこけが,_,幼虫,全体,灰色), 
    色(_ごまだらきこけが,_,成虫,赤味がかった黄色), 
    食性(_ごまだらきこけが,_,幼虫,コケ類). 

色(_,ごまだらきこけが,幼虫,全体,灰色), 
色(_,ごまだらきこけが,成虫,赤味がかった黄色). 
食性(_,ごまだらきこけが,幼虫,コケ類). 


102:デフォルトの名無しさん:2010/06/07(月) 08:54:28 
>>99 
それから、>>95 のごまだらきこけが は関係ではなく、クラスを表現しようとしているのではないかな。 


103:93:2010/06/07(月) 17:19:35 
あまり頭ごなしに不自然だ!!ばかりを言うのもアレなので....。 

>>98 
>先祖/2はルールなのに、親子/2はなぜ事実なの? 
>親子もルールで書いていくとどうなるの?という疑問に対して、 
>何らかの答えだすという試みもしてきました。 

「親-子」という関係は原始的な(これ以上は分解できない)ファクトだから、 
ルールとして書くことは(私には)無理ですが、「親-子の関係」や「先祖-子孫の関係」という 
関係そのものを扱えるファクト/ルールを書くことは可能です。たとえば 
「AとBにはどんな関係があるか?(= AとBとの間に存在する関係は何か?)」という 
問い合わせに答えることの可能な知識ベースです。 

まず説明の前に、>>99では 

 ファクトとルールは、どちらも「関係の存在」を表現している 

と書きました。それを以下のように訂正します。 

 ファクトとルールは、どちらも「エンティティ(物)の存在」あるいは 
 「エンティティ間にある関係の存在」を表現している 

エンティティとは関係の対象となるオブジェクトを意味し、 
たとえば「ごまだらきこけが」や「為義」を指します。 

(長いので続く) 

104:93:2010/06/07(月) 17:21:16 
(>>103の続き) 

では、以降からは知識ベースの記述を始めます。まず基礎のファクトを書きます。 

 人物(為義).      % 為義という人物が存在する。 
 人物(義朝).      % 義朝という人物が存在する。 
 人物(頼朝).      % 頼朝という人物が存在する。 

ここで、「親-子」と「先祖-子孫」を(関係ではなく)エンティティとして認識した上で、 
ファクトとして書いてみます。 

 関係(親_子).       % 親-子という関係が存在する。 
 関係(先祖_子孫).     % 先祖-子孫という関係が存在する。 
 関係(親_子, 為義, 義朝). % 為義と義朝の間には親-子という関係が存在する。 
 関係(親_子, 義朝, 頼朝). % 義朝と頼朝の間には親-子という関係が存在する。 

これらファクトを前提にルールを書きます。 

 関係(先祖_子孫, A, B) :- 人物(A), 人物(B), A\=B, 関係(親_子, A, B). 
  % あるA, Bについて、AおよびBという人物が存在し、 
  % かつAとBの間に親-子という関係が存在するならば、 
  % AとBの間には先祖-子孫という関係が存在する。 

 関係(先祖_子孫, A, B) :- 
    人物(A), 人物(B), 人物(C), A \= B, B \= C,  A \= C, 
    関係(親_子, A, C), 関係(先祖_子孫, C, B). 
  % あるA, Bについて、A、BおよびCという人物が存在し、 
  % かつAとCの間に親-子という関係が存在し、 
  % かつCとBの間に先祖-子孫という関係が存在するならば、 
  % AとBの間にも先祖-子孫という関係が存在する。 

(まだ続く) 

105:93:2010/06/07(月) 17:33:51 
(>>104の続き) 

以下は、SWI-Prologでの実行例です。 

 為義と義朝は親子か? 
  ?- 関係(親_子, 為義, 義朝). 
  true .  % はい。 

 為義の子は誰か? 
  ?- 関係(親_子, 為義, X). 
  X = '義朝' ;  % 義朝です。  
  false. 

 為義の子孫は誰か? 
  ?- 関係(先祖_子孫, 為義, X). 
  X = '義朝' ; 
  X = '頼朝' ;  % 義朝と頼朝です。 
  false. 

 為義と義朝にはどんな関係があるか? 
  ?- 関係(R, 為義, 義朝). 
  R = '親_子' ; 
  R = '先祖_子孫' ;  % 親-子と先祖-子孫という関係があります。 
  false. 

 為義と頼朝にはどんな関係があるか? 
  ?- 関係(R, 義朝, 頼朝). 
  R = '先祖_子孫' ;  % 先祖-子孫という関係があります。 
  false. 

(まだ続く。次で終わり。) 

106:93:2010/06/07(月) 17:36:21 
(>>105の続き) 

 すべての関係を挙げよ。 
  ?- 関係(R, A, B). 
  R = '親_子', 
  A = '為義', 
  B = '義朝' ;  % 為義と義朝の間に親-子という関係が存在する。 
  R = '親_子', 
  A = '義朝', 
  B = '頼朝' ;  % 為義と頼朝の間に親-子という関係が存在する。 
  R = '先祖_子孫', 
  A = '為義', 
  B = '義朝' ;  % 為義と頼朝の間に先祖-子孫という関係が存在する。 
  R = '先祖_子孫', 
  A = '義朝', 
  B = '頼朝' ;  % 義朝と頼朝の間に先祖-子孫という関係が存在する。 
  R = '先祖_子孫', 
  A = '為義', 
  B = '頼朝' ;  % 為義と頼朝の間に先祖-子孫という関係が存在する。 
  false. 

(これで終わり。長レス失礼。) 

107:93:2010/06/07(月) 18:08:39 
>>102 
では、オブジェクト指向(あるいはフレーム理論やオントロジーのような)知識を一般化する 
枠組み(フレームワーク)を>>103-106で書いた知識ベースに導入してみます。 

 オブジェクト(昆虫).       % 昆虫はオブジェクトである。 
 オブジェクト(蛾).        % 蛾はオブジェクトである。 
 オブジェクト(ごまだらきこけが). % ごまだらきこけがはオブジェクトである。 

 関係(スーパークラス_サブクラス, 昆虫, 蛾).    % 蛾は昆虫のサブクラスである。 
 関係(クラス_インスタンス, 蛾, ごまだらきこけが). % ごまだらきこけがは蛾のインスタンスである。 

オブジェクト指向という枠組みの導入によって、これまで「....が存在する」と解釈していたのを、 
「....である」という解釈に進化させたことに注目してください。 

オブジェクト指向におけるクラスという概念は「スーパークラス-サブクラス」および 
「クラス-インスタンス」という関係で表現できます。これらはそれぞれ「is-a関係(またはkind-of関係)」と 
「instance-of関係」と呼ばれることもあり、知識表現レベルではどちらも関係の特別なケース(クラス)です。 

以上のように、(源氏の)家系や(蛾の)体系といった比較的単純な知識表現であれば、明解な解答が得られます。 
不自然な解釈や小賢しい技法(テクニック)は必要ありません。命題論理と一階述語論理の守備範囲です。