Prolog从atom中删除字符空间以使用term_to_atom

时间:2012-06-13 15:31:35

标签: prolog swi-prolog

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

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会抱怨它。我该如何解决?

1 个答案:

答案 0 :(得分: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]}.