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