2010-03-21 10 views
6

У меня очень странная проблема с PROLOG. Я использовал его раньше, но прошло некоторое время, и я ржавый. У меня есть список переменных, и мне нужно убедиться, что ни один из них не является одним и тем же.PROLOG все разные

Я попытался:

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

Однако, когда я пытаюсь это, я получаю сообщение об ошибке, что all_different/6 не определен.

Как я могу решить эту проблему? Есть ли какая-либо функция библиотеки, которую я могу вызвать для этого?

Я ОЧЕНЬ застрял и был бы очень признателен за любую помощь.

Заранее спасибо.

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

Извините, код выглядит немного испорченным, но я не смог найти способ его форматировать – inspectorG4dget

ответ

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

Я считаю, что только список может быть передан в all_different.

+0

Я пробовал это и получил эту ошибку: Неопределенная процедура: all_different/1. Любые мысли? – inspectorG4dget

+1

Я предполагаю, что у вас все еще было это:: - use_module (библиотека). –

+0

У меня все еще есть use_module (библиотека) – inspectorG4dget

2

Я думаю, что >/2 и </2 ничего не знают об атрибутах, которые all_different/1 применил к vars в списке. В SWI-Prolog этот предикат предоставляется библиотекой (clpfd) и среди других предикатов в этой библиотеке: # </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 из той же библиотеки дает все допустимые значения в рамках применяемых ограничений.

1

В библиотеке ограничений «ic» Eclipse Prolog имеется предикат alldifferent/1, который принимает в качестве аргумента список переменных, например alldifferent([X,Y]), и вычисляет то, что вы ищете.

 Смежные вопросы

  • Нет связанных вопросов^_^