1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Dúvida básica a Prolog

Discussão em 'Programação' iniciada por ngm, 8 de Dezembro de 2007. (Respostas: 5; Visualizações: 2668)

  1. ngm

    ngm Power Member

    Boas,

    O "programa" é muito simples, deverá receber um número e retornar uma lista a começar nesse número e acabar em 1.

    Por exemplo: run(3,Out) deverá devolver [3,2,1].

    Estou a usar a seguir código:

    Código:
    run(StartAt,Output) :- 
    	cicle(StartAt,[],Output).
    	
    cicle(0,T,T).
    cicle(Counter,ListIn,ListOut) :-
    	nl,write('In = '),write(ListIn),nl,
    	insert(Counter,ListIn,ListOut),
    	write('Out = '),write(ListOut),nl,
    	CounterNew is Counter-1,
    	cicle(CounterNew,ListOut,_).
    	
    insert(X,[],[X]). 
    insert(X,[Y|L],[Y|L1]) :- 
    	insert(X,L,L1).
    
    E obtenho o seguinte OUTPUT:

    Código:
    >> run(3,OUTPUT).
    In = []
    Out = [3]
    In = [3]
    Out = [3,2]
    In = [3,2]
    Out = [3,2,1]
    
    OUTPUT = [3] ? 
    
    Se o programa constrói a lista bem, como mostram os prints, porque raio não a devolve bem?

    Obrigado e abraço.
     
  2. Baderous

    Baderous Banido

    Assim já dá:

    Código:
    run(StartAt,Output) :- cicle(StartAt,[],Output).
        
    cicle(0,T,T):-!.
    cicle(Counter,L,L1) :-insere(Counter,L,L2), CounterNew is Counter-1, cicle(CounterNew,L2,L1).
    
    insere(X,L,L1):-append(L,[X],L1).
    No run não toquei.
    No cicle, coloquei um cut no caso de paragem por causa do backtracking e coloquei a lista L2 como uma lista auxiliar que vai ajudar na recursividade da função, vai ser essa lista que vai armazenar a lista temporária dos resultados, sendo que no final, o resultado é colocado na lista L1.
    No insere, apenas fiz à minha maneira, penso que o teu também está certo.
     
  3. ngm

    ngm Power Member

    Funcionou em pleno.

    Era essa da lista auxiliar que me estava a falhar!

    Muito obrigado Baderous... nem imaginas como me ajudaste.

    É que como sou meio noob a Prolog (principalmente em listas) tenho que recorrer a predicados simples (remover primeiro da lista, inserir no início da lista,...) para construir as minhas aplicações logo recorro muito à técnica do "contador" (em vez do [H|T]) para ir fazendo as coisas. :)

    % nunca pensei que na Techzonept me fossem ajudar com Prolog.
     
    Última edição: 8 de Dezembro de 2007
  4. Solid|Snake

    Solid|Snake I fold therefore I AM

    Este baderous sabe todas as linguagens de programação e mais algumas inventadas por ele :D
     
  5. Baderous

    Baderous Banido

    Ahah vai dormir meu! :205:
     
  6. Consu

    Consu Power Member

    Eu não percebo muito de Prolog, mas acho que assim fica mais simples. ;)

    Código:
    run( 1, [1] ) :- !.
    run(StartAt, [StartAt|T]) :- Next is StartAt - 1, run( Next, T ).
    
    Não precisas de contador dado que vais até 1. :p
     

Partilhar esta Página