Результат не экономит на переменной пролога - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть следующая функция пролога

range(Floor, Ceil, _) :- Ceil2 is Ceil+1, range(Floor, Ceil2, [], Floor).
range(_, Ceil, L, Ceil):- write(L), !.
range(Floor, Ceil, L, Cnter):- concatenate(L, [Cnter], L2), Cnter2 is Cnter + 1, range(Floor, Ceil, L2, Cnter2).

Я хочу получить список всех чисел между floor и ceil, я могу заставить это работать, но он только распечатывает список, но не возвращает его в качестве решения для запроса.

Ожидаемый результат будет: диапазон (2,7, R) => R = [2,3,4,5,6,7]

вместо этого я получаю диапазон (2,7, R) => [2,3,4,5,6,7]; правда.

Где список распечатывается только как часть функции.

Я подозреваю, что я все еще думаю итеративным образом, и это корень моей проблемы.

Изменить, чтобы добавить объединенную функцию

 concatenate([], L, L).
 concatenate([X|Y], L1, [X|L2]) :- concatenate(Y, L1, L2).

Решение с помощью @ coder

rank(Ceil, Ceil, []).
rank(Floor, Ceil, [Floor|R2]):- Floor2 is Floor + 1, range(Floor2, Ceil, R2), !.    

1 Ответ

0 голосов
/ 02 ноября 2018

Вам просто нужно немного изменить предикат range/4:

range(Floor, Ceil, R) :- Ceil2 is Ceil+1, range(Floor, Ceil2, R, Floor).
range(_, Ceil, [], Ceil).
range(Floor, Ceil, [Cnter|L], Cnter):- 
   Cnter2 is Cnter + 1, range(Floor, Ceil, L, Cnter2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...