Prolog-генерирующие числа, соответствующие заданному диапазону

Я хотел бы использовать предикаты, как:

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

со смыслом :

range(X,0,5) :- member(X,[0,1,2,3,4,5]).
range(X,4,200) :- member(X,[4,5,6...198,199,200]).
range(X,-1000000,1000000) :- member(X,[-1000000,...,1000000]).
dom_range(X,-1000000,1000000) :- domain(X, [-1000000,...,1000000]).

Как хорошо закодировать его в прологе (с учетом производительности решения-глубина рекурсии и т. д.)?

ожидается, что решение будет работать в GNU-Prolog.

П. С. Вопрос вдохновил с этот вопрос.

3 ответов


SWI-Prolog имеет предикат между/3. таким образом,вы бы назвали это как между(0,5, X), чтобы получить результаты, которые вы показали выше. Этот предикат выглядит так, как это реализовано в C, хотя.

Если нам нужно написать его в чистом прологе (а скорость и пространство не являются фактором), вы можете попробовать следующее.

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

ответ Дэйва почти идеален: нет проверки, чтобы увидеть, если low

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

надеюсь, что это поможет!


range в Gnu-Prolog можно решить с конечными доменами

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

Я не знаю, если dom_range(X,L,H) :- fd_domain(X,L,H) .

P. S. Когда играл с конечными доменами, вы могли бы использовать fd_set_vector_max/1