Флора-2 алмазное наследование
Флора-2 - эксцентричный язык, и я знаю, что это длинный путь, но я не нашел активных ресурсов, посвященных этому, поэтому я пытаюсь здесь. Это так популярно... для него нет тега stackru. Если вы знаете что-нибудь о состоянии и будущем Flora-2 и XSB Prolog, я бы тоже хотел это услышать.
Может кто-нибудь объяснить мне правила наследования алмазов Флоры-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.
2 ответа
Наткнулся на это через 2 с лишним года после того, как был задан вопрос. Вы должны были спросить об этом в списке рассылки flora-users.
Во всяком случае, это, похоже, ошибка в этой версии Flora-2. Я вижу, что текущая версия дает правильный ответ
? X = o
? Y = F
?Z = г
Таким образом, два конфликтующих наследования уничтожили друг друга, как описано в руководстве.
Я не знаком с синтаксисом Flora-2, но у меня есть забавный пример хорошо известной проблемы наследования алмазов в Logtalk. Вы можете найти это здесь:
https://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/diamonds
См. NOTES.txt и комментарии к исходному файлу для получения информации о семантике, правилах наследования по умолчанию и переопределении пользователем правил наследования по умолчанию. Вы можете запустить пример, используя последнюю версию CVS XSB. См. Файл SCRIPT.txt для примеров запросов.