I hope there are better ways but...
You can implement "one number is correct and well placed" as follows
oneRightPlace(X, Y, Z, X, S2, S3) :-
\+ member(Y, [S2, S3]),
\+ member(Z, [S2, S3]).
oneRightPlace(X, Y, Z, S1, Y, S3) :-
\+ member(X, [S1, S3]),
\+ member(Z, [S1, S3]).
oneRightPlace(X, Y, Z, S1, S2, Z) :-
\+ member(X, [S1, S2]),
\+ member(Y, [S1, S2]).
For "one number is correct but wrong placed, you can use
oneWrongPlace(X, Y, Z, S1, S2, S3) :-
member(X, [S2, S3]),
\+ member(Y, [S1, S2, S3]),
\+ member(Z, [S1, S2, S3]).
oneWrongPlace(X, Y, Z, S1, S2, S3) :-
member(Y, [S1, S3]),
\+ member(X, [S1, S2, S3]),
\+ member(Z, [S1, S2, S3]).
oneWrongPlace(X, Y, Z, S1, S2, S3) :-
member(Z, [S1, S2]),
\+ member(X, [S1, S2, S3]),
\+ member(Y, [S1, S2, S3]).
For "two number are correct but wrong placed", you can write
twoWrongPlace(X, Y, Z, S1, S2, S3) :-
member(X, [S2, S3]),
member(Y, [S1, S3]),
\+ member(Z, [S1, S2, S3]).
twoWrongPlace(X, Y, Z, S1, S2, S3) :-
member(X, [S2, S3]),
member(Z, [S1, S2]),
\+ member(Y, [S1, S2, S3]).
twoWrongPlace(X, Y, Z, S1, S2, S3) :-
member(Y, [S1, S3]),
member(Z, [S1, S2]),
\+ member(X, [S1, S2, S3]).
And, for "nothing is correct", become simply
zeroPlace(X, Y, Z, S1, S2, S3) :-
\+ member(X, [S1, S2, S3]),
\+ member(Y, [S1, S2, S3]),
\+ member(Z, [S1, S2, S3]).
Now you can put all togheter and write
member(S1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
member(S2, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
member(S3, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
oneRightPlace(6, 8, 2, S1, S2, S3),
oneWrongPlace(6, 1, 4, S1, S2, S3),
twoWrongPlace(2, 0, 6, S1, S2, S3),
zeroPlace(7, 3, 8, S1, S2, S3),
oneWrongPlace(7, 8, 0, S1, S2, S3).
obtaining (in S1
, S2
and S3
) the right solution.
The preceding examples are written without the use of clp(fd), that I don't know well but that (I suppose) can semplify a lot.