Flora-2钻石继承

时间:2011-04-01 22:39:49

标签: prolog multiple-inheritance diamond-problem

Flora-2是一种古怪的语言,我知道这是一个很长的镜头,但我没有找到任何有用的资源,所以我在这里尝试。它如此受欢迎......它没有stackoverflow标签。如果你对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,我看到的情况都会发生)

手册说:

在arity方法的层面>在图1中,如果对两个不同的超类附加了相同方法的两个非重写定义,则认为发生了冲突。在决定是否发生冲突时,我们忽略了该方法的论点。例如,在

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

发生了多重继承冲突,即使在一种情况下,方法m应用于对象k,而在另一种情况下,它应用于对象u。

(我很确定他们的意思是arity> = 1但是arity 2的结果也相似)

所以我认为这意味着f的继承有冲突因此它是未定义的(尽管我对'undefined'意味着什么有点困惑,在相关章节中它说“继承不会发生”)。这是我运行钻石时得到的结果:

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

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

我只期望第一个解决方案,虽然我认为第二个解决方案至少会有一定意义,如果它也有解决方案

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

......但事实并非如此。

仅供参考,我正在使用最新的稳定XSB和最新的Flora-2版本...... 0.95。

2 个答案:

答案 0 :(得分:2)

在问到这个问题2年多后,偶然发现了这个问题。您应该在flora-users邮件列表中询问它。

无论如何,这似乎是Flora-2版本中的一个错误。我看到当前版本给出了正确的答案

  

?X = o

     

?Y = f

     

?Z = g

也就是说,两本冲突的遗产相互抵消,正如手册所描述的那样。

答案 1 :(得分:1)

我不熟悉Flora-2语法,但我对Logtalk中众所周知的钻石继承问题有一个很明显的例子。你可以在这里找到它:

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

有关语义,默认继承规则和默认继承规则的用户覆盖的信息,请参阅NOTES.txt和源文件注释。您可以使用最新的XSB CVS版本运行该示例。有关示例查询,请参阅SCRIPT.txt文件。