DEMO
?- consult('crypto.pro').
% combosets.pro compiled 0.00 sec, 7,584 bytes
% crypto.pro compiled 0.00 sec, 10,688 bytes
Yes
?- crypto(1,2,3,A).
A = ex(1, +, 2) ;
No
?- crypto(1,2,3,6,A).
A = ex(ex(1, +, 2), +, 3) ;
A = ex(3, +, ex(1, +, 2)) ;
A = ex(3, *, ex(1, *, 2)) ;
A = ex(3, *, ex(2, /, 1)) ;
A = ex(1, +, ex(2, +, 3)) ;
A = ex(1, *, ex(2, *, 3)) ;
A = ex(ex(2, *, 3), /, 1) ;
A = ex(2, +, ex(1, +, 3)) ;
A = ex(2, *, ex(1, *, 3)) ;
A = ex(2, *, ex(3, /, 1)) ;
No
?- crypto(1,2,3,6,12,A).
A = ex(ex(1, +, 2), +, ex(3, +, 6)) ;
A = ex(3, +, ex(ex(1, +, 2), +, 6)) ;
A = ex(ex(1, +, 2), +, ex(6, +, 3)) ;
A = ex(3, +, ex(6, +, ex(1, +, 2))) ;
A = ex(ex(ex(1, +, 2), +, 3), +, 6) ;
A = ex(ex(3, +, ex(1, +, 2)), +, 6) ;
A = ex(6, +, ex(ex(1, +, 2), +, 3)) ;
A = ex(6, +, ex(3, +, ex(1, +, 2))) ;
A = ex(3, *, ex(6, -, ex(1, *, 2))) ;
A = ex(ex(3, *, ex(1, *, 2)), +, 6) ;
A = ex(6, +, ex(3, *, ex(1, *, 2))) ;
A = ex(6, *, ex(3, +, ex(1, -, 2))) ;
A = ex(6, *, ex(3, -, ex(2, -, 1))) ;
A = ex(3, *, ex(6, -, ex(2, /, 1))) ;
A = ex(ex(3, *, ex(2, /, 1)), +, 6) ;
A = ex(6, +, ex(3, *, ex(2, /, 1))) ;
A = ex(ex(1, +, 3), +, ex(2, +, 6)) ;
A = ex(ex(1, +, 3), *, ex(6, /, 2)) ;
A = ex(2, +, ex(6, +, ex(1, +, 3))) ;
A = ex(ex(6, *, ex(1, +, 3)), /, 2) ;
A = ex(ex(2, +, ex(1, +, 3)), +, 6) ;
A = ex(6, +, ex(2, +, ex(1, +, 3))) ;
A = ex(6, *, ex(ex(1, +, 3), -, 2)) ;
A = ex(6, *, ex(ex(1, +, 3), /, 2)) ;
A = ex(ex(1, *, 3), *, ex(6, -, 2)) ;
A = ex(ex(2, *, ex(1, *, 3)), +, 6) ;
A = ex(6, +, ex(2, *, ex(1, *, 3))) ;
A = ex(ex(3, /, 1), *, ex(6, -, 2)) ;
A = ex(ex(2, *, ex(3, /, 1)), +, 6) ;
A = ex(6, +, ex(2, *, ex(3, /, 1))) ;
A = ex(ex(1, +, 6), +, ex(2, +, 3)) ;
A = ex(2, +, ex(3, +, ex(1, +, 6))) ;
A = ex(3, +, ex(2, +, ex(1, +, 6))) ;
A = ex(ex(2, *, 3), +, ex(1, *, 6)) ;
A = ex(ex(1, *, 6), +, ex(2, *, 3)) ;
A = ex(3, *, ex(ex(1, *, 6), -, 2)) ;
A = ex(ex(2, *, 3), +, ex(6, /, 1)) ;
A = ex(ex(6, /, 1), +, ex(2, *, 3)) ;
A = ex(3, *, ex(ex(6, /, 1), -, 2)) ;
A = ex(ex(2, +, 3), +, ex(1, +, 6)) ;
A = ex(1, +, ex(6, +, ex(2, +, 3))) ;
A = ex(ex(1, +, ex(2, +, 3)), +, 6) ;
A = ex(6, +, ex(1, +, ex(2, +, 3))) ;
A = ex(ex(1, *, 6), +, ex(2, *, 3)) ;
A = ex(ex(1, *, ex(2, *, 3)), +, 6) ;
A = ex(ex(2, *, 3), +, ex(1, *, 6)) ;
A = ex(6, +, ex(1, *, ex(2, *, 3))) ;
A = ex(ex(6, /, 1), +, ex(2, *, 3)) ;
A = ex(ex(ex(2, *, 3), /, 1), +, 6) ;
A = ex(ex(2, *, 3), +, ex(6, /, 1)) ;
A = ex(6, +, ex(ex(2, *, 3), /, 1)) ;
A = ex(1, *, ex(ex(2, *, 3), +, 6)) ;
A = ex(1, *, ex(6, +, ex(2, *, 3))) ;
A = ex(ex(ex(2, *, 3), +, 6), /, 1) ;
A = ex(ex(6, +, ex(2, *, 3)), /, 1) ;
A = ex(ex(1, *, 6), +, ex(2, *, 3)) ;
A = ex(ex(1, *, ex(2, *, 3)), +, 6) ;
A = ex(ex(2, *, 3), +, ex(1, *, 6)) ;
A = ex(6, +, ex(1, *, ex(2, *, 3))) ;
A = ex(ex(6, /, 1), +, ex(2, *, 3)) ;
A = ex(ex(ex(2, *, 3), /, 1), +, 6) ;
A = ex(ex(2, *, 3), +, ex(6, /, 1)) ;
A = ex(6, +, ex(ex(2, *, 3), /, 1)) ;
A = ex(6, *, ex(1, -, ex(2, -, 3))) ;
A = ex(6, *, ex(ex(3, -, 2), +, 1)) ;
A = ex(6, *, ex(1, +, ex(3, -, 2))) ;
A = ex(ex(2, +, 6), +, ex(1, +, 3)) ;
A = ex(1, +, ex(3, +, ex(2, +, 6))) ;
A = ex(3, +, ex(1, +, ex(2, +, 6))) ;
A = ex(ex(6, -, 2), *, ex(1, *, 3)) ;
A = ex(ex(6, -, 2), *, ex(3, /, 1)) ;
A = ex(1, *, ex(3, *, ex(6, -, 2))) ;
A = ex(ex(3, *, ex(6, -, 2)), /, 1)
Yes
?- halt.
