CLP:“非三个相同值”的有效模型

时间:2019-04-25 14:57:01

标签: prolog constraint-programming eclipse-clp clp

我需要在Eclipse CLP中为这个(简单)约束建模:

给出三个域变量,假设D1D2D3,我想确保这三个变量以结尾相同的值。其中两个可以具有相同的值。

版本1

我的第一个想法是:

D1 #\= D2 or D1 #\= D3

但是我不喜欢模型中的析取。

版本2

然后我将模型更改为包含形式:

D1 #= D2 => D1 #\= D3

有没有更有效的方法来建模此约束?

我在考虑alldifferent([D1,D2,D3],2)neg nvalue([D1,D2,D3],1) 但是我不确定使用这种简单的用法是否会过于复杂。

1 个答案:

答案 0 :(得分:3)

使用nvalue(N, X),然后将N约束为大于1(N #> 1),将需要有2个或3个不同的值。

示例:

:-lib(ic).
:-lib(ic_search).
:-lib(ic_global).

go :-
    Len = 3,
    dim(X,[Len]),
    X :: 1..Len,
    N :: 1..Len,        

    nvalue(N,X),
    N #> 1,

    term_variables([X],Vars),
    search(Vars,0,first_fail,indomain,complete,[]),

    writeln([n:N, x:X]),
    fail.

该模型提供以下解决方案:

[n : 2, x : [](1, 1, 2)]
[n : 2, x : [](1, 1, 3)]
[n : 2, x : [](1, 2, 1)]
[n : 2, x : [](1, 2, 2)]
[n : 3, x : [](1, 2, 3)]
[n : 2, x : [](1, 3, 1)]
[n : 3, x : [](1, 3, 2)]
[n : 2, x : [](1, 3, 3)]
[n : 2, x : [](2, 1, 1)]
[n : 2, x : [](2, 1, 2)]
[n : 3, x : [](2, 1, 3)]
[n : 2, x : [](2, 2, 1)]
[n : 2, x : [](2, 2, 3)]
[n : 3, x : [](2, 3, 1)]
[n : 2, x : [](2, 3, 2)]
[n : 2, x : [](2, 3, 3)]
[n : 2, x : [](3, 1, 1)]
[n : 3, x : [](3, 1, 2)]
[n : 2, x : [](3, 1, 3)]
[n : 3, x : [](3, 2, 1)]
[n : 2, x : [](3, 2, 2)]
[n : 2, x : [](3, 2, 3)]
[n : 2, x : [](3, 3, 1)]
[n : 2, x : [](3, 3, 2)]