列出不等式约束

msc*_*cky 11 prolog clpfd

我正在尝试编写一个Prolog(CLP)谓词,它将建立约束两个列表不等式的约束.

更正式地说,有两个列表A=[A1,...,AN], B=[B1,...,BN],约束被定义为(A1 #\= B1) #\/ (A2 #\= B2) #\/ ... #\/ (AN #\= BN).

我不确定如何在给定两个任意长度的列表的情况下构建此约束.这是我的尝试.我明白为什么它不起作用,但无法修复它.

any_different([], []).
any_different([H1|T1], [H2|T2]):-
    H1 #\= H2 #\/ any_different(T1, T2).
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 9

你需要建立析取并通过第三个参数返回它:

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.
Run Code Online (Sandbox Code Playgroud)

现在,调用any_different(List1, List2, AnyDiff)禁止变量AnyDiff,您可以将变量与其他变量一起传递给标记谓词.通过陈述AnyDiff #= 0你可以约束List1List2平等,同时AnyDiff #= 1会导致它们不平等.