集合の上向き継承について


[Q] 集合を上向きに継承させる(現在は big-Quixote のみ実現)と、 積集合が求まらないのでしょうか?

 つまり、
-------------------------------------------------------
&program;;
&subsumption;;
animal >= bird;;
animal >= fish;;
&rule;;
bird/[can = fly, has* >* {backbone,blood,wing}];;
fish/[can = swim, has* >* {backbone,fin,blood}];;
animal;;
&end.
-------------------------------------------------------
というプログラムにおいて、
fishとbirdの共通の親であるanimalは
fishの{backbone,fin,blood}とbirdの{backbone,blood,wing}
という集合の積集合{backbone,blood}を持っていて欲しい訳です。


 [A] 集合を上向きに継承させて、積集合が求まる/求まらないかは、
集合間の順序の入れ方に因ります。
(正確には、上位や継承に限らず、
	「オブジェクトが持つ集合の値は、
	  集合間の順序の入れ方に因る」
 です。)

因みに Quixote では、上記の例で、
	?-animal/[has* =*= X*];;&q_mode[&inheritance=&all].
とすると
	database> ** 1 answer exists **
	** Answer 1 **
	    X* >* {backbone,blood,wing,fin}
	database> 
が得られます。

さて、ここから Quixote における、集合間の順序の入れ方を説明します。

集合間の順序は、集合間の包含関係でも入れられますが、
要素間に順序がある場合、その順序を使って集合間に順序を
入れることができます。その入れ方には、幾つかあって、
Quixote では、Hoare 順序(operation を "*<" とします)を
導入しています。

Hoare 順序の定義は、
	S1 *< S2   <===>   ∀x ∈ S1, ∃y ∈ S2  s.t. x =< y
( "=<" が要素間の順序です。)

他には、Smyth 順序、Egli-Milner 順序などがあります。
(参考に定義だけ紹介します。
 Smyth 順序を +<、Egli-Milner 順序を %< とします。
 Smyth 順序は、
	S1 +< S2   <===>   ∀y ∈ S2, ∃x ∈ S1  s.t. x =< y
 Egli-Milner 順序は、
	S1 %< S2   <===>   S1 *< S2 ∧ S1 +< S2
 です。)


それで、Quixote では Hoare 順序の元で、集合の join を
以下のように定義しています。
	S1 join S2   <===>   S1 ∪ S2


さて、さて、
	?-animal/[has* =*= X*];;&q_mode[&inheritance=&all].
の答が、
	    X* >* {backbone,blood,wing,fin}
になる理由ですが、
継承の規則( o >= p  ===>  o.l >= p.l or o.l* >* p.l* ) と
		animal >= bird;;
		animal >= fish;;
より、
		animal.has* >* bird.has*;;
		animal.has* >* fish.has*;;
それで、左の animal.has* の値を求めるために、右の join を取る訳ですが、
		bird.has* >* {backbone,blood,wing}
		fish.has* >* {backbone,fin,blood}
で、先に説明したように、Quixote では、
		S1 join S2   <===>   S1 ∪ S2
ですから、
	animal.has* >* {backbone,blood,wing} join {backbone,fin,blood}
				== {backbone,blood,wing,fin}
となります。



ですから、ご希望である
: ということはfishとbirdの共通の親であるanimalは
: fishの{backbone,fin,blood}とbirdの{backbone,blood,wing}
: という集合の積集合{backbone,blood}を持っていて欲しい訳です。
には沿えません。

只、集合間の順序を Smyth 順序にすれば、この例に限ればご希望に
沿えます。

しかし、「Quixote の言語マニュアル 2.3.7」にある area* ように
応用によっては Hoare 順序が適しているものもあるので、Hoare、
Smyth、どちらの順序がいいかは一概には言えないと考えています。