Prolog从atom中删除字符空间,以便使用术语_to_atom

Prolog从atom中删除字符空间,以便使用术语_to_atom,prolog,swi-prolog,Prolog,Swi Prolog,在我的程序的某个点上,我有一个原子,它由以前也是原子的东西组成,我想删除其中的字符空间,以便以后我可以毫无问题地使用: term_to_atom(结果,'second2(second2),地区(地中海),月(无_值),第三个月(第三个月),记录(新类型),距离(无_值)。 得到这个 Result=(second2(second2)、地区(地中海地区)、月份(无_值)、第三季度(第三季度)、记录(新类型)、距离(无_值)) 或者原版也可以 Result=(second2(second2)、地区(地

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

term_to_atom(结果,'second2(second2),地区(地中海),月(无_值),第三个月(第三个月),记录(新类型),距离(无_值)。

得到这个

Result=(second2(second2)、地区(地中海地区)、月份(无_值)、第三季度(第三季度)、记录(新类型)、距离(无_值))

或者原版也可以

Result=(second2(second2)、地区(地中海)、月份(无_值)、第三个月(第三个月)、记录(新类型)、距离(无_值))


因为如果我不删除那些字符空间,那么
term\u to\u atom
就会抱怨它。如何解决此问题?

您可以使用以下步骤:

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接口上更改文本可能会在以后遇到麻烦

可以使用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]}.

我认为你的问题在于
字符:
字符。这不是你的意思吗:
term_to_atom(Result,'second2(second2))、region('mediateralsea')、month(no_value)、third3(third3)、recog('newtype')、distance(no_value))。
这些
字符是故意存在的,它们被用作数据库的id,在这种情况下它们不是问题,因为无论有没有它们,术语“原子对原子”都会在空格字符中出现。我不能使用双引号解决方案,因为这不是我的程序收到的。它接收的正是上面提到的原子,还有其他值,如
region(º大西洋)
recog(ºOld Type)
。或者其他多个字符的例子。是的,正是我需要的,谢谢。我还使用字符<代码> <代码>做代码> Strang-CopAT(′′,区域,IDReg)。因为当第一个字符是大写字母时,TymithtoAuto原子将丢失区域的名称(它将把它看作一个变量),并且我以后需要这个名字。现在,在您的帮助下,一切都进展顺利:)