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?

0 ответов

Другие вопросы по тегам