| |
| % Cryptomultiplication: |
| % Find the unique answer to: |
| % OEE |
| % EE |
| % --- |
| % EOEE |
| % EOE |
| % ---- |
| % OOEE |
| % |
| % where E=even, O=odd. |
| % This program generalizes easily to any such problem. |
| % Written by Peter Van Roy |
| |
| main :- |
| odd(A), even(B), even(C), |
| even(E), |
| mult([C,B,A], E, [I,H,G,F|X]), |
| lefteven(F), odd(G), even(H), even(I), zero(X), |
| lefteven(D), |
| mult([C,B,A], D, [L,K,J|Y]), |
| lefteven(J), odd(K), even(L), zero(Y), |
| sum([I,H,G,F], [0,L,K,J], [P,O,N,M|Z]), |
| odd(M), odd(N), even(O), even(P), zero(Z). |
| % write(' '), write(A), write(B), write(C), nl, |
| % write(' '), write(D), write(E), nl, |
| % write(F), write(G), write(H), write(I), nl, |
| % write(J), write(K), write(L), nl, |
| % write(M), write(N), write(O), write(P), nl. |
| |
| % Addition of two numbers |
| sum(AL, BL, CL) :- sum(AL, BL, 0, CL). |
| |
| sum([A|AL], [B|BL], Carry, [C|CL]) :- !, |
| X is (A+B+Carry), |
| C is X mod 10, |
| NewCarry is X // 10, |
| sum(AL, BL, NewCarry, CL). |
| sum([], BL, 0, BL) :- !. |
| sum(AL, [], 0, AL) :- !. |
| sum([], [B|BL], Carry, [C|CL]) :- !, |
| X is B+Carry, |
| NewCarry is X // 10, |
| C is X mod 10, |
| sum([], BL, NewCarry, CL). |
| sum([A|AL], [], Carry, [C|CL]) :- !, |
| X is A+Carry, |
| NewCarry is X // 10, |
| C is X mod 10, |
| sum([], AL, NewCarry, CL). |
| sum([], [], Carry, [Carry]). |
| |
| % Multiplication |
| mult(AL, D, BL) :- mult(AL, D, 0, BL). |
| |
| mult([A|AL], D, Carry, [B|BL] ) :- |
| X is A*D+Carry, |
| B is X mod 10, |
| NewCarry is X // 10, |
| mult(AL, D, NewCarry, BL). |
| mult([], _, Carry, [C,Cend]) :- |
| C is Carry mod 10, |
| Cend is Carry // 10. |
| |
| zero([]). |
| zero([0|L]) :- zero(L). |
| |
| odd(1). |
| odd(3). |
| odd(5). |
| odd(7). |
| odd(9). |
| |
| even(0). |
| even(2). |
| even(4). |
| even(6). |
| even(8). |
| |
| lefteven(2). |
| lefteven(4). |
| lefteven(6). |
| lefteven(8). |