Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Dekarin en 06 de Mayo de 2004, 07:07:27 PM

Título: Programacion Logica
Publicado por: Dekarin en 06 de Mayo de 2004, 07:07:27 PM
 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  ^_^  
Título: Programacion Logica
Publicado por: Mars Attacks en 06 de Mayo de 2004, 11:39:44 PM
 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.
Título: Programacion Logica
Publicado por: Dekarin en 11 de Mayo de 2004, 10:45:14 AM
 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), !.
Título: Programacion Logica
Publicado por: Mars Attacks en 12 de Mayo de 2004, 12:34:28 AM
 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)  
Título: Programacion Logica
Publicado por: Dekarin en 12 de Mayo de 2004, 12:45:15 AM
 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.