• Publicidad

Problema de satisfacción de restricciones (CSP)

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema de satisfacción de restricciones (CSP)

Notapor panterozo » 2010-07-27 23:30 @021

Muy Buenas:

Deseaba saber si alguien del foro, ha programado alguna vez un problema de estos (CSP) en Perl. Tengo entendido que en Prolog es facilito, pero deseo, como ya suponen, hacerlo en Perl.

He buscado en CPAN, sobre algoritmos implementados, pero no encontré lo que buscaba.

Espero sus comentarios ;)
Saludos
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Publicidad

Re: Problema de satisfacción de restricciones (CSP)

Notapor explorer » 2010-07-28 06:07 @296

Si buscas en CPAN por la palabra 'constraint' salen un montón de cosas, pero seguro que no son lo que quieres hacer.

Entre ellos aparecen los módulos relacionados con Prolog, como por ejemplo, AI::Prolog. Y otros más extraños, como Data::Domain.

Por Google me sale un compilador, el CSP2SAT, pero dicen que es una versión vieja.

Yo buscaría más por los módulos de Prolog, por si alguno de ellos permite la entrada de reglas de forma sencilla.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema de satisfacción de restricciones (CSP)

Notapor salva » 2010-07-29 08:01 @375

panterozo escribiste:Deseaba saber si alguien del foro, ha programado alguna vez un problema de estos (CSP) en Perl. Tengo entendido que en Prolog es facilito, pero deseo, como ya suponen, hacerlo en Perl.

Uno de mis módulos, Language::Prolog::Yaswi, permite llamar al interprete de Prolog SWI-Prolog desde Perl y combinar lo mejor de ambos lenguajes. Aquí hay un ejemplo de cómo utilizarlo para resolver un problema de CSP.

De todas formas, si nos das más detalles del problema que quieres resolver podremos ayudarte mejor.
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: Problema de satisfacción de restricciones (CSP)

Notapor panterozo » 2010-09-27 15:50 @702

Muchas gracias, Salva, por la información ;)

He estado viendo el módulo que me citas, y aprendiendo a utilizar Prolog. Para aprender a utilizar Prolog junto a Perl (creo que llamar a SWI-Prolog es de lo mejor para programar en Prolog y Perl a la vez), me gustaría hacer un programa que resuelva el problema de las N reinas, o bien de coloración de grafos.

Es posible que me indiques qué es lo que hace el programa que me citas, ya que creo que hace justamente lo que deseo hacer ;), pero para un problema que no entiendo xD

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Language::Prolog::Yaswi qw(:load :query);
  2. use Language::Prolog::Sugar vars => [qw(A B C D E F)],
  3.                             functors => [qw(problem)];
  4.  
  5. swi_inline <<EOP;
  6.  
  7. :- use_module(library(clpfd)).
  8.  
  9. problem(Vars) :-
  10.     Vars = [A, B, C, D, E, F],
  11.     Vars ins 0..1,
  12.     A + E #=< 1,
  13.     A + B #=< 1,
  14.     C + E #=< 1,
  15.     D + F #=< 1,
  16.     B + D #=< 1,
  17.     A + C + E #>= 1,
  18.     B + D #>= 1,
  19.     E + F #>=  1,
  20.     D + F #= 1,
  21.     A + E #=< 1,
  22.     C + D #=< 1,
  23.     A + B + C + D + E + F #= 3,
  24.     label(Vars).
  25.  
  26. EOP
  27.  
  28. swi_set_query(problem([A, B, C, D, E, F]));
  29. while (swi_next) {
  30.     my @r = swi_vars(A, B, C, D, E, F);
  31.     print join(', ', @r), "\n";
  32. }
  33.  
  34. # prints:
  35. # 0, 1, 0, 0, 1, 1
  36. # 0, 1, 1, 0, 0, 1
  37.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


¡¡¡ Muchas gracias !!!

P.D.: en realidad, no entiendo siquiera lo que está entre EOP

