File: coroutining.html

package info (click to toggle)
swi-prolog 7.2.3%2Bdfsg-6
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 84,180 kB
  • ctags: 45,684
  • sloc: ansic: 330,358; perl: 268,104; sh: 6,795; java: 4,904; makefile: 4,561; cpp: 4,153; ruby: 1,594; yacc: 843; xml: 82; sed: 12; sql: 6
file content (331 lines) | stat: -rw-r--r-- 8,930 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
<title>SWI-Prolog 7.3.6 Reference Manual: Section 7.2</title><link rel="home" href="index.html">
<link rel="contents" href="Contents.html">
<link rel="index" href="DocIndex.html">
<link rel="summary" href="summary.html">
<link rel="previous" href="attvar.html">
<link rel="next" href="gvar.html">

<style type="text/css">

/* Style sheet for SWI-Prolog latex2html
*/

dd.defbody
{ margin-bottom: 1em;
}

dt.pubdef, dt.multidef
{ color: #fff;
padding: 2px 10px 0px 10px;
margin-bottom: 5px;
font-size: 18px;
vertical-align: middle;
overflow: hidden;
}

dt.pubdef { background-color: #0c3d6e; }
dt.multidef { background-color: #ef9439; }

.bib dd
{ margin-bottom: 1em;
}

.bib dt
{ float: left;
margin-right: 1.3ex;
}

pre.code
{ margin-left: 1.5em;
margin-right: 1.5em;
border: 1px dotted;
padding-top: 5px;
padding-left: 5px;
padding-bottom: 5px;
background-color: #f8f8f8;
}

div.navigate
{ text-align: center;
background-color: #f0f0f0;
border: 1px dotted;
padding: 5px;
}

div.title
{ text-align: center;
padding-bottom: 1em;
font-size: 200%;
font-weight: bold;
}

div.author
{ text-align: center;
font-style: italic;
}

div.abstract
{ margin-top: 2em;
background-color: #f0f0f0;
border: 1px dotted;
padding: 5px;
margin-left: 10%; margin-right:10%;
}

div.abstract-title
{ text-align: center;
padding: 5px;
font-size: 120%;
font-weight: bold;
}

div.toc-h1
{ font-size: 200%;
font-weight: bold;
}

div.toc-h2
{ font-size: 120%;
font-weight: bold;
margin-left: 2em;
}

div.toc-h3
{ font-size: 100%;
font-weight: bold;
margin-left: 4em;
}

div.toc-h4
{ font-size: 100%;
margin-left: 6em;
}

span.sec-nr
{
}

span.sec-title
{
}

span.pred-ext
{ font-weight: bold;
}

span.pred-tag
{ float: right;
padding-top: 0.2em;
font-size: 80%;
font-style: italic;
color: #fff;
}

div.caption
{ width: 80%;
margin: auto;
text-align:center;
}

/* Footnotes */
.fn {
color: red;
font-size: 70%;
}

.fn-text, .fnp {
position: absolute;
top: auto;
left: 10%;
border: 1px solid #000;
box-shadow: 5px 5px 5px #888;
display: none;
background: #fff;
color: #000;
margin-top: 25px;
padding: 8px 12px;
font-size: larger;
}

sup:hover span.fn-text
{ display: block;
}

/* Lists */

dl.latex
{ margin-top: 1ex;
margin-bottom: 0.5ex;
}

dl.latex dl.latex dd.defbody
{ margin-bottom: 0.5ex;
}

/* PlDoc Tags */

dl.tags
{ font-size: 90%;
margin-left: 5ex;
margin-top: 1ex;
margin-bottom: 0.5ex;
}

dl.tags dt
{ margin-left: 0pt;
font-weight: bold;
}

dl.tags dd
{ margin-left: 3ex;
}

td.param
{ font-style: italic;
font-weight: bold;
}

/* Index */

dt.index-sep
{ font-weight: bold;
font-size: +1;
margin-top: 1ex;
}

/* Tables */

table.center
{ margin: auto;
}

table.latex
{ border-collapse:collapse;
}

table.latex tr
{ vertical-align: text-top;
}

table.latex td,th
{ padding: 2px 1em;
}

table.latex tr.hline td,th
{ border-top: 1px solid black;
}

table.frame-box
{ border: 2px solid black;
}

</style>
</head>
<body style="background:white">
<div class="navigate"><a class="nav" href="index.html"><img src="home.gif" alt="Home"></a>
<a class="nav" href="Contents.html"><img src="index.gif" alt="Contents"></a>
<a class="nav" href="DocIndex.html"><img src="yellow_pages.gif" alt="Index"></a>
<a class="nav" href="summary.html"><img src="info.gif" alt="Summary"></a>
<a class="nav" href="attvar.html"><img src="prev.gif" alt="Previous"></a>
<a class="nav" href="gvar.html"><img src="next.gif" alt="Next"></a>
</div>
<h2 id="sec:coroutining"><a id="sec:7.2"><span class="sec-nr">7.2</span> <span class="sec-title">Coroutining</span></a></h2>

<a id="sec:coroutining"></a>

<p>Coroutining deals with having Prolog goals scheduled for execution as 
soon as some conditions are fulfilled. In Prolog the most commonly used 
condition is the instantiation (binding) of a variable. Scheduling a 
goal to execute immediately after a variable is bound can be used to 
avoid instantiation errors for some built-in predicates (e.g. arithmetic), 
do work <em>lazy</em>, prevent the binding of a variable to a particular 
value, etc. Using <a id="idx:freeze2:1640"></a><a class="pred" href="coroutining.html#freeze/2">freeze/2</a> 
for example we can define a variable that can only be assigned an even 
number:

<pre class="code">
?- freeze(X, X mod 2 =:= 0), X = 3

No
</pre>

<dl class="latex">
<dt class="pubdef"><a id="freeze/2"><strong>freeze</strong>(<var>+Var, 
:Goal</var>)</a></dt>
<dd class="defbody">
Delay the execution of <var>Goal</var> until <var>Var</var> is bound 
(i.e. is not a variable or attributed variable). If <var>Var</var> is 
bound on entry
<a id="idx:freeze2:1641"></a><a class="pred" href="coroutining.html#freeze/2">freeze/2</a> 
is equivalent to <a id="idx:call1:1642"></a><a class="pred" href="metacall.html#call/1">call/1</a>. 
The <a id="idx:freeze2:1643"></a><a class="pred" href="coroutining.html#freeze/2">freeze/2</a> 
predicate is realised using an attributed variable associated with the 
module <code>freeze</code>. Use <code>frozen(Var, Goal)</code> to find 
out whether and which goals are delayed on <var>Var</var>.</dd>
<dt class="pubdef"><a id="frozen/2"><strong>frozen</strong>(<var>@Var, 
-Goal</var>)</a></dt>
<dd class="defbody">
Unify <var>Goal</var> with the goal or conjunction of goals delayed on
<var>Var</var>. If no goals are frozen on <var>Var</var>, <var>Goal</var> 
is unified to <code>true</code>.</dd>
<dt class="pubdef"><a id="when/2"><strong>when</strong>(<var>@Condition, 
:Goal</var>)</a></dt>
<dd class="defbody">
Execute <var>Goal</var> when <var>Condition</var> becomes true. <var>Condition</var> 
is one of <code>?=(X, Y)</code>, <code>nonvar(X)</code>, <code>ground(X)</code>,
<code><code>,</code>(Cond1, Cond2)</code> or <code><code>;</code>(Cond1, 
Cond2)</code>. See also <a id="idx:freeze2:1644"></a><a class="pred" href="coroutining.html#freeze/2">freeze/2</a> 
and <a id="idx:dif2:1645"></a><a class="pred" href="coroutining.html#dif/2">dif/2</a>. 
The implementation can deal with cyclic terms in <var>X</var> and <var>Y</var>.

<p>The <a id="idx:when2:1646"></a><a class="pred" href="coroutining.html#when/2">when/2</a> 
predicate is realised using attributed variables associated with the 
module <code>when</code>. It is defined in the autoload library
<code>library(when)</code>.</dd>
<dt class="pubdef"><a id="dif/2"><strong>dif</strong>(<var>@A, @B</var>)</a></dt>
<dd class="defbody">
The <a id="idx:dif2:1647"></a><a class="pred" href="coroutining.html#dif/2">dif/2</a> 
predicate provides a constraint stating that <var>A</var> and
<var>B</var> are different terms. If <var>A</var> and <var>B</var> can 
never unify,
<a id="idx:dif2:1648"></a><a class="pred" href="coroutining.html#dif/2">dif/2</a> 
succeeds deterministically. If <var>A</var> and <var>B</var> are 
identical it fails immediately, and finally, if <var>A</var> and <var>B</var> 
can unify, goals are delayed that prevent <var>A</var> and <var>B</var> 
to become equal. The
<a id="idx:dif2:1649"></a><a class="pred" href="coroutining.html#dif/2">dif/2</a> 
predicate behaves as if defined by
<code>dif(X, Y) :- when(?=(X, Y), X \== Y)</code>. See also <a class="pred" href="compare.html#?=/2">?=/2</a>. 
The implementation can deal with cyclic terms.

<p>The <a id="idx:dif2:1650"></a><a class="pred" href="coroutining.html#dif/2">dif/2</a> 
predicate is realised using attributed variables associated with the 
module <code>dif</code>. It is defined in the autoload library
<code>library(dif)</code>.</dd>
<dt class="pubdef"><a id="call_residue_vars/2"><strong>call_residue_vars</strong>(<var>:Goal, 
-Vars</var>)</a></dt>
<dd class="defbody">
Find residual attributed variables left by <var>Goal</var>. This 
predicate is intended for debugging programs using coroutining or 
constraints. Consider a program that poses contradicting constraints on 
a variable. Such programs should fail, but sometimes succeed because the 
constraint solver is too weak to detect the contradiction. Ideally, 
delayed goals and constraints are all executed at the end of the 
computation. The meta predicate <a id="idx:callresiduevars2:1651"></a><a class="pred" href="coroutining.html#call_residue_vars/2">call_residue_vars/2</a> 
finds variables that are given attribute variables or whose attributes 
are modified by <var>Goal</var>, regardless of whether or not these 
variables are reachable from the arguments of
<var>Goal</var>.<sup class="fn">139<span class="fn-text">The 
implementation of <a id="idx:callresiduevars2:1652"></a><a class="pred" href="coroutining.html#call_residue_vars/2">call_residue_vars/2</a> 
is completely redone in version 7.3.2 (7.2.1) after discussion with Bart 
Demoen. The current implementation no longer performs full scans of the 
stacks. The overhead is proportional to the number of attributed 
variables on the stack, dead or alive.</span></sup>.
</dd>
</dl>

<p></body></html>