2010-03-21 24 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 2010-03-21 05:06:21

回答

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

我相信只有一個列表可以傳遞到all_different。

+0

我試過了,得到了這個錯誤:Undefined procedure:all_different/1。 有什麼想法? – inspectorG4dget 2010-03-21 03:25:27

+1

我假設你還有這個: - use_module(library(bounds))。 – 2010-03-21 04:12:19

+0

我還有use_module(庫(邊界)) – inspectorG4dget 2010-03-21 04:34:52

2

我想>/2和</2可能對all_different/1應用於列表中的變量值的屬性一無所知。在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

Eclipse Prolog的「ic」約束庫提供謂詞alldifferent/1,它將變量列表作爲其參數,例如alldifferent([X,Y])並計算您正在查找的內容。