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).

これらのいずれも各スペースを「食べる」でしょうが、あなたの問題の説明から、あなたがグスブロと交換したコメントでは、これは私には正しい方法ではないようです. 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 に答える