Как использовать список в другом предикате в Прологе? - PullRequest
0 голосов
/ 23 марта 2020

Я сейчас пытаюсь решить эту проблему.

Генератор 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?

Какая еще альтернатива?

...