Описание тега prolog-coroutining

Сопрограммы в Прологе позволяют динамически изменять порядок выполнения целей.

Сопрограммы позволяют динамически изменять порядок выполнения целей Пролога.

Это часто предлагается через встроенные предикаты, такие как freeze/2 а также when/2. С сопрограммой связаны такие ограничения, какdif/2 Пролог-DIF, clpfd, clpq; и CHR (Правила обработки ограничений).

IC-Prolog представил общую сопрограмму в 1979 году, Prolog II - встроеннуюfreeze/2 (geler/2), Объявления ожидания MU-Prolog. when/2 является обобщением, допускающим более сложные условия, чем freeze/2 а также (wait)/1. По факту,freeze/2 а также dif/2 могут быть реализованы в виде when/2 в качестве:

freeze(V, Goal) :-
   when(nonvar(V), Goal).

dif(X, Y) :-
   when(?=(X, Y), X \== Y).

Цели, выполнение которых откладывается до конца запроса, считаются ошибочными. Они часто отображаются в ответах верхнего уровня Пролога. Ошибочные цели могут описывать несоответствие, означающее, что ответ не описывает решение.

?- when(ground(X), X > 2).
when(ground(X), X > 2). % floundering goal

?- when(ground(X), X > 2), when(ground(X), X < 2).
when(ground(X), X>2),
when(ground(X), X<2).   % floundering goals - inconsistency

?- when(ground(X), X > 2), X = 3.
X = 3.

?- when(ground(X), X > 2), X = 1.
false.

системы пролога, предлагающиеwhen/2: Б-пролог, sicstus-Пролог ( 2), SWI-Пролог ( 1), YAP ( 3)