2016-09-05 4 views

ответ

0

Пролог может это сделать! (После того, как все это Stackoverflow и вы отметили свой вопрос )

solution(O, N, E, T, W, F, U, R) :- 
    /* All different */ 
    select(O, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], L1), 
    select(N, L1, L2), 
    select(E, L2, L3), 
    select(T, L3, L4), 
    select(W, L4, L5), 
    select(F, L5, L6), 
    select(U, L6, L7), 
    member(R, L7), 

    /* Constraints */ 
    FOUR is F * 1000 + O * 100 + U * 10 + R, 
    ONE is O * 100 + N * 10 + E, 
    TWO is T * 100 + W * 10 + O, 

    FOUR is ONE + ONE + TWO. 

Общая идея заключается в том, чтобы выбрать все переменные в первом, а затем проверить условие головоломки.

Теперь

?- solution(O,N,E,T,W,F,U,R). 

напечатает первое найденное решение. С:

?- aggregate_all(count, (solution(O,N,E,T,W,F,U,R)), Count). 

Вы можете видеть, что есть 173 различных решений.

Отслеживание выполнения запроса позволяет вам видеть все цели, которые выполняются как часть запроса, последовательно, вместе с тем, успешно ли они выполняются (это также позволяет вам видеть, какие шаги происходят, когда Prolog backtracks):

?- trace, solution(O,N,E,T,W,F,U,R). 

(вы можете использовать платформу online SWI-Prolog играть с примером).


Традиционно (в verbal arithmetic):

каждая буква должна представлять собой другую цифру, и (как и в обычной арифметической нотации) ведущая цифра мульти-значное число в не должен быть равен нулю. Хорошая головоломка должна иметь уникальное решение, и буквы должны составлять фразу.

Вы можете заставить «ведущей цифры не должен быть равен нулю» -правило добавив:

not(O = 0), not(T = 0), not(F = 0). 

в любом случае задача имеет несколько решений.