Skip to main content David Edelstein's Blog

Prolog - Can you solve this 2nd grade problem that has baffled adults?

Published: 2024-05-08
dave@edelsteinautomotive.com
David Edelstein

The problem:

The solution:

:- use_module(library(clpfd)).
:- use_module(library(lists)).

all_values([6,6,2,2,8,8, 0, 0, 0]).
val(X) :- all_values(AV), member(X, AV).

solve(T1,T2,T3,Result) :-
    all_values(ALLVALUES),
    POSSIBLE_VALS= [X1, X2, X3, X4, X5, X6, X7, X8, X9],
    permutation(ALLVALUES, POSSIBLE_VALS),
    T1 #= X1,
	T1 #< 10, 
    T2 #= 10*X2 + X3, 
    T2 #< 100, T2 #>= 10,
    T3 #= 100*X4 + 10*X5 + X6, 
    T3 #< 1000, T3 #>=100,
    Result #= 100*X7 + 10*X8 + X9, 
    Result #= T1+T2+T3.

And to query:

solve(T1, T2, T3, Result), 
format('    ~w~n   ~w~n+ ~w~n-----~n  ~w~n', [T1,T2,T3,Result]).

Giving lots of results!

    6
   20
+ 800
-----
  826

Also, swish is great

UPDATE from reddit thread. Suggestion is to use global_cardinality. I think this uses clpfd better. The solution above might not even have needed clpfd as it enumerated all possibilities anyways.

In below block, could uncomment the % depending on if you think you may have leading 0’s. I think leading 0’s are not allowed. It would be untrue to say ‘2-digit addend’ but the number be ‘06’. But possibly ‘1-digit addend’ of 0 would be legit. Need some math lawyers here 😁

solve2(T1, T2, T3, Result) :-
    Vs = [V1, V2, V3, V4, V5, V6, V7, V8, V9], 
    global_cardinality(Vs, [0-3,2-2,6-2,8-2]), 
    T1 #= V1,
    %T1 #> 0,
    T2 #= 10*V2 + V3,
    %T2 #< 100, T2 #>= 10,
    T3 #= 100*V4 + 10*V5 + V6,
    %T3 #< 1000, T3 #>=100,
    Result #= 100*V7 + 10*V8 + V9,
    T1 + T2 + T3 #= Result,
    label([T1, T2, T3, Result]).