2016-09-05 3 views

답변

0

프롤로그가 그것을 할 수 있습니다 감사합니다 단계 프로세스 단계에서이 cryptarithmetic를 해결할 수 있습니다!

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 백 트랙으로 어떤 단계가 발생하는지 볼 수 있습니다)) :

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

(당신이 예제를 재생하기 위해 online SWI-Prolog 플랫폼을 사용할 수 있습니다). 전통적 (verbal arithmetic)에


:

각 문자 (통상 산술 표기법으로) 다른 디지트를 나타내고, 있어야 다중 자리 숫자의 선두 숫자 제로이어야한다. 좋은 퍼즐은 독특한 해결책을 가져야하며, 편지는 문구를 구성해야합니다.

당신은 - 규칙 추가 "제로가 아니어야 최고의 자리"를 강제 할 수 있습니다 :

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

어쨌든 문제는 여러 솔루션을 제공합니다.