Это напоминает мне объект, найденный в Java.Там можно запросить текущий стек вызовов и использовать его для регулирования разрешений вызова метода.В переводе на Пролог мы находим в старом Прологе DEC-10 следующий предикат:
предков (L)
Объединяет L со списком целей предков для текущего предложения.Список начинается с родительской цели и заканчивается самым последним предком, исходящим из вызова в скомпилированном предложении.Список печатается с использованием print, и каждой записи предшествует номер вызова в скобках, за которым следует номер глубины (как указано в сообщении трассировки).Если в вызове нет номера (это произойдет, если режим отладки не был включен до тех пор, пока не выполнится дальнейшее выполнение), это будет помечено знаком «-»Недоступно для скомпилированного кода.
Поскольку верхним уровнем обычно является скомпилированный предикат prolog / 0, его можно использовать для написания предиката, который проверяет свой собственный стек вызовов, а затем решает, хочет ли он перейти в службуили нет.
rule2 :- ancestors(L), length(L,N), N<2, !, write('Don't call me'), fail.
rule2 :- 1<5.
В современных Прологах мы уже не находим так часто предикат / 1.Но это можно смоделировать по следующим направлениям.Просто сгенерируйте ошибку, и в случае, если эта ошибка украшена трассировкой стека, вы получите все, что вам нужно:
ancestors(L) :- catch(sys_throw_error(ignore),error(ignore,L),true).
Но оптимизация удаления стека остерегается может уменьшить стек и, следовательно, список, возвращаемый предками /1.
С наилучшими пожеланиями
PS: Оптимизация удаления стека уже объяснена здесь: [4] Уоррен, DHD (1983): Набор абстрактных инструкций по прологу, Техническая записка 309, SRI International, октябрь, 1983
Дискуссия для Пржеке Джекике находится здесь: http://www.jekejeke.ch/idatab/doclet/prod/en/docs/10_pro08/13_press/03_bench/05_optimizations/03_stack.html