% file: crypto_i.pro
% line: recognizing the crypto language

% imports

:- consult('io.pro').
%:- consult('gv.pro').
%:- consult('lp.pro').
:- consult('../crypto_xps/crypto.pro').

% DCG for crypto language
% ------------------------------------------------------------------------

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),{add_crypto_problem_to_KB(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),{add_crypto_problem_to_KB(N1,N2,N3,N4,N5,G)}.
randomproblemcommand(problem(numbers(N1,N2,N3,N4,N5),goal(G))) --> [use],[whatever],[to],[make],[whatever],{generate_random_crypto_number(N1),generate_random_crypto_number(N2),
  generate_random_crypto_number(N3),generate_random_crypto_number(N4),
  generate_random_crypto_number(N5),generate_random_crypto_number(G),
  add_crypto_problem_to_KB(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),{add_crypto_problem_to_KB(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(1,2,3,4,5) --> [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(Np,Np,Np,Np,Np) --> [five],pluralnumber(Np).
numberzzz(N1,Np,Np,Np,Np) --> [four],pluralnumber(Np),[and],[one],number(N1).
numberzzz(Np,Np,Np,Np,N1) --> [one],number(N1),[and],[four],pluralnumber(Np).
numberzzz(Np,Np,Np1,Np1,Np1) --> [two],pluralnumber(Np),[and],[three],pluralnumber(Np1).
numberzzz(Np1,Np1,Np,Np,Np) --> [three],pluralnumber(Np),[and],[two],pluralnumber(Np1).
numberzzz(Np,Np,Np1,Np1,N) --> [two],pluralnumber(Np),[and],[two],pluralnumber(Np1),[and],[one],number(N).
numberzzz(N,Np1,Np1,Np,Np) --> [one],number(N),[and],[two],pluralnumber(Np1),[and],[two],pluralnumber(Np).
numberzzz(Np,Np,N,Np1,Np1) --> [two],pluralnumber(Np),[and],[one],number(N),[and],[two],pluralnumber(Np1).
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].

% The recognizer
% --------------------------------------------------------

recognizer :-
  read_sentence(S),
  sentence(S,[]),
  recognizer.
recognizer :-
  write('Not a sentence ...'),nl,
  recognizer.

% Testing the augmented DCG -- the parser
% ---------------------------------------------------------------------------------

parser :-
  read_sentence(S),
  sentence(Problem,S,[]),
  write(Problem),nl,
  parser.

parser :-
  write('Not a sentence ...'),nl,
  parser.

% The interpreter
% ---------------------------------------------------------------------------------

interpreter :-
  read_sentence(S),
  sentence(Problem,S,[]),
  solve_without_echo(Problem),
  interpreter.

interpreter :-
  write('Not a sentence ...'), nl,
  interpreter.

% ---------------------------------------------------------------------------------
% CRYPTO PROBLEM SOLVER -- SOLVE A SPECIFIC PROBLEM, BUT WITHOUT THE ECHO

solve_without_echo(problem(numbers(N1,N2,N3,N4,N5),goal(G))) :-
  add_crypto_problem_to_KB(N1,N2,N3,N4,N5,G),
  solve_problem_decompositionally,
  display_solution.

