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.