4

Flora-2 は奇抜な言語であり、これが実現不可能であることは承知していますが、Flora-2 に関するアクティブなリソースが見つからないため、ここで試しています。とても人気があります...スタックオーバーフロータグはありません。Flora-2 と XSB Prolog の現状と今後について何かご存知でしたら、ぜひ教えてください

Flora-2 ダイヤモンドの継承規則について説明してもらえますか? マニュアルには例がありますが、例の結果は示されていません。言い回しは、インタープリターと diamond.flr デモで見たものとは反対のようです。デモは次のとおりです。

c[f*->g].
c1[f(a)*->a]::c.
c2[f(b)*->b]::c.
o:c1.
o:c2.

?- ?X[?Y->?Z].

(私が見ているのは、基本クラス c の有無にかかわらず発生します)

マニュアルには次のように書かれています。

アリティ > 1 のメソッドのレベルでは、2 つの異なるスーパークラスにアタッチされた同じメソッドの 2 つの上書きされていない定義がある場合、競合が発生したと見なされます。競合が発生したかどうかを判断するとき、メソッドの引数は無視されます。たとえば、

a:c. c[m(k)*->f]. a:d. d[m(u)*->f].

メソッド m がオブジェクト k に適用される場合と、オブジェクト u に適用される場合がありますが、多重継承の競合が発生しています。

(アリティ >= 1 を意味していると確信していますが、結果はアリティ 2 でも同様です)

したがって、 f の継承には競合があるため、未定義であることを意味します(「未定義」の意味について少し混乱していますが、関連するセクションでは「継承は行われません」と述べています)。ダイヤモンドを実行すると、次のようになります。

?X = o
?Y = f
?Z = g

?X = o
?Y = f(a)
?Z = a

私は最初の解決策だけを期待していましたが、2番目の解決策にも解決策があれば、少なくともある程度意味があると思います

?X = o
?Y = f(b)
?Z = b

...しかし、そうではありませんでした。

参考までに、私は最新の安定版 XSB と最新の Flora-2 リリースを使用しています... 0.95.

4

2 に答える 2

2

質問が出されてから2年以上経ってから偶然見つけました。Flora-users メーリング リストで質問する必要がありました。

とにかく、これは Flora-2 のそのバージョンのバグだったようです。現在のバージョンが正しい答えを与えることがわかります

?X = o

?Y = f

?Z = g

つまり、マニュアルに記載されているように、競合する 2 つの継承が互いに相殺されました。

于 2014-01-30T03:48:52.673 に答える
1

私は Flora-2 の構文に詳しくありませんが、Logtalk でよく知られているダイアモンド継承の問題の似たような例があります。ここで見つけることができます:

https://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/diamonds

セマンティクス、デフォルトの継承規則、およびデフォルトの継承規則のユーザーによる上書きについては、NOTES.txt とソース ファイルのコメントを参照してください。XSB の最新の CVS バージョンを使用して例を実行できます。サンプル クエリについては、SCRIPT.txt ファイルを参照してください。

于 2011-04-03T13:37:22.420 に答える