Я сейчас пытаюсь решить эту проблему.
Генератор generate/2
должен создать все допустимые комбинации для окна.
generate(Gs,Cs) :-
colorset(Gs,Cs),
valid(Gs,Cs).
?- genere([b,c,d,i,j],C).
C = [red , yellow, red , yellow, blue ] ;
C = [red , yellow, red , blue , yellow] ;
C = [red , yellow, blue , yellow, red ] ;
C = [red , yellow, blue , blue , red ] ;
C = [red , yellow, blue , blue , yellow] ;
C = [red , blue , red , yellow, blue ] ;
C = [red , blue , red , blue , yellow] ;
C = [red , blue , yellow, yellow, red ] ;
C = [red , blue , yellow, yellow, blue ] ;
C = [red , blue , yellow, blue , red ] ;
C = [yellow, red , yellow, red , blue ] ;
C = [yellow, red , yellow, blue , red ] ;
C = [yellow, red , blue , red , yellow] ;
C = [yellow, red , blue , blue , red ] ;
C = [yellow, red , blue , blue , yellow] ;
C = [yellow, blue , red , red , yellow] ;
C = [yellow, blue , red , red , blue ] ;
C = [yellow, blue , red , blue , yellow] ;
C = [yellow, blue , yellow, red , blue ] ;
C = [yellow, blue , yellow, blue , red ] ;
C = [blue , red , yellow, red , blue ] ;
C = [blue , red , yellow, yellow, red ] ;
C = [blue , red , yellow, yellow, blue ] ;
C = [blue , red , blue , red , yellow] ;
C = [blue , red , blue , yellow, red ] ;
C = [blue , yellow, red , red , yellow] ;
C = [blue , yellow, red , red , blue ] ;
C = [blue , yellow, red , yellow, blue ] ;
C = [blue , yellow, blue , red , yellow] ;
C = [blue , yellow, blue , yellow, red ] ;
false.
Мне нужен предикат valid/2
.
Учитывая набор цветов предиката, который я определил следующим образом.
colorset([],[]).
colorset([_|Nodes], [C|Color]):- color(C), colorset(Nodes, Colors).
Сейчас я пытаюсь выяснить, есть ли способ сначала создать предикат colorset, а затем проверить, имеют ли смежные узлы одинаковый цвет, но я не уверен, возможно ли это в Prolog?
Какая еще альтернатива?