我需要从字符串中删除一个字符。例如:
?- remove_char('abcde', 'c', X).
X = 'abde'
?- remove_char('abcdefgh', 'f', X).
X = 'abcdegh'
我正在寻找一种简洁的方法来实现这一点,但我没有成功。我是 Prolog 的新手,如果我不想将字符串转换为列表,我将很难处理它们。是否有内置功能,或者至少是一种简约的方式?
我需要从字符串中删除一个字符。例如:
?- remove_char('abcde', 'c', X).
X = 'abde'
?- remove_char('abcdefgh', 'f', X).
X = 'abcdegh'
我正在寻找一种简洁的方法来实现这一点,但我没有成功。我是 Prolog 的新手,如果我不想将字符串转换为列表,我将很难处理它们。是否有内置功能,或者至少是一种简约的方式?
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 实现相同的逻辑(用于“片段”提取)。
您没有在代码中处理字符串:'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 )
.