|
|
pl:prolog:pllib:cryptoarithmetic_puzzle_2 [2019/06/27 15:50] |
pl:prolog:pllib:cryptoarithmetic_puzzle_2 [2019/06/27 15:50] (aktualna) |
| ====== Cryptoarithmetic puzzle 2 ====== |
| {{tag>puzzle}} |
| ===== Description ===== |
| A program for cryptoarithmetic puzzles. |
| |
| **Source**: PROLOG programming for artificial intelligence, 3rd Edition, Harlow, 2001, ISBN 0-201-40375-7. |
| ===== Download ===== |
| Program source code: {{cryptoarithmetic_puzzle_2.pl}} |
| ===== Listing ===== |
| <code prolog> |
| % Figure 7.2 A program for cryptoarithmetic puzzles. |
| |
| |
| % Solving cryptarithmetic puzzles |
| |
| sum(N1, N2, N) :- % Numbers represented as lists of digits |
| sum1( N1, N2, N, |
| 0, 0, % Carries from right and to left both 0 |
| [0,1,2,3,4,5,6,7,8,9], _). % All digits available |
| |
| sum1( [], [], [], C, C, Digits, Digits). |
| |
| sum1( [D1|N1], [D2|N2], [D|N], C1, C, Digs1, Digs) :- |
| sum1( N1, N2, N, C1, C2, Digs1, Digs2), |
| digitsum( D1, D2, C2, D, C, Digs2, Digs). |
| |
| digitsum( D1, D2, C1, D, C, Digs1, Digs) :- |
| del_var( D1, Digs1, Digs2), % Select an available digit for D1 |
| del_var( D2, Digs2, Digs3), % Select an available digit for D2 |
| del_var( D, Digs3, Digs), % Select an available digit for D |
| S is D1 + D2 + C1, |
| D is S mod 10, % Reminder |
| C is S // 10. % Integer division |
| |
| del_var( A, L, L) :- |
| nonvar(A), !. % A already instantiated |
| |
| del_var( A, [A|L], L). |
| |
| del_var( A, [B|L], [B|L1]) :- |
| del_var(A, L, L1). |
| |
| |
| % Some puzzles |
| |
| puzzle1( [D,O,N,A,L,D], |
| [G,E,R,A,L,D], |
| [R,O,B,E,R,T] ). |
| |
| puzzle2( [0,S,E,N,D], |
| [0,M,O,R,E], |
| [M,O,N,E,Y] ). |
| </code> |
| ===== Comments ===== |
| |