2010-03-21 21 views
6

Tengo un problema muy extraño con PROLOG. Lo he usado antes, pero ha pasado un tiempo y estoy oxidado. Tengo una lista de variables y necesito asegurarme de que ninguna de ellas sea la misma.PROLOG todos diferentes

que he intentado:

use_module(library(bounds)). all_different(A, B, C, D, 6, 8).

Sin embargo, cuando intento esto, me sale un error diciendo que all_different/6 es indefinido.

¿Cómo puedo solucionar este problema? ¿Hay alguna función de biblioteca a la que pueda llamar directamente para esto?

Estoy MUY trabado y agradecería cualquier ayuda.

Gracias de antemano.

solve([ 
    [A, 6, 1], 

    [B, 5, C, 2, D, E, F, G, 6], 

    [6, H, I, 5, J, K, 2, L, 3], 

    [5, M, 6, N, O, 4, P, Q, 5], 

    [4, R, S, T, U, 6, V, 4, W], 

    [2, 0, X] 
    ]) :- 
    all_different([A,6,1,2,D,E]), 
    all_different([B,5,C,6,H,I]), 
    all_different([C,2,D,I,5,J]), 
    all_different([D,E,F,J,K,2]), 
    all_different([F,G,6,2,L,3]), 
    all_different([H,I,5,M,6,N]), 
    all_different([5,J,K,N,O,4]), 
    all_different([K,2,L,4,P,Q]), 
    all_different([5,M,6,4,R,S]), 
    all_different([6,N,O,S,T,U]), 
    all_different([O,4,P,U,6,V]), 
    all_different([P,Q,5,V,4,W]), 
    all_different([T,U,6,2,1,X]), 

    A<7, A>0,  B<7, B>0,  C<7, C>0,  D<7, D>0, 
    E<7, E>0,  F<7, F>0,  G<7, G>0,  H<7, H>0, 
    I<7, I>0,  J<7, J>0,  K<7, K>0,  L<7, L>0, 
    M<7, M>0,  N<7, N>0,  O<7, O>0,  P<7, P>0, 
    Q<7, Q>0,  R<7, R>0,  S<7, S>0,  T<7, T>0, 
    U<7, U>0,  V<7, V>0,  W<7, W>0,  X<7, X>0. 
+0

Lo siento, el código parece un poco desordenado, pero no pude encontrar una forma de formatearlo correctamente – inspectorG4dget

Respuesta

9
all_different([A,B,C,D,6,8]). 

creo que sólo una lista se puede pasar en all_different.

+0

Lo intenté y obtuve este error: Procedimiento no definido: all_different/1. ¿Alguna idea? – inspectorG4dget

+1

Supongo que todavía tenía esto:: - use_module (library (bounds)). –

+0

Todavía tengo use_module (library (bounds)) – inspectorG4dget

2

Supongo que >/2 y </2 pueden saber nada sobre los atributos que all_different/1 aplicaron a los vars en la lista. En SWI-Prolog ese predicado es proporcionado por la biblioteca (clpfd) y entre otros predicados en esa biblioteca hay # </2.

  ?- all_different([X,Y]), 0 #< X, X #< 3, 1 #< Y, Y #< 4, indomain(X), indomain(Y). 
     X = 1, 
     Y = 2 ; 
     X = 1, 
     Y = 3 ; 
     X = 2, 
     Y = 3.

P.S. indomain/1 de la misma biblioteca produce todos los valores posibles dentro de las restricciones aplicadas.

1

La biblioteca de restricciones "ic" de Eclipse Prolog proporciona el predicado alldifferent/1, que toma una lista de variables como su argumento, por ejemplo, alldifferent([X,Y]) y calcula lo que está buscando.