2017-01-21 10 views
0

Я очень новичок в Prolog. Моя цель - добавить целые числа в список, вплоть до привязки: , если функция получает N, она выдает список [N, N-1, ... , 1].Как добавить число в список в пролог?

Вот мой код:

myAppend(0, L) :- append([],[], L). 
myAppend(N, L) :- append([N], [], L), N1 is N - 1, myAppend(N1, L). 

вызова функции выше возвращает ложь для каждого N=\=0:

51 ?- myAppend(0,L). 
L = [] ; 
false. 

52 ?- myAppend(2,L). 
false. <-------------------- was expecting L = [2, 1] 

53 ?- 

Однако, когда я изменил свою функцию (поставить точку . вместо , после позвоните по номеру append во втором правиле):

myAppend(0, L) :- append([],[],L). 
myAppend(N,L) :- append([N], [], L). N1 is N - 1, myAppend(N1, L). 

я получил следующий вывод:

51 ?- myAppend(0,L). 
L = [] ; 
false. 

52 ?- myAppend(4,L). 
L = [4] . <-------------- was expecting [4, 3, 2, 1] 

53 ?- 

Я не могу понять, почему в 1-й реализации я получал false, хотя логика за ним правильно?

+0

Что вы ожидаете от 'append ([N], [], L)'? Знаете ли вы, что делает 'append/3'? у вас есть какое-либо понятие _unification? _ –

+0

@gniourf_gniourf, да, я использую его, чтобы добавить в список один номер. в качестве примера я смог сделать это после того, как я изменил код, как я показал в вопросе выше. он добавляет [N] к [] и помещает результат в L. – ThunderWiring

+0

Знаете ли вы, что изменение ',' на '.' изменило одно правило на два правила? Вы не получили сообщение об ошибке «Полная остановка в разделе-тело? Не можете переопределить,/2', когда вы сделали изменение? –

ответ

1

насчет

myAppend(0, []). 

myAppend(N, [N | L]) :- 
    N > 0, 
    N1 is N - 1, 
    myAppend(N1, L). 

?

+0

i добавлен 'append ([N], L, L),' после строки 'N1 является N -1' и заменить 1-ю строку на' range (0, L): - L = [] .'. Выход, который я получил, был 'L = [5 | **] .' для вызова' myAppend (N, 5) .'. Как я могу просмотреть, что список содержит все числа? (т. е. развернуть '**') – ThunderWiring

+0

@ThunderWing 'append ([N], L, L)' запрашивает список 'L', такой, что' L' добавляется к '[N]' возвращает 'L' назад , то есть 'L = [N | L]'. Решением этого является * циклический член * (термин, который рекурсивно относится к самому себе). Это то, что вы хотите? Зачем вам нужно или нужно использовать 'append/3', а не решение, которое показало max66? – lurker

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

  • Нет связанных вопросов^_^