2012-02-26 3 views
3

В прологе мы можем получить решение для отображения красящего задачи следующим образом:Подсчет количества карт красителей прологе

different(red, green). different(red, blue). 
different(green, red). different(green, blue). 
different(blue, red). different(blue, green). 

coloring(Alabama, Mississippi, Georgia, Tennessee, Florida) :- 
    different(Mississippi, Tennessee), 
    different(Mississippi, Alabama), 
    different(Alabama, Tennessee), 
    different(Alabama, Mississippi), 
    different(Alabama, Georgia), 
    different(Alabama, Florida), 
    different(Georgia, Florida), 
    different(Georgia, Tennessee). 

?- coloring(Alabama, Mississippi, Georgia, Tennessee, Florida). 
Alabama = blue 
Florida = green 
Georgia = red 
Mississippi = red 
Tennessee = green 

Можно ли подсчитать общее число возможных окрасок карты?

ответ

1

раствора Anders, пожалуйста, обратите внимание, что слово «окраска» должно быть в нижнем регистре, который даст правильный ответ - 6 решений.

aggregate_all(count, coloring(Alabama, Mississippi, Georgia, Tennessee, Florida), Count). 
Count = 6. 
+0

О, хорошо. Я не сумасшедший. Я только что опубликовал комментарий, прежде чем увидеть этот ответ. –

0

Да. findall/3 будет перечислять все решения, и (по крайней мере, в SWI-Prolog) aggregate_all/3 может быть использован для выполнения счета:

?- aggregate_all(count, Coloring(A,M,G,T,F), Num). 
Num = 4711. 
+0

Получение 4711 не имеет смысла. Возможны только 5^3 возможных комбинаций, включая незаконные комбинации. Оба компьютера, на которых я запускал это, говорят, что 6 - это ответ. –

+0

4711 был просто предназначен как пример вывода из aggregate_all, у меня не было прологового интерпретатора, доступного для проверки вашего кода. :-) –

Смежные вопросы