jueves, 25 de enero de 2007

Solución Cifras en Prolog

Aquí deixovos o código que fixen para Cifras (o de cifras e letras) en prolog:

%Suma,Resta ou Multiplica os elementos dunha lista
%Caso base: cando chega ao último número da lista inicializa
%o resto dos valores a ese número

resultado([X],X,X).

%Resto dos casos: Como fago backtracking a operación analízase despois do
%caso base xunto coa expresión, posto que está despois da chamada recursiva.

resultado([X|L],Res,Expr):-
resultado(L,X1,Expr2),Res is X1+X,Expr = (Expr2 + X).
resultado([X|L],Res,Expr):-
resultado(L,X1,Expr2),Res is X1-X,Expr = (Expr2 - X).
resultado([X|L],Res,Expr):-
resultado(L,X1,Expr2),Res is X1*X,Expr = (Expr2 * X).


%Inicio do exercicio onde se pasa a lista cos números,
%o resultado que se quere obter e unha variable Expr
%onde se devolve a solución en forma de expresión.

cifras(L,R,Expr):-

%Permuta a lista para ter todas as posibilidades posibles
permutation(L,Z),

%Crea todas as posibles sublistas:
append(S,_,Z),

%Chamo á función resultado
resultado(S,Res,Expr),

%Fago isto para que na solución só me aparezan os
%valores iguais á variable R
R=:=Res.

3 comentarios:

Juan Pérez dijo...

Tenho vindo a testar o exercício e não me dá os resultados esperados. Eu queria perguntar como os resultados poderiam ser construídas com duas sub-expressões, pois, para o seguinte exemplo:

? - Figuras ([3, 5, 10], 12, E).

Com o exercício, o resultado seria:
E = 3,5 10;
E = 5 10-3;
E = 3,10 5;
E = 10 5-3;
falsa.

E deve dar:
E = 3,5 10;
E = 5 + (10-3);
E = 5 10-3;
E = 3,10 5;
E = 10 + (5-3);
E = 10 5-3;
falsa.

Muito obrigado por sua ajuda. Aguardo a sua resposta.

Anónimo dijo...

Sois los más listos!!!
El tío es gallego, no portugués... jajaja

Y después de cinco años, creo que no os va a responder...

A ver si para mañana lo tenéis hecho...

Anónimo dijo...

jajajaja, que cachondos, bueno era una buena opción para comenzar, pero había mucho por hacer, quienes se han quedado ahí simplemente se habrán dado cuenta de que les falla por todos lados ¿sabrá Alberto de la existencia de esta página?

Por cierto lo del portugués me ha matado ya... xD