11

2 つのリストの不等式を制約する制約を構築する Prolog (CLP) 述語を作成しようとしています。

より正式には、2 つのリストを持つA=[A1,...,AN], B=[B1,...,BN]制約は として定義され(A1 #\= B1) #\/ (A2 #\= B2) #\/ ... #\/ (AN #\= BN)ます。

任意の長さの 2 つのリストを指定して、この制約を作成する方法がわかりません。これが私の試みです。うまくいかない理由はわかりますが、修正できません。

any_different([], []).
any_different([H1|T1], [H2|T2]):-
    H1 #\= H2 #\/ any_different(T1, T2).
4

3 に答える 3

9

論理和を構築し、それを 3 番目の引数で返します。

any_different([], [], V) :-
    V #= 0.  % no differences between [] and []
any_different([H1|T1], [H2|T2], Disj) :-
    any_different(T1, T2, Disj0),
    Disj #<==> (H1 #\= H2) #\/ Disj0.

現在、呼び出しは、他の変数とともにラベル付け述語に渡すことができるany_different(List1, List2, AnyDiff)変数を制限します。あなたが制約することができ、等しくなることができるとAnyDiff述べることによって、whileはそれらを不平等にする.AnyDiff #= 0List1List2AnyDiff #= 1

于 2012-12-22T13:12:57.047 に答える
4

少なくともSWI-Prologでは、述語dif / 2とlibrary(clpfd)が具体化の代替になる可能性があると思います。

?- L=[X,Y,Z], L ins 1..3, dif(L,[1,2,3]), label(L).
L = [1, 1, 1],
X = Y, Y = Z, Z = 1 ;
L = [1, 1, 2],
X = Y, Y = 1,
Z = 2 ;
...
于 2012-12-23T11:33:59.260 に答える