2010-03-21 7 views
6

Ich habe ein sehr seltsames Problem mit PROLOG. Ich habe es schon früher benutzt, aber es ist schon eine Weile her und ich bin rostig. Ich habe eine Liste von Variablen und ich muss sicherstellen, dass keiner von ihnen derselbe ist.PROLOG alle anders

Ich habe versucht:

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

Allerdings, wenn ich dies versuchen, erhalte ich eine Fehlermeldung, dass all_different/6 nicht definiert ist.

Wie kann ich dieses Problem lösen? Gibt es eine Bibliotheksfunktion, die ich direkt aufrufen kann?

Ich bin sehr stecken und würde jede Hilfe sehr zu schätzen wissen.

Vielen Dank im Voraus.

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

Leider sieht der Code etwas vermasselt, aber ich kann es nicht einen Weg richtig – inspectorG4dget

Antwort

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

Ich glaube, dass nur eine Liste kann in all_different übergeben werden.

+0

ich, dass versucht zu formatieren finden und habe diesen Fehler: Nicht definierte Verfahren: all_different/1. Irgendwelche Gedanken? – inspectorG4dget

+1

Ich nehme an, du hattest immer noch folgendes:: - use_module (library (bounds)). –

+0

Ich habe noch Use_module (Bibliothek (Grenzen)) – inspectorG4dget

2

Ich denke, dass >/2 und </2 möglicherweise nichts über Attribute wissen, die all_different/1 auf die Variablen in der Liste angewendet. In SWI-Prolog wird dieses Prädikat von der Bibliothek (clpfd) bereitgestellt und unter anderen Prädikaten in dieser Bibliothek ist # </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 aus derselben Bibliothek liefert alle möglichen Werte innerhalb der angewendeten Beschränkungen.

1

Die Constraint-Bibliothek "ic" von Eclipse Prolog stellt das Prädikat alldifferent/1 bereit, das eine Liste von Variablen als Argument verwendet, z. B. alldifferent([X,Y]), und berechnet, wonach Sie suchen.