从Prolog中的字符串中删除字符

时间:2013-11-01 22:30:38

标签: prolog

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

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

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

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

2 个答案:

答案 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 )
  .