책보다가 나온 흔한 인공지능 문제 중 노가다 알고리즘 일반버전 만들고 떡실신 ㅋ


늬들이 두려워하는 재귀가 있다 ㅋㅋㅋㅋ


%

%    D O N A L D

%  + G E R A L D

%   -------------

%    R O B E R T

%


assign(_, []).

assign(Digs, [D | Vars]) :-

    select(D, Digs, Digs1),

    assign(Digs1, Vars).


compute_crypt([], 0).

compute_crypt([FirstVar | RestVars], Answer) :-

    length(RestVars, Len),

    compute_crypt(RestVars, Answer1),

    Answer is FirstVar * 10 ** Len + Answer1.


uniq_list(Appended, Uniq) :-

    sort(Appended, Uniq).


cryptarithmatic(Vars, ExpVars1, ExpVars2, ResultVars) :-

    assign([0,1,2,3,4,5,6,7,8,9], Vars),

    compute_crypt(ExpVars1, Exp1),

    compute_crypt(ExpVars2, Exp2),

    compute_crypt(ResultVars, Result),

    Exp1 + Exp2 =:= Result.





?- L1=[D, O, N, A, L, D], L2 = [G, E, R, A, L, D], L3 = [R, O, B, E, R, T], append([L1, L2, L3], Appended), uniq_list(Appended, Uniq), cryptarithmatic(Uniq, L1, L2, L3).

L1 = [5, 2, 6, 4, 8, 5],

D = 5,

O = 2,

N = 6,

A = 4,

L = 8,

L2 = [1, 9, 7, 4, 8, 5],

G = 1,

E = 9,

R = 7,

L3 = [7, 2, 3, 9, 7, 0],

B = 3,

T = 0,

Appended = [5, 2, 6, 4, 8, 5, 1, 9, 7|...],

Uniq = [5, 2, 6, 4, 8, 1, 9, 7, 3|...] 


?- L1=[S, E, N, D], L2 = [M, O, R, E], L3 = [M, O, N, E, Y], append([L1, L2, L3], Appended), uniq_list(Appended, Uniq), cryptarithmatic(Uniq, L1, L2, L3).


L1 = [2, 8, 1, 7],

S = 2,

E = 8,

N = 1,

D = 7,

L2 = [0, 3, 6, 8],

M = 0,

O = 3,

R = 6,

L3 = [0, 3, 1, 8, 5],

Y = 5,

Appended = [2, 8, 1, 7, 0, 3, 6, 8, 0|...],

Uniq = [2, 8, 1, 7, 0, 3, 6, 5] 

?-