Thanks again
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Problema de satisfacción de restricciones (CSP)

Notapor salva » 2010-09-28 03:13 @176

panterozo escribiste:Es posible que me indiques qué es lo que hace el programa que me citas, ya que creo que hace justamente lo que deseo hacer ;), pero para un problema que no entiendo xD

El problema original está aquí y no se trata del tradicional N-reinas si era eso a lo que te referías.

Este es el código Prolog comentado, espero que así sea un poco más fácil de entender:

Sintáxis: [ Descargar ] [ Ocultar ]
Using prolog Syntax Highlighting
  1. :- use_module(library(clpfd)). /* usa la librería clpfd */
  2.  
  3. /*
  4.    CLPFD = Constraint Logig Programming - Finite Domain
  5.    CLP = CSP + Prolog
  6.    "Finite Domain" quiere decir que las variables de tu problema pueden tomar valores dentro de un conjunto
  7.    finito de elementos. Hay otras librerías para trabajar con números enteros o con reales
  8.  */
  9.  
  10. problem(Vars) :-
  11.     Vars = [A, B, C, D, E, F], /* incógnitas del problema que queremos resolver */
  12.     Vars ins 0..1,             /* definimos su dominio, en este caso, pueden tomar los valores 0 o 1 */
  13.  
  14.     A + E #=< 1,               /* El conjunto de ecuaciones e inecuaciones que tienen que cumplir. */
  15.     A + B #=< 1,               /* En este caso es una traslación directa del enunciado del problema. */
  16.     C + E #=< 1,               /* Los operadores con la almohadilla son los definidos por la librería clpfd */
  17.     D + F #=< 1,               /* y su significado es similar al de los mismos sin la almohadilla. */
  18.     B + D #=< 1,               /* Sirven para declarar las restricciones de tu problema. */
  19.     A + C + E #>= 1,
  20.     B + D #>= 1,
  21.     E + F #>=  1,
  22.     D + F #= 1,
  23.     A + E #=< 1,
  24.     C + D #=< 1,
  25.     A + B + C + D + E + F #= 3,
  26.  
  27.     label(Vars).               /* Esta función asigna valores a las variables respetando las */
  28.                                /* restricciones hasta que encuentra una combinación válida */
  29.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


De todas formas antes de meterte a hacer cosas complicadas mezclando Perl y Prolog te aconsejaría que te familiarizases un poco mas utilizando Prolog de manera autónoma. SWI-Prolog tiene un entorno de desarrollo bastante potente con un debugger gráfico donde es posible seguir la ejecución de tu programa y ver lo que pasa.

Aunque a primera vista la programación CLP parece sencilla, en la práctica es necesario entender cómo funciona por debajo para conseguir que tus programas sean eficientes. Los problemas de CSP suelen ser de tipo NP y a poco que los compliques se vuelven intratables.

De todas formas para resolver un problema de este tipo lo primero que tienes que hacer es escribir las restricciones del mismo y te reto a que lo hagas. Si escribes las ecuaciones del problema, luego yo te ayudo a convertirlas en un programa en Prolog.
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: Problema de satisfacción de restricciones (CSP)

Notapor panterozo » 2010-09-30 13:37 @609

salva:

No es una trivialidad el problema que deseo resolver, así que necesita de un análisis un poco más extenso... Te agradezco mucho tu buena voluntad, y el reto me lo tomo a pecho :P

No tengas duda, que cuando escriba este problema, te pediré la ayuda ofrecida.

thanks
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Problema de satisfacción de restricciones (CSP)

Notapor panterozo » 2010-11-23 00:55 @080

Reabro el tema:

El problema consiste en conseguir las posibles posiciones a acordes en una guitarra.

Para cada nota musical, se le asigna una cuerda, un espacio y un dedo de la mano izquierda (1..4), de la forma "<string, fret, finger>" respectivamente.
NOTA: Suponiendo que la mano izquierda es la que se mueve por sobre el mástil o el diapasón de la guitarra.

