Каковы оптимальные зеленые срезы для суммы арифметики преемника?
Чтобы получить зеленые сокращения в Прологе, я пытаюсь добавить их к стандартному определению суммы в арифметике преемника (см. Предикат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.
, Мои вопросы: