%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% FILE: dcg_interpreter.pro %%%%
%%%% LINE: A DCG for Cryptos %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% BEGIN Import Files
:- consult("gv2.pro").
:- consult("io.pro").
:- consult("combosets.pro").
:- consult("crypto.pro").
%%% END Import Files
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Begin Crypto Context Free Grammar(DCG)
sentence(problem(numbers(N1,N2,N3,N4,N5),goal(G))) -->
simpleproblemcommand(problem(numbers(N1,N2,N3,N4,N5),goal(G))),[.].
sentence(problem(numbers(N1,N2,N3,N4,N5),goal(G))) -->
simpleproblemquery(problem(numbers(N1,N2,N3,N4,N5),goal(G))),[?].
sentence(problem(numbers(N1,N2,N3,N4,N5),goal(G))) -->
randomproblemcommand(problem(numbers(N1,N2,N3,N4,N5),goal(G))),[.].
simpleproblemcommand(problem(numbers(N1,N2,N3,N4,N5),goal(G))) -->
[use],numberzzz(N1,N2,N3,N4,N5),[to],[make],goal(G),
{addCryptoProblemToKB(N1,N2,N3,N4,N5,G)}.
simpleproblemcommand(problem(numbers(N1,N2,N3,N4,N5),goal(G))) -->
[write],goal(G),[in],[terms],[of],numberzzz(N1,N2,N3,N4,N5),
{addCryptoProblemToKB(N1,N2,N3,N4,N5,G)}.
randomproblemcommand(problem(numbers(N1,N2,N3,N4,N5),goal(G))) -->
[use],[whatever],[to],[make],[whatever],
{generateRandomCryptoNumber(N1),generateRandomCryptoNumber(N2),
generateRandomCryptoNumber(N3),generateRandomCryptoNumber(N4),
generateRandomCryptoNumber(N5),generateRandomCryptoNumber(G),
addCryptoProblemToKB(N1,N2,N3,N4,N5,G)}.
simpleproblemquery(problem(numbers(N1,N2,N3,N4,N5),goal(G))) -->
[can],[you],[make],goal(G),separator,numberzzz(N1,N2,N3,N4,N5),
{addCryptoProblemToKB(N1,N2,N3,N4,N5,G)}.
separator --> [from].
separator --> [with].
goal(N) --> number(N).
numberzzz(N1,N2,N3,N4,N5) --> number(N1),[and],number(N2),[and],number(N3),[and],number(N4),[and],number(N5).
numberzzz(N1,N2,N3,N4,N5) --> number(N1),number(N2),number(N3),number(N4),[and],number(N5).
numberzzz(0,1,2,3,4) --> [the],[first],[five],[positive],[numbers].
numberzzz(0,1,2,3,4) --> [numbers],[zero],[through],[four].
numberzzz(1,2,3,4,5) --> [numbers],[one],[through],[five].
numberzzz(2,3,4,5,6) --> [numbers],[two],[through],[six].
numberzzz(3,4,5,6,7) --> [numbers],[three],[through],[seven].
numberzzz(4,5,6,7,8) --> [numbers],[four],[through],[eight].
numberzzz(5,6,7,8,9) --> [numbers],[five],[through],[nine].
numberzzz(1,3,5,7,9) --> [the],[odd],[numbers].
numberzzz(N,N,N,N,N) --> [five],pluralnumber(N).
numberzzz(N4,N4,N4,N4,N1) --> [four],pluralnumber(N4),[and],[one],number(N1).
numberzzz(N1,N4,N4,N4,N4) --> [one],number(N1),[and],[four],pluralnumber(N4).
numberzzz(N2,N2,N3,N3,N3) --> [two],pluralnumber(N2),[and],[three],pluralnumber(N3).
numberzzz(N3,N3,N3,N2,N2) --> [three],pluralnumber(N3),[and],[two],pluralnumber(N2).
numberzzz(N2,N2,N4,N4,N5) --> [two],pluralnumber(N2),[and],[two],pluralnumber(N4),[and],[one],number(N5).
numberzzz(N1,N2,N2,N4,N4) --> [one],number(N1),[and],[two],pluralnumber(N2),[and],[two],pluralnumber(N4).
numberzzz(N2,N2,N1,N3,N3) --> [two],pluralnumber(N2),[and],[one],number(N1),[and],[two],pluralnumber(N3).
number(0) --> [zero].
number(1) --> [one].
number(2) --> [two].
number(3) --> [three].
number(4) --> [four].
number(5) --> [five].
number(6) --> [six].
number(7) --> [seven].
number(8) --> [eight].
number(9) --> [nine].
pluralnumber(0) --> [zeros].
pluralnumber(1) --> [ones].
pluralnumber(2) --> [twos].
pluralnumber(3) --> [threes].
pluralnumber(4) --> [fours].
pluralnumber(5) --> [fives].
pluralnumber(6) --> [sixes].
pluralnumber(7) --> [sevens].
pluralnumber(8) --> [eights].
pluralnumber(9) --> [nines].
%%% END Crpto CFG
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% BEGIN Testing Parser
parser :-
read_sentence(S),
sentence(Problem,S,[]),
write(Problem),nl,
parser.
parser :-
write('Not a sentence ...'),nl,
parser.
%%%% END Testing Parser
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% BEGIN Interpreter
interpreter :-
read_sentence(S),
sentence(Problem,S,[]),
try_to_solve_exhaustively(Problem),
interpreter.
interpreter :-
write('Not a sentence ...'),nl,
interpreter.
%%%% END Interpreter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% BEGIN Exhaustive Problem Solver
try_to_solve_exhaustively(Problem) :-
Problem = problem(numbers(N1,N2,N3,N4,N5),goal(G)),
addCryptoProblemToKB(N1,N2,N3,N4,N5,G),
tryToSolveProblemDecompositionally,
solution(Solution),
addCryptoSolutionToKB(Solution),
displayResult(Solution),nl.
try_to_solve_exhaustively() :-
write('No solution to this one!'),nl.
tryToSolveProblemDecompositionally :-
problem(numbers(N1,N2,N3,N4,N5),goal(G)),
crypto(N1,N2,N3,N4,N5,G,Expression),
addCryptoSolutionToKB(Expression).
tryToSolveProblemDecompositionally.
%%%% END Exhaustive Problem Solver
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%