1

在我的程序的某个时刻,我有一个由以前也是原子的原子形成的原子,我想删除其中的字符空间,以便以后可以毫无问题地使用:

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

并获得这个

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

或者原版也可以

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

因为如果我不删除那些字符空间,那么term_to_atom就会抱怨它。我该如何解决?

4

1 回答 1

2

您可以使用此过程:

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

但 delete/3 已被弃用。另一种可能是

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

这些中的任何一个都会“吃掉”每个空间,但是根据您的问题描述,在您与 gusbro 交换的评论中,在我看来这不是正确的方法。更改文字似乎在 DB 界面可能会在以后遇到麻烦。

可以使用 DCG 将输入解析为列表,而不是连词:

:- [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]}.
于 2012-06-13T19:09:20.137 回答