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原子将丢失区域的名称(它将把它看作一个变量),并且我以后需要这个名字。现在,在您的帮助下,一切都进展顺利:)