2013-03-30 3 views
0

Я пытаюсь написать диапазон предикатов \ 3, который принимает три параметра: первый - это начало, второе - конец и возвращает сгенерированный список в третьем аргументе.Рекурсия в прологе - ошибка в базовом футляре

E.g позвонил (1,5, L).

L = [1, 2, 3, 4, 5] 

Я использовал этот код

range(E,E,[E]). 

range(S,E,L):- 
    S1 is S + 1, 
    range(S1,E,[S|L]). 

Но это не работает, когда я использовал команду трассировки, чтобы узнать, где ошибку я признал, что базовый случай бесполезно, я также попробовал зеленый вырезать ! в базовом случае, но он не работает в диапазоне (E, E, [E]),!.

Таким образом, если кто-нибудь знает, что это проблема, пожалуйста, помогите мне

ответ

0

Вы строите список в «неправильном» смысле. Учтите, что когда вы вызовете базовый регистр, он получит список consed. Как можно сопоставить один список элементов? Попробуйте вместо этого

range(S,E,[S|L]):- 
    S1 is S + 1, 
    range(S1,E,L). 
+0

спасибо большое Mr @Capellic это сработало, но когда я нажимаю; после правильного ответа я получил это сообщение «из локального стека», это правда. –

+0

* Теперь * вы можете исследовать разрез. Попытайтесь решить проблему. – CapelliC

+0

Я получил его, я должен добавить! разрезать в последнем диапазоне (S, E, [S | L]): - S1 - это S + 1, диапазон (S1, E, L),!. –

Смежные вопросы