Пролог - генерация чисел, соответствующих заданному диапазону - PullRequest
8 голосов
/ 24 августа 2011

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

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]).

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

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

P.S. Вопрос вдохновлен этим вопросом .

Ответы [ 3 ]

12 голосов
/ 24 августа 2011

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

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

range(Low, Low, High).
range(Out,Low,High) :- NewLow is Low+1, range(Out, NewLow, High).
10 голосов
/ 22 декабря 2011

Ответ Дейва почти идеален: нет проверки, если низкий <высокий. Я добавил условие, и теперь оно работает нормально (в противном случае оно генерирует числа от низкого до бесконечности): </p>

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

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

1 голос
/ 27 августа 2011

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

...