@Override
	public boolean narrow(Variable<IntegerDomain> variable) {
		// Narrow the domain of the argument variable to include (at most) the intervals satisfying:
		//   [when variable == a]: ci - bj for each interval ci in c and bj in b,
		//   [when variable == b]: ci - aj for each interval ci in c and aj in a,
		//   [when variable == c]: ai + bj for each interval ai in a and bj in b.

		List<Interval> intervals = new ArrayList<>();

		if (variable == a) {
			for (Interval ci : c.getDomain()) {
				for (Interval bj : b.getDomain()) {
					addDifference(intervals, ci, bj);
				}
			}
		} else if (variable == b) {
			for (Interval ci : c.getDomain()) {
				for (Interval aj : a.getDomain()) {
					addDifference(intervals, ci, aj);
				}
			}
		} else {
			for (Interval ai : a.getDomain()) {
				for (Interval bj : b.getDomain()) {
					addSum(intervals, ai, bj);
				}
			}
		}

		return variable.trySetValue(variable.getDomain().retain(new IntegerDomain(intervals)));
	}