sv_teste :-
    open("output.txt",write,Out),
    write(Out,'Age(Peter,30)'),
    write(Out,'Skin(Smith,Black).'),
    close(Out).

sc(NomeArq,LS,LP) :-
    open(NomeArq,write,Arq),
    sv_lista_elementos(Arq,LS,LP),
    close(Arq).   

sv_lista_elementos(_,[],_) :- !.
sv_lista_elementos(Arq,[S|RS],LP) :- 
    write(S), sn(S,SN), write(Arq,SN), sv_lista_propriedades(Arq,S,LP), write("\n"), write(Arq,"\n"), sv_lista_elementos(Arq,RS,LP).

sv_lista_propriedades(_,_,[]) :- !.
sv_lista_propriedades(Arq,S,[P|RP]) :-
   val(P,S,V), write(","), write(V), write(Arq,","), write(Arq,V), sv_lista_propriedades(Arq,S,RP).
   
sformat(Arq,S,V) :- 
   format(S,V), format(Arq,S,V).

% --------------------------------------------------------------
% salvar json lista de listas de propriedades dos elementos
% --------------------------------------------------------------

sjl(NomeArq,NomeObj,LS,LP) :-
    open(NomeArq,write,Arq),       %
    sformat(Arq,"~s = [\n",[NomeObj]),
    % format("~s = [\n",[NomeObj]),         %
    % format(Arq,"~s = [\n",[NomeObj]),     %
    sjl_lista_elementos(Arq,LS,LP),      %
    format("]",[NomeObj]),         %
    format(Arq,"]",[NomeObj]),     %
    close(Arq).          %

sjl_lista_elementos(_,[],_) :- !.
sjl_lista_elementos(Arq,[S|RS],LP) :- 
    sn(S,SN), sformat(Arq,'   ["~s"', [SN]), sjl_lista_propriedades(Arq,S,LP), sformat(Arq,'],\n', []), sjl_lista_elementos(Arq,RS,LP).

sjl_lista_propriedades(_,_,[]) :- !.
sjl_lista_propriedades(Arq,S,[P|RP]) :-
   val(P,S,V), write(',"'), write(V), write('"'), write(Arq,',"'), write(Arq,V), write(Arq,'"'), sjl_lista_propriedades(Arq,S,RP).

% ----------------------------------------------------------------------------
% salvar json lista de objetos com nome e valor de propriedades dos elementos
% ----------------------------------------------------------------------------

sjn(NomeArq,NomeObj,LS,LP) :-
    open(NomeArq,write,Arq),        %
    sformat(Arq,"~s = [\n",[NomeObj]),   %
    sjn_lista_elementos(Arq,LS,LP),      %
    sformat(Arq,"]",[NomeObj]),          %
    close(Arq).                          %

sjn_lista_elementos(_,[],_) :- !.
sjn_lista_elementos(Arq,[S|RS],LP) :- 
    sn(S,SN), sformat(Arq,'{sn:"~s"',[SN]), sjn_lista_propriedades(Arq,S,LP), write("},\n"), write(Arq,"},\n"), sjn_lista_elementos(Arq,RS,LP).

sjn_lista_propriedades(_,_,[]) :- !.
sjn_lista_propriedades(Arq,S,[P|RP]) :-
   val(P,S,V), sformat(Arq,',~s:"',[P]), write(V), write(Arq,V), sformat(Arq,'"',[P]), sjn_lista_propriedades(Arq,S,RP).