Los espacios se numeran del 1 al 24, partiendo desde la clavija de la guitarra, hasta la caja de ella.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $FA = <<END;
  2. <6,1,1> # Cuerda seis, espacio 1, dedo indice de la mano izquierda
  3. <6,1,2> # Cuerda seis, espacio 1, dedo medio de la mano izquierda
  4. <6,1,3> # Cuerda seis, espacio 1, dedo anular de la mano izquierda
  5. <6,1,4> # Cuerda seis, espacio 1, dedo meñique de la mano izquierda
  6. END
  7.  
  8. # Para la nota DO, se puede tocar en dos cuerdas, y sonará la misma nota.
  9. my $DO = <<END;
  10. <5,3,1> # Cuerda cinco
  11. <5,3,2>
  12. <5,3,3>
  13. <5,3,4>
  14. <6,8,1> # Cuerda seis
  15. <6,8,2>
  16. <6,8,3>
  17. <6,8,4>
  18. END
  19. # Para la nota MI, se puede tocar en tres cuerdas distintas, y sonará la misma nota
  20. my $MI = <<END;
  21. <4,2,1> # Cuerda cuatro, espacio 2
  22. <4,2,2>
  23. <4,2,3>
  24. <4,2,4>
  25. <5,7,1> # Cuerda cinco, espacio 7
  26. <5,7,2>
  27. <5,7,3>
  28. <5,7,4>
  29. <6,12,1> # Cuerda seis, espacio 12
  30. <6,12,2>
  31. <6,12,3>
  32. <6,12,4>
  33. END
  34.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Un acorde se compone de 2 o más notas tocadas a la vez. Si las tres notas descritas arriba se tocan a la vez, cada una de estas combinaciones representará una columna, o nodo. Su dominio, será todas las posibles combinaciones para cada nota en cada cuerda. Las restricciones son:

1) Solo una nota por cuerda
2) Dedos con número mayor, tocan solo espacios con un numero mayor.

Ej: a) Si toco la segunda cuerda en el tercer espacio con el dedo índice (<2,3,1>), no puedo tocar con ningún otro dedo espacios superiores.
b) Si toco la segunda cuerda en el tercer espacio con el dedo medio (<2,3,2>), solo podré tocar en algún espacio superior con el dedo índice (<2,3,2> es válido con <3,2,1> por ejemplo)

3) Una máxima distancia entre los dedos.

Ej: Si estoy tocando en el primer espacio <x,1,x>, no puedo tocar a la vez en el doceavo espacio <x,12,x>

Distancias:
1) Entre el índice (1) y el meñique (4) no puedo superar los 4 espacios de distancia.
2) Entre el índice (1) y el anular (3) no puedo superar los 3 espacios
3) Entre el índice (1) y el medio (2) no puedo superar 2 espacios
4) Entre el medio (2) y el meñique (4) no puedo superar 3 espacios
5) Entre el medio (2) y el anular (3) no puedo superar 1 espacio
6) Entre el anular (3) y el meñique (4) no puedo superar 2 espacios

Ej: <4,2,3> y <3,5,4> no cumple la restricción entre anular y meñique (6), porque la resta entre los espacios es 5-2 = 3, y supero los 2 espacios.

4) Sólo el dedo índice, puede hacer una cejilla

Ej: <2,2,1> es válido con <1,2,1>, <3,2,1>, <4,2,1>, <5,2,1>, y <6,2,1>.
<2,2,2> no es valido con <1,2,2>, ya que sólo el índice puede hacer cejilla

