Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Programacion Logica

Iniciado por Dekarin, 06 de Mayo de 2004, 07:07:27 PM

« anterior - próximo »

Dekarin

 Buenas, estoy intentando hacer un predicado, de prolog, al que le paso una expresion algebraica simple y me devuelva la expresion lo mas simplificada posible.

Por ejemplo pedirle simp(x+2*3, D) y me devuelva en D = X + 6

Un trozo del codigo que simplificaria las sumas, seria este:


simp(A+B, Exp) :- simp(A, A2), simp(B, B2), op(A2+B2, Exp), !.
simp(A, A).

op(A+0, A).
op(0+B, B).
op(A+B, C) :- number(A), number(B), C is A+B.
op(A,A).


El problema esta, cuando intento hacer un simp(x+1+1, D).  Que no simplifica nada, sin embargo, si le pongo simp(1+1+x, D). si que me responde D = 2 + x.

Alguien tiene alguna idea sobre simplificar expresiones? o algun ejemplo para poder mirar otras formas de simplificar..., ya digo que son muy sencillas, a parte de esa, tengo la multiplicacion y la potencia, y ya. Muchas gracias de antemano  ^_^  

Mars Attacks

 Hmmm... tengo el prolog un poco olvidado (y eso que me examiné este año) pero lo de las sumas tendría que hacerse añadiendo algo así como:
op([A+B|+C],D) :- simp(A+C+B,D),!.

O algo similar. La idea es que intente permutar elementos (usando la propiedad conmutativa).

Suerte, a estas horas no puedo pensar bien, lo siento. Postea la solución cuando la encuentres, tengo curiosidad.

Dekarin

 Pues lo que mas se acerca a lo que busco es algo parecido a lo que tu decias Mars Attack, he añadido estas tres lineas y ya funciona medianamente bien, yo creo que lo voy a dejar asi, y ya se apañara el profesor jajaja. Venga, gracias  (ole)


simp(A+B+C,D) :- number(A), number(B), simp(A+B, D2), simp(D2+C,D), !.
simp(A+B+C,D) :- number(B), number(C), simp(B+C, D2), simp(A+D2,D), !.
simp(A+B+C,D) :- number(A), number(C), simp(A+C, D2), simp(D2+B,D), !.

Mars Attacks

 Ahí el problema es que con el corte entrará por la primera, verá que puede resolver y entonces no entrará por otras por las que podría haber conseguido una mejor simplificación. Yo incluso pensaría en añadirle algo de recursividad y hacer que saliera al no encontrar unificación dando error. Pero para eso necesitaría tres semanas de vacaciones pagadas en Cancún antes de ponerme a repasar los apuntes. Aún recuerdo las intensas cefaleas de las clases de prácticas  (uoh)  

Dekarin

 Jajajaja, pues si, pero es que necesito el corte, pq la simplificacion tiene que ser unica, solo puede existir una y ademas tiene q ser la que mas simplifique, asi que paso de calentarme mas  (asco), para una simple practica ya es suficiente asi, si no le gusta q la haga el, o que te pague las vacaciones en Cancun. Gracias por contestar.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.