Prolog - generating numbers fitting given range

前端 未结 3 1325
情歌与酒
情歌与酒 2021-01-02 05:31

I\'d like to use predicates like:

range(X,0,5)
range(X,4,200)
range(X,-1000000,1000000)
dom_range(X,-1000000,1000000)

with meaning :

<
相关标签:
3条回答
  • 2021-01-02 05:59

    range in Gnu-Prolog can be solved with finite domains

    range(X,Low,High) :- fd_domain(X,Low,High).
    

    I don't know if dom_range(X,L,H) :- fd_domain(X,L,H) .

    P.S. When playing with finite domains, you might like to use fd_set_vector_max/1

    0 讨论(0)
  • 2021-01-02 06:06

    Dave's answer is almost perfect: there is no check to see if low < high. I added a condition and now it works fine (otherwise it generates numbers from low to infinity):

    range(Low, Low, High).
    range(Out,Low,High) :- NewLow is Low+1, NewLow =< High, range(Out, NewLow, High).
    

    Hope that helps!

    0 讨论(0)
  • 2021-01-02 06:18

    SWI-Prolog has the predicate between/3. so you would call it like between(0,5,X) to get the results you showed above. This predicate looks like this is implemented in C though.

    If we have to write it in pure prolog (and speed&space is not a factor), you could try this following.

    range(Low, Low, High).
    range(Out,Low,High) :- NewLow is Low+1, range(Out, NewLow, High).
    
    0 讨论(0)
提交回复
热议问题