- Documentation
- Reference manual
- Packages
- SWI-Prolog Python interface
- library(janus): Call Python from Prolog
- py_version/0
- py_call/1
- py_call/2
- py_call/3
- py_iter/2
- py_iter/3
- py_is_object/1
- py_free/1
- py_with_gil/1
- py_func/3
- py_func/4
- py_dot/4
- py_dot/5
- values/3
- keys/2
- key/2
- items/2
- py_shell/0
- py_pp/1
- py_pp/2
- py_pp/3
- py_obj_dir/2
- py_obj_dict/2
- py_initialize/3
- py_lib_dirs/1
- py_add_lib_dir/1
- py_add_lib_dir/2
- Handling Python errors in Prolog
- Janus and virtual environments (venv)
- library(janus): Call Python from Prolog
- SWI-Prolog Python interface
[nondet]py_iter(+Iterator,
-Value)
- Evaluate Iterator as py_call/2
evaluates its first argument, except the
Obj:Attr = Valueconstruct is not accepted. - Call
__iter__on the result to get the iterator itself. - Get the
__next__function of the iterator. - Loop over the return values of the next function. If the Python return value unifies with Value, succeed with a choicepoint. Abort on Python or unification exceptions.
- Re-satisfaction continues at (4).
The example below uses the built-in iterator range():
?- py_iter(range(1,3), X). X = 1 ; X = 2.
Note that the implementation performs a look ahead, i.e., after successful unification it callsā__next__()` again. On failure the Prolog predicate succeeds deterministically. On success, the next candidate is stored.
Note that a Python generator is a Python _iterator. Therefore,
given the Python generator expression below, we can use
py_iter(squares(1,5),X) to generate the squares on
backtracking.
def squares(start, stop):
for i in range(start, stop):
yield i * i
| Options | is processed as with py_call/3. |
- bug
- Iterator may not depend on janus.Query()