Al problema le he ido agregando algunas restricciones, pero las más importantes están descritas arriba

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # Recibe dos valores, <x,x,x> y <x,x,x>. Si el par cumple con las restricciones, retorna 1, sino, retorna -1
  2.  
  3. sub isValid{
  4.     my($uno,$dos) = @_;
  5.     my ($string_1,$fret_1,$finger_1) = getData($uno);#getData, separa <x,x,x> y retorna $string,$fret,$finger, para ser comparados individualmente
  6.     my ($string_2,$fret_2,$finger_2) = getData($dos);
  7.     if($string_1 == $string_2){# Una nota por cuerda
  8.         #print "\nNo cumple una nota por cuerda <$string_1,$fret_1,$finger_1> <$string_2,$fret_2,$finger_2>";
  9.         return -1;
  10.         }
  11.     elsif($finger_1 == 0 or $finger_2 == 0){# Cuerda al aire
  12.         return 1;
  13.         }
  14.     elsif($fret_1 == $fret_2 and $string_1 < $string_2 and $finger_1 < $finger_2){
  15.         return -1;
  16.         }
  17.     elsif($finger_1 == $finger_2 and $fret_1 == $fret_2 and $finger_1 != 1){# Solo el índice hace el barré
  18.         return -1;
  19.         }
  20.     elsif($finger_1 == $finger_2 and $fret_1 == $fret_2 and $finger_1 == 1){# Solo el índice hace el barré o cejilla
  21.         return 1;
  22.         }
  23.     elsif(modulo($string_1-$string_2) == 1 and $fret_1 == $fret_2 and modulo($finger_1-$finger_2) != 1){
  24.         return -1;
  25.         }
  26.     elsif($fret_1 < $fret_2 and $finger_2 <= $finger_1){# Espacios menores, se tocan con dedos menores
  27.         return -1;
  28.         }
  29.     elsif($fret_1 > $fret_2 and $finger_2 >= $finger_1){# Espacios mayores, se tocan con dedos mayores
  30.         return -1;
  31.         }
  32.     elsif($string_1 > $string_2 and $finger_1 > $finger_2 and $fret_1 == $fret_2){# En duda
  33.         return -1;
  34.         }
  35.     elsif(MaxSpanOverFingerPairs($fret_1,$finger_1,$fret_2,$finger_2) == 0){# La distancia máx que es posible con los dedos
  36.         return -1;
  37.         }
  38.     return 1;
  39.     }
  40.  
  41. sub MaxSpanOverFingerPairs{
  42.         my($fret_1,$finger_1,$fret_2,$finger_2) = @_;
  43.         if($finger_1 == 1){
  44.                 if($finger_2 == 2){return modulo($fret_2-$fret_1) > 2 ? 0 : 1;}
  45.                 if($finger_2 == 3){return modulo($fret_2-$fret_1) > 3 ? 0 : 1;}
  46.                 if($finger_2 == 4){return modulo($fret_2-$fret_1) > 4 ? 0 : 1;}
  47.                 }
  48.         if($finger_1 == 2){
  49.                 if($finger_2 == 1){return modulo($fret_2-$fret_1) > 2 ? 0 : 1;}
  50.                 if($finger_2 == 3){return modulo($fret_2-$fret_1) > 1 ? 0 : 1;}
  51.                 if($finger_2 == 4){return modulo($fret_2-$fret_1) > 3 ? 0 : 1;}
  52.                 }
  53.         if($finger_1 == 3){
  54.                 if($finger_2 == 1){return modulo($fret_2-$fret_1) > 3 ? 0 : 1;}
  55.                 if($finger_2 == 2){return modulo($fret_2-$fret_1) > 1 ? 0 : 1;}
  56.                 if($finger_2 == 4){return modulo($fret_2-$fret_1) > 2 ? 0 : 1;}
  57.                 }
  58.         if($finger_1 == 4){
  59.                 if($finger_2 == 1){return modulo($fret_2-$fret_1) > 4 ? 0 : 1;}
  60.                 if($finger_2 == 2){return modulo($fret_2-$fret_1) > 3 ? 0 : 1;}
  61.                 if($finger_2 == 3){return modulo($fret_2-$fret_1) > 1 ? 0 : 1;}
  62.                 }
  63.         return 1;
  64.         }
  65.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Lo primero que hace mi programa es, comparar todas las notas que están en el acorde (pueden ir de dos a seis) y eliminar de su dominio aquellas que no cumplen con las restricciones. Luego, realiza una búsqueda en profundidad (Deep Search First) para saber todas las posibles soluciones, con la siguiente función recursiva:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub getSolutions{
  2.     my ($ref_array_hashes,$i,$ref_dominio,$ref_recorrido,$ref_solutions) = @_;# Recibe un arreglo, dentro del cual están las notas que se han de comparar. ($[0]= FA, $[1] = DO, $[2] = MI). Pueden ser hasta 6 notas
  3.     my @hashes = @{$ref_array_hashes};
  4.     if(scalar(@hashes) == 0){
  5.         my @array = @{$ref_dominio};
  6.         my @solutions;
  7.         if (reviseBarre($ref_dominio) == 1){
  8.             my $join;
  9.             foreach(@{$ref_dominio}){
  10.                 $_ =~ s/\n//g;
  11.                 $join .= $_." - ";
  12.                 }
  13.             push(@{$ref_solutions},$join);
  14.             }
  15.         pop(@array);
  16.         return $i-1,\@array,$ref_solutions;
  17.         }
  18.     my $ref_hash = $hashes[0];# Obtengo el primer layer del arreglo
  19.     my %layer = %{$ref_hash};
  20.     if($i > 0){
  21.         my $dominio = $ref_recorrido;
  22.         foreach my $recorrido (@{$layer{$dominio}}){
  23.             my $control = 0;
  24.             foreach(@{$ref_dominio}){
  25.                 $control = 1 if (isValid($_,$recorrido) == -1);                
  26.                 }
  27.             my $array;
  28.             if($control == 0){
  29.                 push(@{$ref_dominio},$dominio);
  30.                 $array = shift(@hashes);
  31.                 if(scalar(@hashes) == 0){push(@{$ref_dominio},$recorrido);}
  32.                 ($i,$ref_dominio,$ref_solutions) = getSolutions(\@hashes,$i+1,$ref_dominio,$recorrido,$ref_solutions);
  33.                 pop(@{$ref_dominio});
  34.                 unshift(@hashes,$array);
  35.                 }
  36.             }
  37.         return $i-1,$ref_dominio,$ref_solutions;
  38.         }
  39.     foreach my $dominio (keys %layer){
  40.         foreach my $recorrido (@{$layer{$dominio}}){
  41.             push(@{$ref_dominio},$dominio);
  42.             my $array = shift(@hashes);
  43.             ($i,$ref_dominio,$ref_solutions) = getSolutions(\@hashes,$i+1,$ref_dominio,$recorrido,$ref_solutions);
  44.             pop(@{$ref_dominio});
  45.             unshift(@hashes,$array);
  46.             }
  47.         }
  48.     return $ref_solutions;
  49.     }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Esta función, busca en las diferentes capas (FA,DO,MI) por las soluciones mientras sean arco-consistentes, es decir, que entre ellas satisfagan el conjunto de restricciones.

