Search code examples
prologbacktracking

Prolog - Backtracking through a set of dynamic options


I'm trying to trigger backtracking on a goal but in a dynamic way, if it's possible. To better exemplify my issue let's say we have the following PROLOG code:

num(1).
num(2).
num(3).
num(4).
num(5).

Then I head to SWI-Prolog and call: num(X). This triggers backtracking looking for all solutions, by typing ; .

What I would like is to remove those facts (num(1),num(2), etc) and replace that code with something thata generates those facts dynamically. Is there any way in which I can achieve this? Someting of the sorts,maybe?

num(X):- for X in 1..5

that yields the same solutions as the code above?

As far as I know, the findall predicate returns a list, which is not what I'm looking for. I would like to backtrack through all answers and look through them using ; in the console.


Solution

  • Yes there is, and you were already very close!

    :- use_module(library(clpfd)).
    
    num(X) :-
       X in 1..5.
    
    ?- num(X).
       X in 1..5.
    
    ?- num(X), X #>3.
       X in 4..5.
    
    ?- num(X), labeling([], [X]).
       X = 1
    ;  X = 2
    ;  X = 3
    ;  X = 4
    ;  X = 5.