sldnf.1.0.pl
sldnf.1.0.pl
—
text/x-perl,
6 kB (6152 bytes)
Contenuto del file
% TODO: Cut !
% stop when 1st solution found
% stop negation when 1st solution found
% stop at a given depth (to avoid infinite loops)
% CLP? Minimize?s
:- dynamic begin_resolvent/1, end_resolvent/1, begin_binding/1, end_binding/1.
draw_goal(G,FileName):-
open(FileName,write,File),
term_length(G,Length),
conv_sq_list(G,GSq),
(draw(GSq,File,Length) ; true),
close(File).
% draw(+Resolvent,+Stream,MaxLenghtOfResolvent)
draw([],F,Longest):-
NumSpace is Longest//2,
print_n_spaces(F,NumSpace),
write(F,"true\n"),
print_n_spaces(F,NumSpace),
fail.
draw([not G|R],F,LongestIn):-
write(F,"\\begin{bundle}{"),
print_resolvent(F,[not G|R]),
writeln(F,"}\n\\chunk{"),
% NOTA: forse in questo caso non conviene metterlo, cosi` il box diventa giusto.
% pero` non si assicura che sia giusto il figlio del box...
% Compute the maximum length
term_length([not G|R],ResLen), Length is max(LongestIn,ResLen),
write(F,"\\begin{bundle}{\\framebox{"),
(draw([G],F,0) ; true),
write(F,"}}"),
(vanilla(G)
-> print_fail(F,ResLen)
; write(F,"\\chunk{"),
(draw(R,F,Length); true), write(F,"}")
),
writeln(F,"\\end{bundle}}\\end{bundle}"),
fail.
draw([G|R],F,LongestIn):-
not(G = not(_)),
built_in(G),
term_length([G|R],ResLen), Length is max(LongestIn,ResLen),
write(F,"\\begin{bundle}{"),
print_resolvent(F,[G|R]),
writeln(F,"}"),
(print_builtin_children(G,R,F,Length); writeln(F,"\\end{bundle}")),
fail.
draw([G|R],F,LongestIn):-
not(G = not(_)),
not(built_in(G)),
term_length([G|R],ResLen), Length is max(LongestIn,ResLen),
write(F,"\\begin{bundle}{"),
print_resolvent(F,[G|R]),
writeln(F,"}"),
(print_children(G,R,F,Length); writeln(F,"\\end{bundle}")),
fail.
print_children(G,R,F,Length):-
term_variables(G,Vars),
vars_names(Vars,VarNames),
count_children(G,NumChildren),
(NumChildren = 1 -> Len = Length ; Len=0),
clausola(G,B),
write(F,"\\chunk"),
print_binding(F,VarNames),
write(F,"{"),
append(B,R,Ris),
(draw(Ris,F,Len) ; write(F,"}"), fail).
print_children(G,_,F,Length):-
not(clausola(G,_)),
print_fail(F,Length),
%write(F,"\\chunk{fail}"),
fail.
print_builtin_children(G,R,F,Length):-
term_variables(G,Vars),
vars_names(Vars,VarNames),
findall(G,call(G),L),length(L,NumChildren),
(NumChildren = 1 -> Len = Length ; Len=0),
call(G),
write(F,"\\chunk"),
print_binding(F,VarNames),
write(F,"{"),
(draw(R,F,Len) ; write(F,"}"), fail).
print_builtin_children(G,_,F,Length):-
not(call(G)),
print_fail(F,Length),
%write(F,"\\chunk{fail}"),
fail.
count_children(G,NumChildren):-
findall(B,clausola(G,B),L),
length(L,NumChildren).
vars_names([],[]).
vars_names([X|T],[b(X,N)|TN]):-
var_name(X,N),
vars_names(T,TN).
%print_binding(F,X):-
% write(F,"[$"),
% writeln(F,X),
% write(F,"$]").
var_name(X,N):-
open(string(""),write,Stream),
write(Stream,X),
get_stream_info(Stream, name, N),
close(Stream).
print_binding(F,X):-
write(F,"["),
(begin_binding(S) -> write(F,S); true),
print_binding1(F,X),
(end_binding(Send) -> write(F,Send) ; true),
write(F,"]").
print_binding1(_F,[]).
print_binding1(F,[b(A,B)|T]):-
var_name(A,Name),
Name = B, !,
% Avoid writing "X=X" as a binding...
print_binding1(F,T).
print_binding1(F,[b(A,B)|T]):-
write(F,B), write(F,"/"), write_term_no_sqbrack(F,A),
(T=[] -> true
; write(F,", "), print_binding1(F,T)).
% Writes a term replacing the symbols "[" and "]"
% with \lbrack and \rbrack, because you cannot use "["
% inside a label of an arc.
write_term_no_sqbrack(F,A):-
var(A), !, write(F,A).
write_term_no_sqbrack(F,[]):- !,
write(F,"\\lbrack\\rbrack ").
write_term_no_sqbrack(F,[H|T]):- !,
write(F,"\\lbrack "),
print_list_no_sqbrack(F,[H|T]),
write(F,"\\rbrack ").
write_term_no_sqbrack(F,T):-
T =.. [Fun], !,
write(F,Fun).
write_term_no_sqbrack(F,T):- !,
T =.. [Fun|Arg],
write(F,Fun),
write(F,"("),
print_list_no_sqbrack(F,Arg),
write(F,")").
% If the list is a difference list, we also have the
% case in which the rest is a variable.
print_list_no_sqbrack(F,V):-
var(V), !,
write_term_no_sqbrack(F,V).
print_list_no_sqbrack(F,[H|T]):-
var(T),!,
write_term_no_sqbrack(F,H),
write(F,"$|$"),
write_term_no_sqbrack(F,T).
print_list_no_sqbrack(F,[H]):-
write_term_no_sqbrack(F,H).
print_list_no_sqbrack(F,[H1,H2|T]):-
write_term_no_sqbrack(F,H1),write(F,","),
print_list_no_sqbrack(F,[H2|T]).
print_resolvent(F,X):-
(begin_resolvent(S) -> write(F,S); true),
print_list(F,X),
(end_resolvent(Send) -> write(F,Send) ; true).
print_list(F,[H]):- !,
write_term_no_sqbrack(F,H).
print_list(F,[H1,H2|T]):-
write_term_no_sqbrack(F,H1),write(F,","),
print_list(F,[H2|T]).
print_fail(F,Longest):-
NumSpace is Longest//2,
write(F,"\\chunk{"),
print_n_spaces(F,NumSpace),
write(F,"false\n"),
print_n_spaces(F,NumSpace),
write(F,"}").
print_n_spaces(_,0):- !.
print_n_spaces(F,N):-
number(N), N>0,
write(F,"~"),
N1 is N-1,
print_n_spaces(F,N1).
vanilla([]).
vanilla([A|B]) :- !, vanilla(A), vanilla(B).
vanilla(not X) :- !,
(vanilla(X) -> fail ; true).
%vanilla(X) :-
% built_in(X), call(X).
vanilla(X) :-
clausola(X,Body),
vanilla(Body).
term_length(G,Length):-
term_string(G,S), string_length(S,Length).
clausola(H,BSq):-
functor(H,F,A), current_predicate(F/A),
clause(H,B),
conv_sq_list(B,BSq).
clausola(H,BSq):-
my_clause(H,BSq).
conv_sq_list((A,B),[A|Bsq]):- !,
conv_sq_list(B,Bsq).
conv_sq_list(true,[]):- !.
conv_sq_list(X,[X]).
built_in(G):-
functor(G,F,A),
current_built_in(F/A).