Dúvida básica a Prolog

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.
 
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.
 
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:
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
 
Back
Topo