Hola a todos y gracias por adelantado por cualquier ayuda
Tengo que crear un programa de Prolog CSP para un cuadrado romano, que consiste en un cuadrado de N filas y columnas, consistentes de 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_b ag', '$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!