我需要从字符串中删除一个字符。例如:
?- remove_char('abcde', 'c', X).
X = 'abde'
?- remove_char('abcdefgh', 'f', X).
X = 'abcdegh'
我正在寻找一种简洁的方法来实现这一目标,但我没有成功。我是Prolog的新手,如果我不想将它们转换为列表,我很难处理字符串。是否有内置功能,或者至少是一种简约的方式?
答案 0 :(得分:2)
sub_atom / 5可以提供帮助,无论如何这里是另一种选择。
remove_char(S,C,X) :- atom_concat(L,R,S), atom_concat(C,W,R), atom_concat(L,W,X).
由于atom_concat已得到很好的实施,因此remove_char比其名称更为通用:
2 ?- remove_char(abcabcd,bc,X).
X = aabcd ;
X = abcad ;
false.
一个很好的练习是尝试使用sub_atom / 5实现相同的逻辑(用于'片段'提取)。
答案 1 :(得分:1)
您没有在代码中处理字符串:'abcde'
是一个原子。 "abcde"
是一个序言字符串(也就是字符列表)。但是,如果你想玩原子,这对我来说似乎很简洁:
remove_chars( X , C , Y ) :-
atom_chars( X , Xs ) ,
strip( Xs , C , Ys ) ,
atom_chars( Y , Ys )
.
strip( [] , _ , [] ) .
strip( [Y|Cs] , C , [Y|Ys] ) :- Y \= C , strip(Cs,C,Ys) .
strip( [Y|Cs] , C , Ys ) :- Y = C , strip(Cs,C,Ys) .
或者,使用内置的select/3
,更简洁:
remove_chars( X , C , Y ) :-
atom_chars( X , Xs ) ,
select( C, Xs , Ys ) ,
atom_chars( Y , Ys )
.