이 퍼즐 프로그램에 대해 올바른 양의 솔루션을 인쇄하는 데 문제가 있습니다. 올바른 퍼즐을 인쇄하지만 필요한 솔루션의 양은 적절하지 않습니다.프롤로그 순열 색상 올바른 조합 수 오류
여기에 각 상황이하는 작업은 다음과 같습니다
퍼즐 1 - 당신은 5 개 가지 색상 유무 : 없음 같은 색이 서로 인접하지 않을 수 2 파란색, 2 녹색 1 노란색 합니다.
퍼즐 2 - 빨강, 파랑, 검정의 6 가지 색이 있습니다. 행에 검은 색이 2 개까지만 있습니다.
퍼즐 3 -
8 개 개의 색상이 3 개 그린, 2 백인, 2 개 빨간색과 한 검은 색. 흰색은 결코 A 또는 H가 아닙니다. 위치 D와 H 모두 동일한 색상이 있습니다. A와 G의 색상은 서로 다른 색상이어야합니다. 붉은 색은 결코 F 나 G에 없습니다. 녹색은 결코 B 나 C에 없습니다. 모든 붉은 색의 왼쪽에 녹색이 있습니다.
% a program that find solutions for each of the following colored ball problems with different sets of constraints.
% to run, type either
% sit1, sit2 or sit3.
% select an element for use in permutation test
%
% If the element is the head of the list, then it is in the list, and the tail is left
selectE(Element, [Element|Tail], Tail).
% If the two lists have the same head, check for more elements in the rest of the lists
selectE(Element, [Head|Tail1], [Head|Tail2]) :-
selectE(Element, Tail1, Tail2).
% generate permutations
%
% The empty list is a permutation of itself
permutationQ([],[]).
% List1 is a permutation of List2 if each element occurs in both lists
% the same number of times
permutationQ(List, [Head|Tail]) :- selectE(Head, List, Rest),
permutationQ(Rest, Tail).
%
% There are 5 colors - 2 blues, 2 greens, 1 yellow
%
sit1 :- permutationQ([green,green,blue,blue,yellow],[A,B,C,D,E]),
\+ A=B, \+ B=C, \+ C=D, \+ D=E,
printout([A,B,C,D,E]). % print any solution you find
% print solutions of sit1
printout([A,B,C,D,E]) :-
nl,
write('The order of colors from top to bottom is: '), nl,
write(A),nl,
write(B),nl,
write(C),nl,
write(D),nl,
write(E),nl.
% There are 6 colors - 1 red, 1 blue, 4 blacks,
%
sit2 :- permutationQ([black,black,black,black,red,blue],[A,B,C,D,E,F]),
((A==red -> D==blue);
(A==blue -> D==red);
(B==red -> E==blue);
(B==blue -> E==red);
(C==red -> F==blue);
(C==blue -> F==red);
(D==red -> C==blue);
(D==blue -> C==red)),
printout2([A,B,C,D,E,F]). % print any solution you find
% print solutions of sit2
printout2([A,B,C,D,E,F]) :-
nl,
write('The order of colors from top to bottom is: '), nl,
write(A),nl,
write(B),nl,
write(C),nl,
write(D),nl,
write(E),nl,
write(F),nl.
% There are 8 colors - 3 greens, 2 whites, 2 reds, 1 black
sit3 :- permutationQ([black,white,white,red,red,green,green,green],[A,B,C,D,E,F,G,H]),
% The colors in B and C are not green.
\+ B=green,
\+ C=green,
% The colors in E and F are not green because the colors in F and G are not red.
\+ E=green,
\+ F=green,
% Since red can't be in H, green can't be in G.
\+ G=green,
% The colors in D and H are the same color.
D=H,
% The colors in A and G are of different colors.
\+ A=G,
% The color in F and G are not red.
\+ F=red,
\+ G=red,
% Red can't be in A because there isn't any other position on the left for the green.
\+ A=red,
% The colors in C and D are not red because the colors in B and C are not green.
\+ C=red,
\+ D=red,
% Whites are neither A nor H.
\+ A=white,
\+ H=white,
% White is not on D because white can't be on H.
\+ D=white,
printout3([A,B,C,D,E,F,G,H]). % print any solution you find
% print solutions of sit3
printout3([A,B,C,D,E,F,G,H]) :-
nl,
write('The order of colors from top to bottom is: '), nl,
write(A),nl,
write(B),nl,
write(C),nl,
write(D),nl,
write(E),nl,
write(F),nl,
write(G),nl,
write(H),nl.
"적절한 해결책이 필요하지 않다"는 것은 무엇을 의미합니까? 너무 많습니다 (반복)? 너무 적습니다 (일부 누락)? 반복되는 솔루션 인 경우 순열이 고유하지 않기 때문입니다 (목록에서 고유하지 않은 요소가 치환됨에 따라). – lurker
너무 많은 솔루션 반복. – user3555214