% ==========================================================================
% $Id: meta.pl,v 1.1 2014/02/21 02:39:11 jlang Exp $
% CSI2120 example Code for lecture 9
% ==========================================================================
% (C)opyright:
%
%   Jochen Lang
%   EECS, University of Ottawa
%   800 King Edward Ave.
%   Ottawa, On., K1N 6N5
%   Canada. 
%   http://www.eecs.uottawa.ca/~jlang
% 
% Creator: jlang (Jochen Lang) based on examples by R. Laganiere
% Email:   jlang@eecs.uottawa.ca
% ==========================================================================
% $Log: meta.pl,v $
% Revision 1.1  2014/02/21 02:39:11  jlang
% Added meta interpreter example.
%
% ==========================================================================
builtIn(G) :- 
	predicate_property(G, built_in),!.
builtIn(G) :- 
  predicate_property(G, interpreted),!. 
  
% Add rules to database once
solve((Head :- Body)):- !,	
	assertz((Head :- Body)).
solve(true) :- !. % Simple facts
solve((G, Gs)):- !,solve(G),	% Subgoals
	solve(Gs).
solve(G):- builtIn(G),	% Built-ins and existing facts
	call(G).
% Proofing the body proves the goal
solve(F(G)):- clause(F(G), Body),	
	solve(Body).
  
do :- nl,
  write('query: '),
	read(Q),
  Q \= stop,
  do1(Q). % interpreter goal do1
do. % stop; above fails because Q == stop 

do1(Q) :- solve(Q),
	write('yes: '),
	writeln(Q),
	write('OK? (; or anything else) '),
	get_code_line(Ans), 
  Ans =\= 59,
	% if Ans ';', back to solve(Q)
	!,
	do. % back to entry loop
% first do1 goal failed, go back to entry loop
do1(_) :- writeln(no),
	do. 

% get_code of first char and eat the rest to CR
get_code_line(X) :- get_code(X),!,
  ((X==10,!);get_code_line(Y)).
