handler fd { class java.lang.Integer; class IntUtil; class nl; // nested list class NlIntUtil; constraint fdEnu(java.lang.Integer, nl); constraint fdInt(java.lang.Integer, java.lang.Integer, java.lang.Integer); constraint fdLe(java.lang.Integer, java.lang.Integer); constraint fdLt(java.lang.Integer, java.lang.Integer); constraint fdNe(java.lang.Integer, java.lang.Integer); rules { variable java.lang.Integer X; variable java.lang.Integer Y; variable java.lang.Integer Min; variable java.lang.Integer Max; variable java.lang.Integer MinX; variable java.lang.Integer MinX1; variable java.lang.Integer MinY; variable java.lang.Integer MaxY; variable java.lang.Integer MaxY1; variable java.lang.Integer MaxX; variable nl L, L1, L2; // failure if (nl.isEmpty(L)) { fdEnu(X, L) } <=> { false } failure; // intersection { fdEnu(X, L1) && fdEnu(X, L2) } <=> { L = nl.intersection(L1, L2) && fdEnu(X, L) } intersection; // interaction with intervals { fdEnu(X, L) && fdInt(X, Min, Max) } <=> { L1 = NlIntUtil.removeLower(Min, L) && L2 = NlIntUtil.removeHigher(Max, L1) && fdEnu(X, L2) } intersection2; // interaction with inequalities if (nl.notEmpty(L1) && MinX = NlIntUtil.minList(L1) && nl.notEmpty(L2) && MinY = NlIntUtil.minList(L2) && IntUtil.gt(MinX, MinY)) { fdLe(X, Y) && fdEnu(X, L1) && fdEnu(Y, L2) } ==> { MinX = NlIntUtil.minList(L1) && MaxY = NlIntUtil.maxList(L2) && fdInt(Y, MinX, MaxY) } leMin; if (nl.notEmpty(L1) && MaxX = NlIntUtil.maxList(L1) && nl.notEmpty(L2) && MaxY = NlIntUtil.maxList(L2) && IntUtil.gt(MaxX, MaxY)) { fdLe(X, Y) && fdEnu(X, L1) && fdEnu(Y, L2) } ==> { MinX = NlIntUtil.minList(L1) && MaxY = NlIntUtil.maxList(L2) && fdInt(X, MinX, MaxY) } leMax; if (nl.notEmpty(L1) && MinX = NlIntUtil.minList(L1) && nl.notEmpty(L2) && MinY = NlIntUtil.minList(L2) && MinX1 = IntUtil.inc(MinX) && IntUtil.gt(MinX1, MinY)) { fdLt(X, Y) && fdEnu(X, L1) && fdEnu(Y, L2) } ==> { MinX = NlIntUtil.minList(L1) && MinX1 = IntUtil.inc(MinX) && MaxY = NlIntUtil.maxList(L2) && fdInt(Y, MinX1, MaxY) } ltMin; if (nl.notEmpty(L1) && MaxX = NlIntUtil.maxList(L1) && nl.notEmpty(L2) && MaxY = NlIntUtil.maxList(L2) && MaxY1 = IntUtil.dec(MaxY) && IntUtil.lt(MaxY1, MaxX)) { fdLt(X, Y) && fdEnu(X, L1) && fdEnu(Y, L2) } ==> { MinX = NlIntUtil.minList(L1) && MaxY = NlIntUtil.maxList(L2) && MaxY1 = IntUtil.dec(MaxY) && fdInt(X, MinX, MaxY1) } ltMax; // interaction with fdNe if (NlIntUtil.member(X, L)) { fdNe(X, Y) &\& fdEnu(Y, L) } <=> { L1 = NlIntUtil.remove(L, X) && fdEnu(Y, L1) } ne1; if (NlIntUtil.member(X, L)) { fdNe(Y, X) &\& fdEnu(Y, L) } <=> { L1 = NlIntUtil.remove(L, X) && fdEnu(Y, L1) } ne2; if (NlIntUtil.notMember(X, L)) { fdEnu(Y, L) &\& fdNe(X, Y) } <=> { true } ne3; if (NlIntUtil.notMember(X, L)) { fdEnu(Y, L) &\& fdNe(Y, X) } <=> { true } ne4; } goal X_123_X_456 { variable java.lang.Integer X; fdEnu(X, new nl(1, new nl(2, new nl(3)))) && fdEnu(X, new nl(4, new nl(5, new nl(6)))) }//end of X_123_X_456 goal X_123_X_ne_3 { variable java.lang.Integer X; fdEnu(X, new nl(1, new nl(2, new nl(3)))) && fdNe(X, 3) }//end of X_123_X_ne_3 goal le_X_Y { variable java.lang.Integer X, Y; fdEnu(X, new nl(2, new nl(3))) && fdEnu(Y, new nl(1, new nl(2))) && fdLe(X, Y) }//end of le_X_Y }