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

在Prolog中从字符串中删除字符,prolog,Prolog,我需要从字符串中删除一个字符。例如: ?- remove_char('abcde', 'c', X). X = 'abde' ?- remove_char('abcdefgh', 'f', X). X = 'abcdegh' 我正在寻找一种简洁的方法来实现这一点,但我没有成功。我是Prolog新手,如果我不想将字符串转换为列表,我很难处理字符串。是否有一个内置的函数,或者至少是一种节省的方法?sub_atom/5可能会有所帮助,无论如何,这里有一个替代方法 remove_char(S,C,X

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

?- 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).
由于实现良好,因此删除_char它比其名称所显示的更通用:

2 ?- remove_char(abcabcd,bc,X).
X = aabcd ;
X = abcad ;
false.

一个很好的练习是尝试使用sub_atom/5实现相同的逻辑(用于“片段”提取)。

您没有在代码中处理字符串:
'abcde'
是一个atom<代码>“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 )
  .

脱衣舞/3似乎没用,为什么不选择/3呢?如果你想学习prolog,滚动你自己的有助于理解。作为替代,我不知道它叫“原子”。谢谢你指出这一点!你的代码在我看来像巫术,但我很高兴它能起作用。尽管我知道atom_concat/3谓词,但我并不真正理解它为什么会这样做。谢谢你的回复!