This is the reified version of the in/2 constraint. This means that the boolean variable Bool reflects the truth of the relation X in Set. If Bool is 1, then in(X,Set,Bool) is the same as X in Set. If Bool is 0, then in(X,Set,Bool) is the same as X notin Set. Otherwise, Bool will be bound to 0 or 1 when X in Set is known to be false or true, respectively. The latter is only guaranteed to be detected after X has become instantiated.
Note that if one wants to have booleans corresponding to all or most of the set domain elements, it will be more efficient to use the membership_booleans/2 constraint in place of many in/3 constraints.
?- intset(S, 1, 9), in(E, S, B). E = E{[-10000000 .. 10000000]} S = S{([] .. [1, 2, 3, 4, 5, 6, 7, 8, 9]) : C{[0 .. 9]}} B = B{[0, 1]} There is 1 delayed goal. ?- intset(S, 1, 9), in(E, S, B), B = 1. E = E{[1 .. 9]} S = S{([] .. [1, 2, 3, 4, 5, 6, 7, 8, 9]) : C{[0 .. 9]}} B = 1 There is 1 delayed goal. ?- intset(S, 1, 9), in(E, S, B), E = 3, B = 1. S = S{[3] \/ ([] .. [1, 2, 4, 5, 6, 7, 8, 9]) : C{[1 .. 9]}} E = 3 B = 1 ?- intset(S, 1, 9), in(E, S, B), E = 3, B = 0. S = S{([] .. [1, 2, 4, 5, 6, 7, 8, 9]) : C{[0 .. 8]}} E = 3 B = 0 Yes (0.00s cpu) ?- intset(S, 1, 9), in(E, S, B), E = 3, S includes [2, 3, 4]. B = 1 E = 3 S = S{[2, 3, 4] \/ ([] .. [1, 5, 6, 7, 8, 9]) : C{[3 .. 9]}} There is 1 delayed goal. ?- intset(S, 1, 9), in(E, S, B), E = 3, S disjoint [2, 3, 4]. B = 0 E = 3 S = S{([] .. [1, 5, 6, 7, 8, 9]) : C{[0 .. 6]}} There is 1 delayed goal. ?- in(3, S, 1). instantiation fault