% ========================================================================== % $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)).