Каковы оптимальные зеленые срезы для суммы арифметики преемника?

Чтобы получить зеленые сокращения в Прологе, я пытаюсь добавить их к стандартному определению суммы в арифметике преемника (см. Предикатplus вЧто такое дерево SLD для этого запроса?). Идея состоит в том, чтобы «очистить» вывод как можно больше, исключив все бесполезные возвратные дорожки (то есть, нет... ; false) при сохранении идентичного поведения при всех возможных комбинациях экземпляров аргументов - все экземпляры, один / два / три, полностью не реализованные, и все варианты, включая частично созданные аргументы.

Это то, что я смог сделать, пытаясь максимально приблизиться к этому идеалу (я признаю ложный ответкак вставить зеленые порезы вappend/3 как источник):

natural_number(0).
natural_number(s(X)) :- natural_number(X).

plus(X, Y, X) :- (Y == 0 -> ! ; Y = 0), (X == 0 -> ! ; true), natural_number(X).
plus(X, s(Y), s(Z)) :- plus(X, Y, Z).

Под SWI это работает нормально для всех запросов, кроме тех, которые имеют форму?- plus(+X, -Y, +Z)., что касаетсяSWI нотация описания предиката, Например,?- plus(s(s(0)), Y, s(s(s(0)))). доходностьY = s(0) ; false., Мои вопросы:

Как мы можем доказать, что вышеупомянутые сокращения являются (или не являются) зелеными?Можем ли мы сделать лучше, чем в приведенной выше программе, и устранить также последний возврат, добавив некоторые другие зеленые сокращения?Если да, то как?

Ответы на вопрос(1)

Ваш ответ на вопрос