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)