Goal is executed as if called via call(Goal), but only for a maximum of TimeLimit seconds. If the goal is still executing after TimeLimit, time-out occurs, the execution of the goal is terminated (via throw/1) and TimeOutGoal is executed. If the value of TimeLimit is 0 or 1.0Inf, no timeout is applied to the Goal.
Note that, if Goal is nondeterministic, execution flow may leave the scope of timeout/3 on success and re-enter on failure. In this case, only time spent within Goal will be counted towards the TimeLimit.
This predicate is implemented using alrm/vtalrm timer signals. These signals are alse needed for after-events, which will stop working when this predicate is being used. Also, this timeout predicate cannot be nested. If you need a timeout that can be nested, and is compatible with after-events, use lib(timeout).
Note that timeout/3 can be defined in terms of timeout/7 as:
timeout(Goal, TimeLimit, TimeOutGoal) :- timeout(Goal, TimeLimit, TimeOutGoal, all_solution, _, _, _).
?- timeout((repeat,fail), 1.5, writeln(timed-out)). % time-out from infinite loop timed - out Yes (1.51s cpu) ?- timeout(repeat, 1.5, writeln(timed-out)), fail. % time-out from infinite loop timed - out Yes (1.51s cpu) ?- X=f(X), Y=f(Y), timeout(X=Y, 2, fail). % time-out from looping unification No (2.00s cpu)