CFG/DCG Code 2 - CSC 366 Home Page - CSC 366 A14 Page - Demo 2

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% 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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%