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。