1% Predicate to portray search using the davinci graph drawing tool
    2aleph_portray(search):-
    3        open('search.davinci',write,Stream),
    4        set_output(Stream),
    5        write_davinci_graph,
    6        close(Stream),
    7        set_output(user_output),
    8        concat([davinci,' ','search.davinci'],Cmd),
    9        execute(Cmd).
   10
   11
   12write_davinci_graph:-
   13	write('['), nl,
   14	write_davinci_graph(0),
   15	nl, write(']'), nl.
   16
   17write_davinci_graph(0):-
   18	!,
   19	get_children(0,First,Last),
   20	write_davinci_nodes(First,Last).
   21write_davinci_graph(Node):-
   22	get_node_attributes(Node,[Name,Type,Colour,Clause,Pos,Neg]),
   23	tab(4),
   24	write('l("'), write(Name), write('",'), nl,
   25	tab(8),
   26	write('n("'), write(Type), write('",'), nl,
   27	tab(12),
   28	write('[a("COLOR","'), write(Colour), write('"),'), nl,
   29	(Type = best ->
   30		tab(12),
   31		write('a("BORDER","double"),'), nl;
   32		true),
   33	tab(12),
   34	write('a("OBJECT","'),
   35	write_davinci_clause(Clause),
   36	write_davinci_pn(Pos,Neg),
   37	write('")],'), nl,
   38	get_children(Node,First,Last),
   39	write_davinci_links(Node,First,Last),
   40	nl, tab(8), write(')'), nl,
   41	tab(4),
   42	write(')'),
   43	(Last >= First -> write(','), nl; true),
   44	write_davinci_nodes(First,Last).
   45
   46
   47
   48write_davinci_nodes(F,L):- F > L, !.
   49write_davinci_nodes(Node,Last):-
   50	write_davinci_graph(Node),
   51	Node1 is Node + 1,
   52	(Node1 =< Last -> write(','), nl; true),
   53	write_davinci_nodes(Node1,Last).
   54	
   55
   56write_davinci_links(_,First,Last):-
   57	First > Last, !,
   58	tab(12),
   59	write('[]').
   60write_davinci_links(Parent,First,Last):-
   61	tab(12),
   62	write('['),
   63	write_davinci_link(Parent,First,Last),
   64	tab(12),
   65	write(']').
   66
   67write_davinci_link(_,F,L):- F > L, !.
   68write_davinci_link(P,F,L):-
   69	write('l("'), write(P), write('->'), write(F), write('",'), nl,
   70	tab(16),
   71	write('e("",[a("EDGEPATTERN","solid"),a("_DIR","normal")],'),
   72	write('r("'), write(F), write('")))'),
   73	F1 is F + 1,
   74	(F1 =< L -> write(','), nl, tab(12); true),
   75	write_davinci_link(P,F1,L).
   76
   77	
   78get_children(Parent,First,Last):-
   79	recorded(search,expansion(_,Parent,First,Last),_), !.
   80get_children(_,1,0).
   81
   82get_node_attributes(Node,[Node,Type,Colour,Clause,PC,NC]):-
   83	recorded(search,node(Node,Clause),_), 
   84	recorded(search,label(Node,[PC,NC|_]),_), 
   85	numbervars(Clause,0,_),
   86	(recorded(search,good(Node),_) ->
   87		(recorded(search,best(Node),_) -> Type = best; Type = good),
   88		Colour = green;
   89		(recorded(search,bad(Node),_) ->
   90			Type = bad,
   91			Colour = red;
   92			Type = normal,
   93			Colour = white)), !.
   94get_node_attributes(Node,[Node,pruned,red,Clause,na,na]):-
   95	recorded(search,node(Node,Clause),_), 
   96	numbervars(Clause,0,_), !.
   97get_node_attributes(Node,[Node,bad,red,pruned,na,na]).
   98
   99write_davinci_clause((H:-B)):-
  100	!,
  101	write_davinci_literal(H),
  102	write_davinci_conditional,
  103	write_davinci_lits(B),
  104	write('.').
  105write_davinci_clause(H):-
  106	write_davinci_literal(H),
  107	write('.').
  108
  109write_davinci_lits((A,B)):-
  110	!,
  111	write('\t'),
  112	write_davinci_literal(A),
  113	(setting(portray_literals,true) -> write(' and'); write(',')),
  114	write('\n'),
  115	write_davinci_lits(B).
  116write_davinci_lits(A):-
  117	write('\t'),
  118	write_davinci_literal(A).
  119
  120write_davinci_literal(L):-
  121	setting(portray_literals,true), 
  122	portray(L), !.
  123write_davinci_literal(L):-
  124	write(L).
  125
  126write_davinci_conditional:-
  127	setting(portray_literals,true),
  128	write(' if:\n'), !.
  129write_davinci_conditional:-
  130	write(' :-\n').
  131
  132write_davinci_pn(na,na):-
  133	!,
  134	write('\n\npruned').
  135write_davinci_pn(Pos,Neg):-
  136	write('\n\npos: '), write(Pos),
  137	write('\nneg: '), write(Neg)