1

我需要从字符串中删除一个字符。例如:

?- remove_char('abcde', 'c', X).
X = 'abde'

?- remove_char('abcdefgh', 'f', X).
X = 'abcdegh'

我正在寻找一种简洁的方法来实现这一点,但我没有成功。我是 Prolog 的新手,如果我不想将字符串转换为列表,我将很难处理它们。是否有内置功能,或者至少是一种简约的方式?

4

2 回答 2

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 实现相同的逻辑(用于“片段”提取)。

于 2013-11-01T23:25:36.873 回答
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 )
  .
于 2013-11-02T00:20:42.280 回答