Pergunta

Enquanto aprendo Prolog, estou tentando resolver o seguinte problema, usando acumuladores:

Escreva um predicado addone2/ cujo primeiro argumento seja uma lista de inteiros e cujo segundo argumento seja a lista de inteiros obtida pela adição de 1 a cada inteiro da primeira lista.Por exemplo, a consulta

       addone([1,2,7,2],X).

deveria dar

       X = [2,3,8,3].

Criei o seguinte código:

addone([], _).
addone([E|Tail], [R|Rs]) :-
    NewE is E+1,
    append([R|Rs], [NewE], NewRs),
    addone(Tail, NewRs).

Mas não está funcionando.Alguém pode me dizer o porquê?Então, como faço para usar acumuladores no Prolog?

Obrigado!

Foi útil?

Solução

anthares está correto porque você precisa refinar seu caso base.No entanto, você também está fazendo as coisas de maneira muito ineficiente com o seu append chamadas.No Prolog leva algum tempo para se acostumar com o poder da unificação, mas por exemplo, neste caso ajuda você a configurar imediatamente sua lista de resultados.Experimente o seguinte:

addone([E|Tail], [E1|Rs]) :-
    E1 is E+1,
    addone(Tail, Rs).

Isso é realmente tudo que existe para fazer.Ao colocar imediatamente E1 no padrão do seu segundo argumento, você já criou o primeiro elemento da sua lista de resultados.Os elementos restantes Rs será criado durante a recursão.Um padrão Prolog muito típico.

Outras dicas

A parte inferior da sua recursão deve ser addone([],[]). para que os NewRs sejam conectados com o []

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top