El uso de Prolog, facilitaría mucho las cosas. La velocidad en el procesamiento creo que aumentaría considerablemente. Podría hacer un mejor manejo de las variables involucradas, etc, etc, etc... Prolog definitivamente es mucho mejor para solucionar un problema como este.

Me interesa mucho este módulo para usar swi-prolog. Este problema está basado en la tesis de Daniele Radicioni. Él me ha enviado el código de su programa. Aunque no lo he podido ejecutar, sí he visto que está escrito en C++, pero creo que la solución se puede optimizar y hacerla muchísimo más eficiente.

Quizás este no sea un tema para el foro Básico, mis escusas, pero debía reabrir este tema.
Espero haber sido claro en lo expuesto. La explicación del código creo que es un tanto innecesaria, ya que deseo hacerlo en Prolog.

Me despido como siempre, muy agradecido de que exista este foro

¡¡¡Saludos!!!
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Problema de satisfacción de restricciones (CSP)

Notapor salva » 2010-11-23 07:07 @338

Como la dimensión de tu problema no parece muy elevada, para empezar, sin necesidad de recurrir al CLP, puedes usar el siguiente patrón muy común en Prolog:

Sintáxis: [ Descargar ] [ Ocultar ]
Using prolog Syntax Highlighting
solucion(S) :-
  generar_variacion(S),
  comprobar_restricciones(S).
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Aquí tienes un programa que hace eso pero sin la condición de la cejilla (que probablemente te obligue a representar la posición de los dedos de otra manera).

