%deps :- consult('../gv.pro'). :- consult('../combosets.pro'). %handout establishCryptoProblemParameters :- declare(lo,0), declare(hi,15). generateRandomCryptoNumber(R) :- valueOf(lo,Lo), valueOf(hi,Hi), Hip is Hi + 1, random(Lo,Hip,R). generateRandomCryptoProblem :- generateRandomCryptoNumber(N1), generateRandomCryptoNumber(N2), generateRandomCryptoNumber(N3), generateRandomCryptoNumber(N4), generateRandomCryptoNumber(N5), generateRandomCryptoNumber(G), addCryptoProblemToKnowledgeBase(N1,N2,N3,N4,N5,G). addCryptoProblemToKnowledgeBase(N1,N2,N3,N4,N5,G) :- retract(problem(_,_)), assert(problem(numbers(N1,N2,N3,N4,N5),goal(G))). addCryptoProblemToKnowledgeBase(N1,N2,N3,N4,N5,G) :- assert(problem(numbers(N1,N2,N3,N4,N5),goal(G))). displayProblem :- problem(numbers(N1,N2,N3,N4,N5),goal(G)), write('Problem: numbers = {'), write(N1), write(','), write(N2), write(','), write(N3), write(','), write(N4), write(','), write(N5), write('} and goal = '), write(G), nl. internalizeProblem :- problem(numbers(N1,N2,N3,N4,N5),goal(G)), eraseProblemBindings, eraseProblem, eraseSolution, assert(problem(numbers(N1,N2,N3,N4,N5),goal(G))), assert(binding(n1,N1)), assert(binding(n2,N2)), assert(binding(n3,N3)), assert(binding(n4,N4)), assert(binding(n5,N5)), assert(binding(g,G)). eraseProblem :- retract(problem(_,_)), fail. eraseProblem. eraseSolution :- retract(solution(_)), fail. eraseSolution. eraseProblemBindings :- retract(binding(n1,_)), retract(binding(n2,_)), retract(binding(n3,_)), retract(binding(n4,_)), retract(binding(n5,_)), retract(binding(g,_)), fail. eraseProblemBindings. solveProblemDecompositionally :- problem(numbers(N1,N2,N3,N4,N5),goal(G)), crypto(N1,N2,N3,N4,N5,G,Expression), assert(solution(Expression)). crypto(N1,N2,G,ex(N1,+,N2)) :- G is N1 + N2. crypto(N1,N2,G,ex(N1,*,N2)) :- G is N1 * N2. crypto(N1,N2,G,ex(N1,-,N2)) :- G is N1 - N2. crypto(N1,N2,G,ex(N2,-,N1)) :- G is N2 - N1. crypto(N1,N2,G,ex(N1,/,N2)) :- N2 > 0, G is N1 / N2. crypto(N1,N2,G,ex(N2,/,N1)) :- N1 > 0, G is N2 / N1. crypto(N1,N2,N3,G,K) :- combos(set(N1,N2,N3),combo(A1,A2),extra(A3)), crypto(A1,A2,AG,Aex), crypto(A3,AG,G,Bex), substitute(Aex,AG,Bex,K). crypto(N1,N2,N3,N4,G,K) :- combos(set(N1,N2,N3,N4),combo(A1,A2),extras(A3,A4)), crypto(A1,A2,A3,AG,Aex), crypto(A4,AG,G,Bex), substitute(Aex,AG,Bex,K). crypto(N1,N2,N3,N4,N5,G,K) :- combos(set(N1,N2,N3,N4,N5),combo(A1,A2),extras(A3,A4,A5)), crypto(A1,A2,A3,AG,Aex), crypto(A4,A5,AG,G,Bex), substitute(Aex,AG,Bex,K). 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(Q,O,Z)) :- substitute(New,Old,X,Q). substitute(New,Old,ex(X,O,Z),ex(X,O,Q)) :- substitute(New,Old,Z,Q). %init :- establishCryptoProblemParameters.