CLP:高效的'not three same values'模型



我需要在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)但我不确定对于如此简单的用法来说是否过于复杂。

使用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)]

相关内容

  • 没有找到相关文章

最新更新