Sintáxis: [ Descargar ] [ Ocultar ]
Using prolog Syntax Highlighting
nota(do, 5, 3).
nota(do, 6, 8 ).
nota(fa, 6, 1).
nota(mi, 4, 2).
nota(mi, 5, 7).
nota(mi, 6, 12).

asigna_notas_a_dedos(Notas, Dedos) :-
        length(Dedos, 4),
        permutation(Notas, Notas1),
        asigna_notas_a_dedos1(Notas1, Dedos1),
        valida_una_nota_por_cuerda(Dedos1),
        asigna_dedos_extra(Dedos, Dedos1), /* hasta ahora habíamos asignado un dedo por nota,
                                              pero tenemos que colocar los cuatro dedos sobre la guitarra */

        valida_espacios_crecientes(Dedos),
        valida_distancias(Dedos).

asigna_notas_a_dedos1([], []).
asigna_notas_a_dedos1([N|NT], [(C, E)|DT]) :-
        nota(N, C, E),
        asigna_notas_a_dedos1(NT, DT).

asigna_dedos_extra([], []).
asigna_dedos_extra([H|T], [H|T1]) :-
        (   (   T1 = [(_, T1E)|_]
            ->  H = (HC, HE),
                between(HE, T1E, E),
                asigna_dedos_extra(T, [(HC, E)|T1])
            ;   asigna_dedos_extra(T, [H|T1]) )
        ;   asigna_dedos_extra(T, T1)).

valida_una_nota_por_cuerda(D) :-
        valida_una_nota_por_cuerda(D, _).

valida_una_nota_por_cuerda([], _).
valida_una_nota_por_cuerda([(C, E)|T], Vistas) :-
        nth1(C, Vistas, E),
        valida_una_nota_por_cuerda(T, Vistas).

valida_espacios_crecientes([_]).
valida_espacios_crecientes([(_,E1), (_, E2)|T]) :-
        E2 >= E1,
        valida_espacios_crecientes([(_,E2)|T]).

valida_distancias([(_,E1),(_,E2),(_,E3),(_,E4)]) :-
        4 >= E1 - E4,
        3 >= E1 - E3,
        2 >= E1 - E2,
        3 >= E2 - E4,
        1 >= E2 - E3,
        2 >= E3 - E4.

:- asigna_notas_a_dedos([do, fa], D), write(D), nl, fail ; true.
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


(por cierto, creo que no estás teniendo en cuenta qué pasa cuando quedan cuerdas sin pulsar)

Combinar Prolog y Perl en el mismo programa puede resultar complicado, especialmente si no estás familiarizado con Prolog. Yo te recomiendo que para empezar trates de programar todo en Prolog, y en concreto para el problema que planteas, no veo muchas ventajas en mezclar los dos lenguajes.

Incrustar Prolog en Perl está bien cuando por ejemplo estás desarrollando una aplicación web con algún framework de los que tiene Perl y en algún momento quieres hacer algún computo con un algoritmo que es más fácil implementar en Prolog.
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: Problema de satisfacción de restricciones (CSP)

Notapor panterozo » 2010-12-15 11:30 @520

Salva:

Tienes mucha razón... Si no se sabe de Prolog, mejor no unir ambos lenguajes. Debo decirte que me impresionó la rapidez con la que contestaste, y por lo que vi, funcionaba en Prolog. Seguiré haciéndolo solo con Perl

Muchas gracias por la ayuda e ideas otorgadas ;)
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 34 invitados

cron