mll
mll

Reputation: 195

Prolog remove character spaces from atom for using term_to_atom

At some point of my program I have an atom formed by what previously were also atoms, and I want to remove the character spaces within it so that later I can use without any problem:

term_to_atom(Result, 'second2(second2),region(ºMediterranean Sea),months(no_value),third3(third3),recog(ºNew Type),distance(no_value)').

and obtain this

Result = (second2(second2), region(ºMediterraneanSea), months(no_value), third3(third3), recog(ºNewType), distance(no_value))

or also the original would work

Result = (second2(second2), region(ºMediterranean Sea), months(no_value), third3(third3), recog(ºNew Type), distance(no_value))

because if I don't delete those character spaces then term_to_atom will complain about it. How can I solve it?

Upvotes: 1

Views: 1968

Answers (1)

CapelliC
CapelliC

Reputation: 60024

You can use this procedure:

strip_spaces(S, NoSpaces) :-
   atom_codes(S, Cs), delete(Cs, 0' , X), atom_codes(NoSpaces, X).

but delete/3 is deprecated. Another possibility is

strip_spaces(S, NoSpaces) :-
    atomic_list_concat(L, ' ', S),
    atomic_list_concat(L, NoSpaces).

Either of these will 'eat' each space, but from your problem description, in comments you exchanged with gusbro, this doesn't seems to me the right way to go. Changing the literals seems at DB interface could ask for trouble later.

Parsing your input to a list, instead of a conjunction, can be done with DCGs:

:- [library(http/dcg_basics)].

parse_result(X, R) :-
    atom_codes(X, Cs),
    phrase(parse_list(R), Cs).
parse_list([T|Ts]) -->
    parse_term(T), (",", parse_list(Ts) ; {Ts=[]}).
parse_term(T) -->
    string(F), "(", string(Arg), ")",
    {atom_codes(Fa,F), atom_codes(Arga,Arg), T =.. [Fa,Arga]}.

Upvotes: 2

Related Questions