4

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 的继承存在冲突,因此它是未定义的(尽管我对“未定义”的含义有些困惑,但在相关部分中它说“没有发生继承”)。这是我运行钻石时得到的结果:

?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。

4

2 回答 2

2

在提出问题后的 2 年多时间里偶然发现了这个问题。您应该在flora-users 邮件列表中询问它。

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

?X = o

?Y = f

?Z = g

也就是说,正如手册所描述的,这两个相互冲突的继承相互抵消了。

于 2014-01-30T03:48:52.673 回答
1

我不熟悉 Flora-2 语法,但我在 Logtalk 中有一个众所周知的菱形继承问题的 smilar 示例。你可以在这里找到它:

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

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

于 2011-04-03T13:37:22.420 回答