% FILE: crypto_234_short.pro of crypto_xps
% TYPE: Prolog soource
% LINE: Essential Crypto problem solver -- the short way
% DATE: 2019

%-----------------------------------------------------------------
% LOAD FILES

:- consult('../combinatorial_sets/combinatorial_sets.pro').
:- consult('crypto_testers.pro').

% ----------------------------------------------------------------
% ORDER 2 CRYPTO PROBLEM SOLVER

crypto(N1,N2,Goal,ex(N1,+,N2)) :- Goal is ( N1 + N2 ).
crypto(N1,N2,Goal,ex(N1,*,N2)) :- Goal is ( N1 * N2 ).
crypto(N1,N2,Goal,ex(N1,-,N2)) :- Goal is ( N1 - N2 ).
crypto(N1,N2,Goal,ex(N2,-,N1)) :- Goal is ( N2 - N1 ).
crypto(N1,N2,Goal,ex(N1,/,N2)) :- nonzero(N2), Goal is ( N1 / N2 ).
crypto(N1,N2,Goal,ex(N2,/,N1)) :- nonzero(N1), Goal is ( N2 / N1 ).

nonzero(N) :- N > 0.
nonzero(N) :- N < 0.

% -----------------------------------------------------------------
% ORDER 3 CRYPTO PROBLEM SOLVER

crypto( N1, N2, N3, G ,Expr ) :-
comb( set(N1,N2,N3), comb(A,B), extras(C) ),
crypto( A, B, SG, SGE ),
crypto( C, SG, G, UGE ),
substitute( SGE, SG, UGE, Expr ).

% -----------------------------------------------------------------
% ORDER 4 CRYPTO PROBLEM SOLVER

crypto( N1, N2, N3, N4, G ,Expr ) :-
comb( set(N1,N2,N3,N4), comb(A,B), extras(C,D) ),
crypto( A, B, SG, SGE ),
crypto( C, D, SG, G, UGE ),
substitute( SGE, SG, UGE, Expr ).

% -----------------------------------------------------------------
%ORDER 5 CRYPTO PROBLEM SOLVER

crypto(N1,N2,N3,N4,N5,G,Expr):-
	comb(set(N1,N2,N3,N4,N5), comb(A,B), extras(C,D,E)),
	crypto(A,B,SG,SGE),
	crypto(C,D,E,SG,G,UGE ),
	substitute(SGE,SG,UGE,Expr).

%-----------------------------------------------------
% SUBSTITUTION CODE

substitute( New, Old, ex( Old, O, Z ), ex( New, O, Z ) ).
substitute( New, Old, ex( X, O, Old ), ex( X, O, New ) ).
substitute( New, Old, ex( X, O, Z ), ex( Y, O, Z ) ) :-
substitute( New, Old, X, Y ).
substitute( New, Old, ex( X, O, Z ), ex( X, O, Y ) ) :-
substitute( New, Old, Z, Y ).




