我希望有更好的方法,但...
您可以實現「一個號碼是正確的,天時地利」如下
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]).
對於「一個數字是正確的但錯誤的地方,你可以使用
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]).
「兩個號碼是正確的,但錯置於」,你可以寫
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]).
而且,對於「什麼是正確的」,成爲簡單的
zeroPlace(X, Y, Z, S1, S2, S3) :-
\+ member(X, [S1, S2, S3]),
\+ member(Y, [S1, S2, S3]),
\+ member(Z, [S1, S2, S3]).
現在,你可以把所有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).
獲得(在S1
,S2
和S3
)正確的解決方案。
前面的例子是不使用clp(fd)編寫的,我不太清楚,但是(我想)可以使用很多semplify。
我會通過生成所有可能的解決方案,並通過一個應用事實一個不包括不正確的人做到這一點。 –
在你的嘗試中,你將列表'Hs'的長度設置爲1,這意味着它只有一個元素,但是然後檢查它是否有6個不同的唯一元素。這總會失敗。無論參數如何,'correct_and_place/4'都不會成功。 – lurker