CLP: эффективная модель «не трех одинаковых значений» - PullRequest
1 голос
/ 25 апреля 2019

Мне нужно смоделировать это (простое) ограничение в Eclipse CLP:

С учетом трех переменных домена, скажем, D1, D2 и D3, и я хочу убедиться, что эти три переменныебудет не в конечном итоге с тем же значением.Два из них могут иметь одинаковое значение.

Версия 1

Моя первая идея была похожа на:

D1 #\= D2 or D1 #\= D3

Но мне не нравятся дизъюнкции в модели.

Версия 2

Затем я изменил модель в виде значений:

D1 #= D2 => D1 #\= D3

Есть ли более эффективный способ моделирования этого ограничения?

Я думал о alldifferent([D1,D2,D3],2) или neg nvalue([D1,D2,D3],1), но я не уверен, что он не слишком сложен для такого простого использования.

1 Ответ

3 голосов
/ 25 апреля 2019

Использование nvalue(N, X), а затем ограничение N на значение больше 1 (N #> 1) потребует наличия двух или 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)]
...