Описание тега 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)