174 lines
3.9 KiB
Perl
174 lines
3.9 KiB
Perl
|
/* $Id: chr_messages.pl,v 1.1 2005-10-28 17:41:30 vsc Exp $
|
||
|
|
||
|
Part of CHR (Constraint Handling Rules)
|
||
|
|
||
|
Author: Jan Wielemaker and Tom Schrijvers
|
||
|
E-mail: Tom.Schrijvers@cs.kuleuven.ac.be
|
||
|
WWW: http://www.swi-prolog.org
|
||
|
Copyright (C): 2003-2004, K.U. Leuven
|
||
|
|
||
|
This program is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU General Public License
|
||
|
as published by the Free Software Foundation; either version 2
|
||
|
of the License, or (at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU Lesser General Public
|
||
|
License along with this library; if not, write to the Free Software
|
||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
|
||
|
As a special exception, if you link this library with other files,
|
||
|
compiled with a Free Software compiler, to produce an executable, this
|
||
|
library does not by itself cause the resulting executable to be covered
|
||
|
by the GNU General Public License. This exception does not however
|
||
|
invalidate any other reasons why the executable file might be covered by
|
||
|
the GNU General Public License.
|
||
|
*/
|
||
|
|
||
|
:- module(chr_messages,
|
||
|
[ chr_message/3 % +CHR Message, Out, Rest
|
||
|
]).
|
||
|
:- use_module(chr(chr_runtime)).
|
||
|
|
||
|
:- discontiguous
|
||
|
chr_message/3.
|
||
|
|
||
|
% compiler messages
|
||
|
|
||
|
chr_message(compilation_failed(From)) -->
|
||
|
[ 'CHR Failed to compile ~w'-[From] ].
|
||
|
|
||
|
% debug messages
|
||
|
|
||
|
chr_message(prompt) -->
|
||
|
[ at_same_line, ' ? ', flush ].
|
||
|
chr_message(command(Command)) -->
|
||
|
[ at_same_line, '[~w]'-[Command] ].
|
||
|
chr_message(invalid_command) -->
|
||
|
[ nl, 'CHR: Not a valid debug option. Use ? for help.' ].
|
||
|
chr_message(debug_options) -->
|
||
|
{ bagof(Ls-Cmd,
|
||
|
bagof(L, 'chr debug command'(L, Cmd), Ls),
|
||
|
Lines)
|
||
|
},
|
||
|
[ 'CHR Debugger commands:', nl, nl ],
|
||
|
debug_commands(Lines),
|
||
|
[ nl ].
|
||
|
|
||
|
debug_commands([]) -->
|
||
|
[].
|
||
|
debug_commands([Ls-Cmd|T]) -->
|
||
|
[ '\t' ], chars(Ls), [ '~t~28|~w'-[Cmd], nl ],
|
||
|
debug_commands(T).
|
||
|
|
||
|
chars([C]) --> !,
|
||
|
char(C).
|
||
|
chars([C|T]) -->
|
||
|
char(C), [', '],
|
||
|
chars(T).
|
||
|
|
||
|
char(' ') --> !, ['<space>'].
|
||
|
char('\r') --> !, ['<cr>'].
|
||
|
char(end_of_file) --> !, ['EOF'].
|
||
|
char(C) --> [C].
|
||
|
|
||
|
|
||
|
chr_message(ancestors(History, Depth)) -->
|
||
|
[ 'CHR Ancestors:', nl ],
|
||
|
ancestors(History, Depth).
|
||
|
|
||
|
ancestors([], _) -->
|
||
|
[].
|
||
|
ancestors([Event|Events], Depth) -->
|
||
|
[ '\t' ], event(Event, Depth), [ nl ],
|
||
|
{ NDepth is Depth - 1
|
||
|
},
|
||
|
ancestors(Events, NDepth).
|
||
|
|
||
|
|
||
|
% debugging ports
|
||
|
|
||
|
chr_message(event(Port, Depth)) -->
|
||
|
[ 'CHR: ' ],
|
||
|
event(Port, Depth),
|
||
|
[ flush ]. % do not emit a newline
|
||
|
|
||
|
event(Port, Depth) -->
|
||
|
depth(Depth),
|
||
|
port(Port).
|
||
|
event(apply(H1,H2,G,B), Depth) -->
|
||
|
depth(Depth),
|
||
|
[ 'Apply: ' ],
|
||
|
rule(H1,H2,G,B).
|
||
|
event(try(H1,H2,G,B), Depth) -->
|
||
|
depth(Depth),
|
||
|
[ 'Try: ' ],
|
||
|
rule(H1,H2,G,B).
|
||
|
event(insert(#(_,Susp)), Depth) -->
|
||
|
depth(Depth),
|
||
|
[ 'Insert: ' ],
|
||
|
head(Susp).
|
||
|
|
||
|
port(call(Susp)) -->
|
||
|
[ 'Call: ' ],
|
||
|
head(Susp).
|
||
|
port(wake(Susp)) -->
|
||
|
[ 'Wake: ' ],
|
||
|
head(Susp).
|
||
|
port(exit(Susp)) -->
|
||
|
[ 'Exit: ' ],
|
||
|
head(Susp).
|
||
|
port(fail(Susp)) -->
|
||
|
[ 'Fail: ' ],
|
||
|
head(Susp).
|
||
|
port(redo(Susp)) -->
|
||
|
[ 'Redo: ' ],
|
||
|
head(Susp).
|
||
|
port(remove(Susp)) -->
|
||
|
[ 'Remove: ' ],
|
||
|
head(Susp).
|
||
|
|
||
|
|
||
|
depth(Depth) -->
|
||
|
[ '~t(~D)~10| '-[Depth] ].
|
||
|
|
||
|
head(Susp) -->
|
||
|
{ Susp =.. [_,ID,_,_,_,_,Goal|_Args]
|
||
|
},
|
||
|
[ '~w # <~w>'-[Goal, ID] ].
|
||
|
|
||
|
heads([H]) --> !,
|
||
|
head(H).
|
||
|
heads([H|T]) -->
|
||
|
head(H),
|
||
|
[ ', ' ],
|
||
|
heads(T).
|
||
|
|
||
|
|
||
|
% rule(H1, H2, G, B)
|
||
|
%
|
||
|
% Produce text for the CHR rule "H1 \ H2 [<=]=> G | B"
|
||
|
|
||
|
rule(H1, H2, G, B) -->
|
||
|
rule_head(H1, H2),
|
||
|
rule_body(G, B).
|
||
|
|
||
|
rule_head([], H2) --> !,
|
||
|
heads(H2),
|
||
|
[ ' ==> ' ].
|
||
|
rule_head(H1, []) --> !,
|
||
|
heads(H1),
|
||
|
[ ' <=> ' ].
|
||
|
rule_head(H1, H2) -->
|
||
|
heads(H1), [ ' \\ ' ], heads(H2).
|
||
|
|
||
|
|
||
|
rule_body(true, B) --> !,
|
||
|
[ '~w.'-[B] ].
|
||
|
rule_body(G, B) -->
|
||
|
[ '~w | ~w.'-[G, B] ].
|