7

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.
4

3 に答える 3

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

all_different に渡すことができるのは List だけだと思います。

于 2010-03-21T02:55:51.537 に答える
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。

同じライブラリからの PS indomain/1 は、適用された制約内ですべての実行可能な値を生成します。

于 2010-03-22T06:05:31.140 に答える
1

Eclipse Prologの「ic」制約ライブラリは、述語alldifferent / 1を提供します。これは、引数として変数のリストを取り、たとえば、alldifferent([X,Y])探しているものを計算します。

于 2010-03-26T09:03:34.033 に答える