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 に答える