CHR в SWI Prolog: Защита правил, содержащая ограничение "только что удаленное", не возвращается, удаляет стек
Небольшой тестовый код без особого смысла:
:- use_module(library(chr)).
:- chr_constraint foo/1, bar/1, anyone/2.
foo(X) \ bar(Y) <=> anyone(X,Y).
anyone(_,Y) <=> bar(Y) | writef("bar(%w) exists\n",[Y]).
anyone(_,Y) <=> writef("bar(%w) does not exist\n",[Y]).
Если указанное выше выполняется из командной строки SWI Prolog, а затем запускается с помощью:
?- foo(8),bar(10).
через некоторое время происходит переполнение:
Could not reenable global-stack
Could not reenable global-stack
ERROR: Out of global-stack.
ERROR: No room for exception term. Aborting.
Could not reenable global-stack
ERROR: Out of global-stack.
ERROR: No room for exception term. Aborting.
ERROR: Execution Aborted
% Execution Aborted
Однако, если код для второго правила изменить, переместив тест на bar
от стражи головы:
:- use_module(library(chr)).
:- chr_constraint foo/1, bar/1, anyone/2.
foo(X) \ bar(Y) <=> anyone(X,Y).
anyone(_,Y),bar(Y) <=> writef("bar(%w) exists\n",[Y]). % changed!
anyone(_,Y) <=> writef("bar(%w) does not exist\n",[Y]).
затем выполнение прекращается:
?- foo(8),bar(10).
bar(10) does not exist
foo(8).
Это случайность реализации? Это кажется немного рискованным.
Кроме того, приведенный выше код был написан, потому что я хотел проверить, нужно ли удалить ограничение из магазина (здесь bar(Y)
) будет доступно в теле правила. По-видимому, нет, он уже исчез, когда тело правила выполняется; но зависит ли эта реализация от необходимого или определенного поведения CHR?