Prolog - Ayuda prolog Cuadrado

   
Vista:

Ayuda prolog Cuadrado

Publicado por riffdr (2 intervenciones) el 30/12/2012 12:30:47
Tengo que crear un programa de cuadrado romano, que consiste de un numero N de grupos de números desde el 1 al N que están dispuestos de tal manera que ninguna fila o columna contiene el mismo número dos veces. For ejemplo, el cuadrado del orden de dos nos da dos cuadrados

1 2
2 1

2 1
2 1


Tengo que escribir un programa en Prolog que nos de todas las posibilidades de número de cuadradados romanos del orden N sea. He adaptado el programa de SUDOKU que está en la documentación de SWI http://www.swi-prolog.org/man/clpfd.html


Aquí está el código que tengo finalizado por el momento:


%------------------------------------------------------------------------------------------------------------------------------------

:- use_module(library(clpfd)).

cuadrado_romano(Numero, Cuenta):-

findall(_, solucion(_Soln, Numero), Sa),
length(Sa, Cuenta).

solucion(Matriz, Numero):-
Suma #= abs((1 + Numero)*(Numero / 2)),
length(Cuadrado, Numero), maplist(longitud(Numero), Cuadrado), append(Cuadrado, Singlelist),
Singlelist ins 1..Numero,
maplist(all_distinct, Cuadrado), maplist(suma(Suma), Cuadrado),
transpose(Cuadrado, Columnas), maplist(all_distinct, Columnas), maplist(suma(Suma), Columnas),
label(Matriz).

%-----------------------------------------------------------------------------
% "Mi predicado para checar la longitud"
longitud(N, Lista):-
length(Lista, N).

%-----------------------------------------------------------------------------
% "Mi predicado para checar la suma"
suma(N, Lista):-
sum_list(Lista, N).

%------------------------------------------------------------------------------------------------------------------------------------

Por el momento he conseguido realizar este codigo, pero cada vez que llamo al predicado

?-cuadrado_romano(3, Cuenta).

Recibo este error:
| .
ERROR: is/2: Arguments are not sufficiently instantiated
^ Exception: (10) setup_call_catcher_cleanup('$bags':'$new_findall_bag', '$bags':findall_loop(_G19, user:solucion(_G13, 3), _G21, []), _G3542, '$bags':'$destroy_findall_bag') ?


Cuando llamo al predicado
?-solucion(Matriz, 3).

SWI me da este mensaje

ERROR: is/2: Arguments are not sufficiently instantiated


Llevo días atascado con ello y no doy con la raiz del problema, ¿alguien puede ayudarme por favor? Un saludo y feliz 2013!





Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda prolog Cuadrado

Publicado por riffdr (2 intervenciones) el 13/01/2013 00:15:58
problema solucionado, subiera la respuesta más tarde
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar