/* Prime multiplication in Picat. Martin Gardner: """ Find primes (2, 3, 5 or 7) for each P such that this multiplication is correct: PPP * PP --------- PPPP PPPP --------- PPPPP """ Representation of the digits: ABC * DE --------- FGHI JKLM_ --------- NOPQR This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import cp. main => time2(go). go => Primes = [2,3,5,7], ABC = new_dvar(), ABC_A = new_list(3), ABC_A :: Primes, DE = new_dvar(), DE_A = new_list(2), DE_A :: Primes, FGHI = new_dvar(), FGHI_A = new_list(4), FGHI_A :: Primes, JKLM = new_dvar(), JKLM_A = new_list(5), JKLM_A :: [0] ++ Primes, NOPQR = new_dvar(), NOPQR_A = new_list(5), NOPQR_A :: Primes, % preparation to_num(ABC_A,10, ABC), to_num(DE_A,10, DE), to_num(FGHI_A, 10, FGHI), to_num(JKLM_A, 10, JKLM ), to_num(NOPQR_A, 10, NOPQR), % the equation ABC * DE_A[2] #= FGHI, ABC * DE_A[1] #= JKLM, FGHI + 10*JKLM #= NOPQR, % not needed ABC * DE #= NOPQR, %% To see the domains % println(abc=ABC), % println(de=DE), % println(fghi=FGHI), % println(jklm=JKLM), % println(nopqr=NOPQR), Vars = ABC_A ++ DE_A ++ FGHI_A ++ JKLM_A ++ NOPQR_A ++ [ABC,DE,FGHI,JKLM,NOPQR], solve([ff],Vars), println(abc=ABC), println(de=DE), println(fghi=FGHI), println(jklm=JKLM), println(nopqr=NOPQR), println("\nEquation:"), printf(" %d\n", ABC), printf(" * %d\n", DE), println("------"), printf(" %d\n", FGHI), printf(" +%d\n", JKLM), println("------"), printf(" %d\n", NOPQR), nl. % % converts a number Num to/from a list of integer List given a base Base % to_num(List, Base, Num) => Len = length(List), Num #= sum([List[I]*Base**(Len-I) : I in 1..Len]).