/usr/local/lib/swipl/library/thread.pl
All Application Manual Name SummaryHelp

  • swipl
    • library
      • error.pl
      • debug.pl -- Print debug messages and test assertions
      • apply.pl
      • lists.pl -- List Manipulation
      • broadcast.pl
      • shlib.pl
      • option.pl
      • thread_pool.pl
      • gensym.pl
      • settings.pl
      • arithmetic.pl
      • main.pl -- Provide entry point for scripts
      • readutil.pl -- Read utilities
      • operators.pl -- Manage operators
      • pairs.pl
      • prolog_source.pl
      • record.pl -- Access compound arguments by name
      • quasi_quotations.pl -- Define Quasi Quotation syntax
      • pure_input.pl
      • solution_sequences.pl -- Modify solution sequences
      • ordsets.pl
      • random.pl
      • base64.pl
      • aggregate.pl -- Aggregation operators on backtrackable predicates
      • yall.pl
      • sandbox.pl
      • apply_macros.pl -- Goal expansion rules to avoid meta-calling
      • assoc.pl -- Binary associations
      • prolog_format.pl
      • predicate_options.pl -- Access and analyse predicate options
      • csv.pl -- Process CSV (Comma-Separated Values) data
      • pprint.pl -- Pretty Print Prolog terms
      • atom.pl -- Operations on atoms
      • modules.pl
      • occurs.pl
      • prolog_xref.pl
      • prolog_colour.pl
      • lazy_lists.pl
      • ugraphs.pl
      • url.pl -- Analysing and constructing URL
      • www_browser.pl -- Open a URL in the users browser
      • prolog_pack.pl
      • git.pl -- Run GIT commands
      • utf8.pl
      • dialect.pl
      • system.pl
      • terms.pl
      • date.pl
      • persistency.pl
      • iostream.pl -- Utilities to deal with streams
      • prolog_stack.pl
      • edinburgh.pl
      • prolog_clause.pl
      • prolog_breakpoints.pl -- Manage Prolog break-points
      • wfs.pl -- Well Founded Semantics interface
      • prolog_code.pl -- Utilities for reasoning about code
      • sort.pl
      • dicts.pl -- Dict utilities
      • dif.pl
      • varnumbers.pl -- Utilities for numbered terms
      • pio.pl -- Pure I/O
      • base32.pl -- Base32 encoding and decoding
      • charsio.pl
      • codesio.pl -- I/O on Lists of Character Codes
      • coinduction.pl
      • heaps.pl -- heaps/priority queues
      • rbtrees.pl -- Red black trees
      • statistics.pl -- Get information about resource usage
      • when.pl -- Conditional coroutining
      • backcomp.pl -- Backward compatibility
      • check.pl
      • nb_set.pl -- Non-backtrackable sets
      • threadutil.pl -- Interactive thread utilities
      • macros.pl -- Macro expansion
      • prolog_jiti.pl
      • edit.pl -- Editor interface
      • hashtable.pl
      • make.pl -- Reload modified source files
      • strings.pl
      • qsave.pl -- Save current program as a state or executable
      • zip.pl -- Access resource ZIP archives
      • optparse.pl -- command line parsing
      • portray_text.pl
      • prolog_versions.pl -- Demand specific (Prolog) versions
      • listing.pl -- List programs and pretty print clauses
      • thread.pl -- High level thread primitives
        • concurrent/3
        • concurrent_forall/2
        • concurrent_forall/3
        • concurrent_and/2
        • concurrent_and/3
        • concurrent_maplist/2
        • concurrent_maplist/3
        • concurrent_maplist/4
        • first_solution/3
        • call_in_thread/2
      • intercept.pl -- Intercept and signal interface
      • increval.pl -- Incremental dynamic predicate modification
      • tables.pl
      • ansi_term.pl
      • ctypes.pl -- Character code classification
      • quintus.pl
      • shell.pl -- Elementary shell commands
      • streams.pl -- Manage Prolog streams
      • prolog_codewalk.pl -- Prolog code walker
      • prolog_history.pl -- Per-directory persistent commandline history
      • prolog_config.pl
      • prolog_coverage.pl -- Coverage analysis tool
      • files.pl
      • prolog_wrap.pl
      • prolog_debug.pl
      • prolog_profile.pl -- Execution profiler
      • writef.pl
      • exceptions.pl -- Exception classification
      • fastrw.pl
      • tty.pl
      • readln.pl
      • help.pl -- Text based manual
      • prolog_trace.pl
      • prolog_autoload.pl -- Autoload all dependencies
      • prolog_metainference.pl
      • explain.pl -- Describe Prolog Terms
      • oset.pl
      • rwlocks.pl
 first_solution(-X, :Goals, +Options) is semidet
Try alternative solvers concurrently, returning the first answer. In a typical scenario, solving any of the goals in Goals is satisfactory for the application to continue. As soon as one of the tried alternatives is successful, all the others are killed and first_solution/3 succeeds.

For example, if it is unclear whether it is better to search a graph breadth-first or depth-first we can use:

search_graph(Grap, Path) :-
         first_solution(Path, [ breadth_first(Graph, Path),
                                depth_first(Graph, Path)
                              ],
                        []).

Options include thread stack-sizes passed to thread_create, as well as the options on_fail and on_error that specify what to do if a solver fails or triggers an error. By default execution of all solvers is terminated and the result is returned. Sometimes one may wish to continue. One such scenario is if one of the solvers may run out of resources or one of the solvers is known to be incomplete.

on_fail(Action)
If stop (default), terminate all threads and stop with the failure. If continue, keep waiting.
on_error(Action)
As above, re-throwing the error if an error appears.
bug
- first_solution/3 cannot deal with non-determinism. There is no obvious way to fit non-determinism into it. If multiple solutions are needed wrap the solvers in findall/3.